2016-09-29 111 views
2

在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

回答

1

第一個引用只適用於接收緩衝區,真正的原因是如果它大於64k,在連接握手期間可以協商一個窗口縮放。答案的確是將它設置在偵聽套接字上,從它將由所有可接受的套接字繼承的地方設置,並且不是,它不是文件狀態標誌。