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



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

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

在单独的连接上,套接字缓冲区大小必须在listen(2)或connect(2)调用之前设置,以便使其生效。参见socket(7)获取更多信息。

这是有意义的,因为缓冲区可能是在创建时分配的,因此我将不得不依靠侦听套接字的继承语义来设置它的缓冲区大小,除了手册页(也不是套接字)没有提到继承,实际上声明:

在Linux上,accept()返回的新套接字不会从侦听套接字继承文件状态标志,如O_NONBLOCK和O_ASYNC。这种行为不同于规范的BSD套接字实现。可移植程序不应该依赖于文件状态标志的继承或非继承,并且总是在accept()

返回的套接字上显式设置所有必需的标志。

目前尚不清楚"文件状态标志"指的是什么,以及它是否包含套接字选项,而在阅读了一些相关的stackoverflow问题后,我一点也不知道。

第一个报价只适用于接收缓冲区,真正的原因是,如果窗口规模>= 64k,则可以在连接握手期间协商窗口规模。答案确实是在侦听套接字上设置它,从那里它将被所有接受的套接字继承,不,它不是一个文件状态标志。

相关内容

最新更新