由前兩篇博客知道,通過SO_SNDBUF與SO_RCVBUF可以設置TCP套接字的發送緩沖區和接收緩沖區的大小。
當設置TCP套接字接收緩沖區的大小時,函數調用的順序很重要。這是因為TCP的窗口規模選項是在建立連接時用SYN分節與對端互換得到的。
對於客戶, 這意味着SO_RCVBUF選項必須在調用connect之前設置;
對於服務器,這意味着該選項必須在調用listen之前給監聽套接字設置。
給已連接套接字設置該選項對於可能存在的窗口規模選項沒有任何影響,因為accept直到TCP的三次握手完成才會創建並返回已連接套接字。這就是必須給監聽套接字設置本選項的原因。套接字緩沖區的大小總是由新創建的已連接套接字從監聽套接字繼承而來。(《unix網絡編程卷一:P163》)
由上面的論述以及上一篇博客的結果可知:
在ROS端,SetSockOpt函數要在connect函數之前調用,緩沖區大小在【 默認85.3,256KB左右 ,8MB 及以上】這三個區間之間選擇;
在FADC發送端,SetSockOpt函數要在listen函數之前調用, 將緩沖區大小設置為8MB, 16MB 及以上 。
1. 不設置接收端緩沖區大小,只設置發送端緩沖區大小時。
2. 接收緩沖區設置為256KB,發送端緩沖區大小在8MB以上時。
3. 接收緩沖區設置為8MB以上,發送端緩沖區大小在8MB以上。
設置接收緩沖區等於發送緩沖區時:
設置接收端緩沖區為8MB時:
設置接收緩沖區為64MB時:
接收端緩沖區為128MB時:
接收端緩沖區為256MB時:
將接收端緩沖區設置為32MB時:
將接收端緩沖區大小設置為16MB時:
但是這些測試曲線為啥總是不穩定呢?帶寬有時大,有時小,為什么啊?取平均值來說明帶寬的大小。