关于recvfrom使用过程中的一个坑点

关于recvfrom使用过程中的一个坑点问题描述首先对于recvfrom的原型如下:ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);返回值为读取到的字节长度,这里有一个坑点,我们在接收时需要传入一个buffer用于拷贝接收到的数据,传入参数包括buffer的…

大家好,又见面了,我是你们的朋友全栈君。

  • 问题描述

首先对于recvfrom的原型如下:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

返回值为读取到的字节长度,这里有一个坑点,我们在接收时需要传入一个buffer用于拷贝接收到的数据,传入参数包括buffer的首地址和长度,如果这里buffer长度小于这个udp包的长度会如何呢,recvfrom是否会返回一个小于0的值提示我们调用失败呢?测试代码,客户端:

关于recvfrom使用过程中的一个坑点

发送一个4096字段的udp包,此外我们不可以设置socket的不分片策略,否则会出现发送失败,提示msg too large,服务端程序如下:

关于recvfrom使用过程中的一个坑点

最终运行结果为在服务端收到了2048个字节之后,程序阻塞在了第二次recvfrom这里,第一次没有接收完的部分第二次并不能接收。

 

  • 原因分析

这个需要深入到recvfrom的源码来进行分析,这里只截取了内核源码中的关键部分,如下:

关于recvfrom使用过程中的一个坑点

关于recvfrom使用过程中的一个坑点

从这里可以看到,当取到这个skb之后,判断了实际包大小与buffer大小关系,取最小值,从而只把部分包COPY到缓存中,其它部分被丢弃了,因此在实际应用中,recvfrom传入的buffer大小应该是一个大于udp单个包大小的值,大于65536,这样的话无论如何都不会出现问题。

 

  • 问题扩展

在实际应用过程中,我们在进行UDP发包时通常会考虑小于MTU,正常MTU一般为1500,其实如果大于这个值UDP包也是可以正常发送的,在上述测试过程中,抓包结果如下:

关于recvfrom使用过程中的一个坑点

可以看到包发出后,实际上发生了IP分片,后两个udp包为分片包,到达源端之后,被IP层组装后再交给UDP层,在实际传输过程中,应该尽量避免底层产生拆包,如果一个分片丢掉的话,整个包都无法交付给上层。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163432.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 喝~,我笑了,组长交给他如何写定时任务,他却用来撩女朋友(schedule )「建议收藏」

    喝~,我笑了,组长交给他如何写定时任务,他却用来撩女朋友(schedule )

    2022年2月21日
    60
  • nsga2 matlab,NSGA2算法特征选择MATLAB实现(多目标)

    nsga2 matlab,NSGA2算法特征选择MATLAB实现(多目标)利用nsga2进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。需要优化的两个目标为特征数和精度。nsga2是一个多目标优化算法。具体的特征选择代码在上述代码的基础上改了两个①主函数②评价函数,增加了一个数据分成训练集和测试集的函数:MATLABfunction…

    2022年5月19日
    37
  • JSP页面运行却显示源码

    JSP页面运行却显示源码使用SpringMVC跳转页面,但是页面显示的缺失JSP源码,如下:通过网上查找各种原因,最后找到解决方法,如下:问题是因为在web.xml文件中的”/*”,用该形式访问jsp文件时,星号“*”会把*.jsp,*.sql,*.txt都当做txt处理。结果就是直接在浏览器加载了jsp源码。所以,只要把星号“*”去掉,改为别种访问形式。如“。do”、“/…

    2022年6月22日
    54
  • vscode配置javaweb环境_vscode electron

    vscode配置javaweb环境_vscode electronVScode配置Java环境1、下载VSCodeVSCode下载官网2、配置中文环境如果懂英语,或者想在编程上有更好的进步,可以跳过这一步,毕竟以后工作,很多软件并非中文,但像我这样的英语困难户,还是下载了该插件,毕竟香啊(〃 ̄︶ ̄)在VSCode的左侧点击小方块,搜索Chinese(Simplified)LanguagePackforVisualStudioCode插件,点击安装。(这是安装后的界面)3、配置相关插件和Java的JDK1、新建文件(快捷键Ctrl

    2022年10月3日
    4
  • 第十七届全国大学智能汽车竞赛竞速比赛规则

    第十七届全国大学智能汽车竞赛竞速比赛规则 §00规则导读参加过往届比赛的队员可以通过下面内容了解第十七届竞赛规则主要变化。如果第一次参加比赛,建议对于本文进行全文阅读。 §01前言

    2022年5月30日
    77
  • C#中实现模拟鼠标事件

    C#中实现模拟鼠标事件

    2021年8月15日
    175

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号