接受的套接字的设置缓冲区大小

接受的套接字的设置缓冲区大小

问题描述:

在Linux下设置accept()'套接字的缓冲区大小(即,SO_RCVBUF,SO_SNDBUF)的正确方法是什么?接受的套接字的设置缓冲区大小

答案显然是调用新创建的套接字上setsockopt的(),但是TCP手册页指出:

在单个连接,套接字缓冲区大小之前,必须先在听(2集)或连接(2)呼叫以使其生效。有关更多信息,请参阅套接字(7)。

这是有道理的作为缓冲很可能在创建时分配,并为此我会通过设置它的缓冲区大小,但该名男子页依靠监听套接字的继承语义(也即插座),使任何提及继承和实际状态:

在Linux上,由accept()返回的新套接字不会从监听套接字继承文件状态标志,如O_NONBLOCK和O_ASYNC。这种行为不同于规范的BSD套接字实现。可移植程序不应该依赖的文件状态标志继承或noninheritance始终明确设置插座上的所有必需的标志从返回接受()

目前还不清楚是什么“文件状态标志”指的是和它是否是包括套接字选项,并阅读a few related stackoverflow questions我不明智。

+0

我不认为“标志”包括套接字缓冲区大小。无论如何,你真正需要做的就是测试它。为此,您可以运行'ss -aie'来查看缓冲区大小以及更多信息 - 用于侦听套接字和接受的套接字。 –

+0

@JohnZwinck不,我不会这么认为,但这是对我能找到的套接字继承细节的最接近的参考。 – Emjayen

+0

'不清楚'文件状态标志'指的是什么'非常清楚:accept()系统调用实际上分配(创建)一个文件描述符,该文件描述符从listen()套接字中继承(某些)属性。大多数继承是指IP堆栈(首先,至少:启动了所有这些事件),其中一些不是。 – wildplasser

第一个引用只适用于接收缓冲区,真正的原因是如果它大于64k,在连接握手期间可以协商一个窗口缩放。答案的确是将它设置在侦听套接字上,从它将由所有可接受的套接字继承的地方设置,并且不是,它不是文件状态标志。