簡體   English   中英

設置接受套接字的緩沖區大小

[英]Setting buffer size of accepted sockets

在 Linux 下設置 accept() 套接字的緩沖區(即 SO_RCVBUF、SO_SNDBUF)大小的正確方法是什么?

顯而易見的答案是在新創建的套接字上調用 setsockopt(),但是 tcp 手冊頁指出:

在單個連接上,必須在 listen(2) 或 connect(2) 調用之前設置套接字緩沖區大小才能使其生效。 有關更多信息,請參閱 socket(7)。

這是有道理的,因為緩沖區可能是在創建時分配的,因此我必須通過設置緩沖區大小來依賴偵聽套接字的繼承語義,除了手冊頁(或套接字的手冊頁)沒有提到繼承,實際上狀態:

在 Linux 上,accept() 返回的新套接字不會從偵聽套接字繼承文件狀態標志,例如 O_NONBLOCK 和 O_ASYNC。 此行為不同於規范的 BSD 套接字實現。 可移植程序不應依賴於文件狀態標志的繼承或非繼承,並且始終在從 accept() 返回的套接字上顯式設置所有必需的標志

目前尚不清楚“文件狀態標志”指的是什么以及它是否包含套接字選項,雖然閱讀了一些相關的 stackoverflow 問題,但我並不聰明。

第一個引用僅適用於接收緩沖區,真正的原因是如果> = 64k,則可以在連接握手期間協商窗口比例。 答案確實是將它設置在偵聽套接字上,從那里它將被所有接受的套接字繼承,不,它不是文件狀態標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM