美文网首页
我被 udp 的 sendto 函数坑惨了

我被 udp 的 sendto 函数坑惨了

作者: Java码农 | 来源:发表于2022-07-03 10:24 被阅读0次

最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个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 函数发送消息的最大值。

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

相关文章

  • 我被 udp 的 sendto 函数坑惨了

    最近被一个网络问题坑得很惨,服务出现低概率错误,怎么也没弄明白是什么原因。经过更深入的分析,锁定在一个udp se...

  • ROS-I simple_message 源码分析:UdpSoc

    rawSendBytes rawSendBytes调用的是sendto函数,用于发送未建立连接的UDP数据包。 r...

  • 网络学习八-UDP

    UDP C/S的典型函数调用 UDP没有像TCP那样的连接,客户端直接sendto向某服务器发送数据,服务器端一直...

  • UDP和TCP一次能发多少字节数据?

    在网络编程中会经常用到UDP和TCP套接字,但是一直有个疑问困扰着我,用sendto/send函数发送数据的...

  • udp中的connect知识

    网络基础一、问题:1、udp可以connect么?2、有什么好处二、知识整理UDP两种方案:1、直接sendto(...

  • 我被朋友坑惨了

    前几天朋友邀请我来简书,我来了。然后她昨天又跟我说,让我注销掉,重新来过。 我想了想,反正也没来几天,也没啥舍不得...

  • 我被白萝卜坑惨了

    一元五一斤的白萝卜,好便宜啊! 观其外表,白白嫩嫩的,还特别水灵。我左瞧瞧右看看,等不及冬至日就买了一根回家炖排骨...

  • 旅游的警告

    “什么?又去旅游!”我猛地拍了桌子,“不去!我可不想再被坑了,每次都劝我去旅游。我可是个被坑惨了!” ...

  • 准确获取Android设备的分辨率

    最近因为Android设备分辨率的问题被坑惨了,另一方面,公司的美术团队被我也坑惨了,虽然看起来问题不在我,但是这...

  • 被 Docker 日志坑惨了

    原文链接: 被 Docker 日志坑惨了[https://mp.weixin.qq.com/s/3Tkc15dTC...

网友评论

      本文标题:我被 udp 的 sendto 函数坑惨了

      本文链接:https://www.haomeiwen.com/subject/ojplbrtx.html