关于socket的发送缓冲区网上有诸多的讨论,这里个人小结一下,希望对以后有些帮助。首先,看下面一段代码,
//设定socket参数
#define dfUdpRcvCacheSize 256*1024 //256//接收缓冲区大小(字节)
int optval,optlen = sizeof(int);
optval=dfUdpRcvCacheSize; //设置读缓冲区
err=setsockopt(iSock,SOL_SOCKET,SO_RCVBUF,(char*)&optval,optlen);
optval=dfUdpSndCacheSize; //设置读缓冲区
err=setsockopt(iSock,SOL_SOCKET,SO_SNDBUF,(char*)&optval,optlen);
上面的代码无需解释,很多人应该都知道是在win32下面用来设置SOCKET接收发送缓冲区的,先不讨论上面的代码有没问题。既然提供了这样的API可以对缓冲区进行设置,那么究竟对缓冲区的设置是否有一个最大值的限制呢?先来看下网上各大技术论坛对该问题的讨论:
”只要是IP包就是65535字节, 也就是64K
这是由IP数据报的结构决定的
IP首部有个表示IP数据报总长度的16位字节, 其最大值表示为FFFF
因此最大值为65535
此数值不是纯粹的数据净负荷,而是包含了IP首部信息
而IP首部是20字节, UDP首部是8字节
因此UDP数据部分是65535-20-8=65507 ”
显然,该段评论的论据本身是没错的,本人也专门翻了T