最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个udp sendto函数上,我发现:当消息体的长度过长时,就必然报错。 于
最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个udp sendto函数上,我发现:当消息体的长度过长时,就必然报错。
于是,我验证了这个问题,把一个概率问题变为一个必现问题,也算是小小的进步,也更好定位问题了。虽然说是被 udp sendto 函数所坑,但其实还是使用 sendto 函数的人理解不到位。
接下来,我从理论分析和实践验证的角度来阐述:udp sendto 函数发送消息的最大值是 65507.
一. 理论分析
先来看一个基本的问题,udp sendto 函数所能发送的消息长度是多少呢?为了弄清这个问题,我们需要先看看 udp 的消息头:
可以看到,IP 包头有一个 16 bit的长度,对应的二进制最大值是2^16 -1,也就是说,一个IP包长度最大值是 2^16 - 1 字节。
如果考虑 udp 通信,那么除去IP头的 20 个字节,除去 udp 头的 8 个字节,还剩 2^16 - 1 - 20 - 8 字节,也就是 65507 字节。
所以,大家看清楚哦,udp sendto 函数发送的最大字节数是 65507 字节。接下来,我用实际程序来验证一下,看看是不是这样呢。
二. 实践验证
接下来,我来实际验证一下。服务端代码我省略了,直接看发送的客户端代码吧:
#include <stdio.h>测试结果为:
send size is 65507, iRet is 65507, errmsg[Success]那么,我们让send size变大1个字节,试试看:
#include <stdio.h>测试结果:
send size is 65508, iRet is -1, errmsg[Message too long]舒服啊,这就清楚了。65507可以,但65508就不行。
这篇文章很简单,也和大家一起复习了 udp 的包结构,并从理论和实践的角度验证了 udp sendto 函数发送消息的最大值。
其实,我想说的是,这些知识本身只是基础,更重要的是遇到问题之后,分析问题、抽丝剥茧、解决问题,顺便也学点知识。