Udp数据发送最大长度问题讨论

Udp数据发送最大长度问题讨论

1. 问题描述

在使用udp进行编程时,遇到这样一个问题:利用Udp进行发送视频数据,会出现发送失败的情况,具体现象如下:

1.1 widows下打印相关的错误输出:

func UdpClient::Send line 114 sendto err errno is 10040

通过查阅相关文档可知具体的错误原因:

WSAEMSGSIZE
10040 (0x2738)
A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.

10040 一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。

1.2 Linux下打印相关的错误输出:

func Send line 102 sendto err errno is 90 Message too long

#define EMSGSIZE 90 /* Message too long */

2. 问题追踪

编写UDP测试程序,从出现问题的数据长度依次进行递减直到 udp sendto能发送成功,
代码片段如下:

#define UDP_DATA_MAX_LEN    65535
unsigned char test[UDP_DATA_MAX_LEN] = fly in coding udp test";
while(1)
{
	if(UdpClientTest.Send(test,UDP_DATA_MAX_LEN - i) < 0)
	{
		i++;
		continue;    
	}
	else
	{
		printf("i %d \n",i);
	}
}

window下运行如下:

func UdpClient::Send line 114 sendto err errno is 10040
i 28

Linux下运行如下:

func Send line 102 sendto err errno is 90 Message too long 
i 28 

通过定位可以发现无论在windows下还是在Linux下,udp能发送的最大长度是 (65535 - 28)

3. udp数据包分析

UDP数据报封装成一份IP数据报的格式如下图
Udp数据发送最大长度问题讨论_第1张图片

IP首部
Udp数据发送最大长度问题讨论_第2张图片
udp首部
Udp数据发送最大长度问题讨论_第3张图片

通过上述几张图就可以知道为什么是 65535 -28 了

你可能感兴趣的:(Udp数据发送最大长度问题讨论)