当前位置 : 主页 > 编程语言 > java >

我被 udp 的 sendto 函数坑惨了

来源:互联网 收集:自由互联 发布时间:2022-07-04
最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个udp sendto函数上,我发现:当消息体的长度过长时,就必然报错。 于

最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个udp sendto函数上,我发现:当消息体的长度过长时,就必然报错。

于是,我验证了这个问题,把一个概率问题变为一个必现问题,也算是小小的进步,也更好定位问题了。虽然说是被 udp sendto 函数所坑,但其实还是使用 sendto 函数的人理解不到位。

接下来,我从理论分析和实践验证的角度来阐述:udp sendto 函数发送消息的最大值是 65507.

一. 理论分析

先来看一个基本的问题,udp sendto 函数所能发送的消息长度是多少呢?为了弄清这个问题,我们需要先看看 udp 的消息头:

我被 udp 的 sendto 函数坑惨了_服务端

可以看到,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 的 sendto 函数坑惨了_#include_02

这篇文章很简单,也和大家一起复习了 udp 的包结构,并从理论和实践的角度验证了 udp sendto 函数发送消息的最大值。

其实,我想说的是,这些知识本身只是基础,更重要的是遇到问题之后,分析问题、抽丝剥茧、解决问题,顺便也学点知识。

上一篇:Jenkins抛弃Java 8拥抱Java 11
下一篇:没有了
网友评论