首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

linux上UDP单次发送大小限制是多少

2013-01-06 
linux下UDP单次发送大小限制是多少?我的理解是,只要不超过发送缓冲区设的大小,就可以一次sendto出去,然后

linux下UDP单次发送大小限制是多少?
我的理解是,只要不超过发送缓冲区设的大小,就可以一次sendto出去,然后协议负责拆包组包.

但今天实际代码中,单次只能发送最大65507字节,即便是我设置了发送缓冲区的大小为6M,并且函数返回0,也只能最多发送65507字节.

简略代码如下:
sockThis = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockThis == INVALID_SOCKET)
{
  printf("socket sockThis error!\n");
  break;
}

valueTemp = MAX_IMG_FRAMESIZE + 100;//MAX_IMG_FRAMESIZE = 1600*1200*3
ret = setsockopt(sockThis, SOL_SOCKET, SO_SNDBUF, &valueTemp, sizeof(valueTemp));
if (ret != 0)
{
  printf("setsockopt SO_SNDBUF error! %d", errno);
}
valueTemp = 1;
ret = setsockopt(sockThis, SOL_SOCKET, SO_REUSEADDR, &valueTemp, sizeof(valueTemp));
if (ret != 0)
{
  printf("setsockopt SO_REUSEADDR error! %d", errno);
}

memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8881);
if (bind(sockThis, (struct sockaddr*)&addr, sizeof(addr)) == -1)
{
  printf("bind sockThis error!\n");
  break;
}

addr.sin_addr.s_addr = m_TargetAddr;
sendto(sockThis, pData, frameSize, 0, (struct sockaddr*)&addr, sizeof(addr));

请大家指点一下!
[解决办法]
就是64K嘛。
由UDP协议决定。UDP协议的消息格式里头,长度字段只有两个字节,16位,可以表示的就是2^16 = 64K。所以一个UDP大小不能超过65535,不然包大小表示不了。。。

不过你用UDP实际中是不应该发那么大的包的,包大了 拆包之后容易丢包。包大小要适中。
一般以下层的最大包大小为限。避免下层的拆包。


- 千里孤行

热点排行