由前两篇博客知道,通过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时:
但是这些测试曲线为啥总是不稳定呢?带宽有时大,有时小,为什么啊?取平均值来说明带宽的大小。