1. 背景
在不同电脑的Windows系统中,使用同一个服务程序和客户端程序(TCP协议)进行测试,在部分电脑(win7)出现Send 和Recv大量数据,有时会出现Send和Recv一个数据包耗时1~2s的情况。
2. 原因
最终发现是不同的电脑带宽不一样,导致Recv的速率不一样,而对于TCP协议,若内核中的Socket Recv缓冲区满,而数据没有及时被应用读取走,此时服务程序Send一个数据包的耗时就会加长(因为一直在重发数据包)。这种问题可以通过尝试修改内核中的Socket Recv缓冲区大小来解决该问题,默认Send和Recv缓冲区大小为8K。
3.SO_SNDBUF & SO_RCVBUF
2.1基本说明
SO_SNDBUF
Sets send buffer size. This option takes an int value. (it is 8K by default).
SO_RCVBUF
Sets receive buffer size. This option takes an int value.
每个套接口都有一个发送缓冲区和一个接收缓冲区,使用SO_SNDBUF & SO_RCVBUF可以改变缺省缓冲区大小。
对于客户端,SO_RCVBUF选项须在connect之前设置.
对于服务器,SO_RCVBUF选项须在listen前设置.
2.2 使用setsockopt或getsockopt进行缓冲区大小设置或大小获取