ubuntu18-recvfrom接收不到广播报文异常分析

目录

前言

一、UDP广播接收程序

二、异常原因分析

总结


前言

        在ubuntu18.04系统中,编写udp接收程序发现接收不到广播报文,使用抓包工具tcpdump可以抓取到广播报文,在此对该现象分析解析如下文所示。

一、UDP广播接收程序

        UDP广播接收程序如下所示,广播发送程序使用上位机向255.255.255.255地址11100端口发送广播报文。

int CreateUdpSocket(int iUdpPort)
{int flag = 1;int err;int iSockFd = 0;short sPort = (short)iUdpPort;struct sockaddr_in tSockAddr;iSockFd = socket(AF_INET, SOCK_DGRAM, 0);if (iSockFd <= 0){printf("[%s]Create local socket Error.\n", __FUNCTION__);return -1;}tSockAddr.sin_family      = AF_INET;tSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);tSockAddr.sin_port        = htons(sPort);err = setsockopt(iSockFd, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(int));if(err != 0){printf("ERR: setsockopt  socket error. err = %d,errno = %d[%s] port %d\n",err, errno, strerror(errno), iUdpPort);close(iSockFd);return -2;}if (bind(iSockFd, (struct sockaddr*)&tSockAddr, sizeof(struct sockaddr_in)) < 0){printf("ERR:  bind error.\n");close(iSockFd);return -3;}return iSockFd;
}void *StartBroadCastThread(void *arg)
{char acInterface[] = "eth0";int ifindex = 0;int iSocket = -1;int iLen = 10000;int iRet = 0;int iBroadcastIface = -1;int iEthIndex = 0;int iEthNum = 0;int i;unsigned char *pcData = NULL;struct sockaddr_in tSockAddr;int iSockAddrLen = sizeof(tSockAddr);int iRecvLen = 0;short sSendLen = 0;PT_MSG_INFO ptMsg = NULL;T_MSG_BROADCAST_DEV_INFO *ptBroadCastInfo = NULL;//T_ETHNAME_INFO atEthNameInfo[MAX_ETH_NUM];//   T_DEV_NET_INFO *ptNetInfo = NULL;char acBroadcastIface[24];char acTmpBuf[512];int iSessionId = 0;T_ETHNAME_INFO atEthNameInfo[4];iSocket = CreateUdpSocket(MSG_TEST_BROADCAST_PORT);if (iSocket < 0){printf("socket udp failed\n");return NULL;}pcData = (char *)malloc(iLen);if (NULL == pcData){printf("[%s] malloc failed\n", __FUNCTION__);close(iSocket);return NULL;}//ptHead = (PT_MSG_HEAD)pcBuf;while (1){iRecvLen = recvfrom(iSocket, pcData, iLen, 0, (struct sockaddr *)&tSockAddr, (socklen_t*)&iSockAddrLen);if(iRecvLen <= 0){printf("[%s] recvfrom fail, .\n", __FUNCTION__);close(iSocket);free(pcData);return NULL;}if (iRecvLen < 4){printf("iRecvLen = %d\n", iRecvLen);continue;}printf("[%s]recv len %d, magic %d, cmd %d\n", __FUNCTION__, iRecvLen, pcData[0], pcData[1]);if ((pcData[0] == MSG_MAGIC_FLAG) && (pcData[1] == MSG_CLI2SERV_BROADCAST_QUERY)){printf("[%s]%d\n", __FUNCTION__, __LINE__);memset(pcData, 0, iLen);ptMsg = (PT_MSG_INFO)pcData;ptBroadCastInfo = (T_MSG_BROADCAST_DEV_INFO *)ptMsg->acMsgData;/* srand((int)time(0));iSessionId = (int)(300000.0*rand()/(RAND_MAX+1.0));memset(ptBroadCastInfo, 0, sizeof(T_MSG_BROADCAST_DEV_INFO));ptBroadCastInfo->iSessionId = htonl(iSessionId);*/iRet =  ABI_GetDevInfo((char *)ptBroadCastInfo, sizeof(T_MSG_BROADCAST_DEV_INFO));iRet = COMM_GetNetWorkCardNum(&iEthNum, atEthNameInfo);if (iRet < 0){printf("Get None NetWork Card\n");continue;}for (i = 0; i < iEthNum; i++){sSendLen = sizeof(T_MSG_BROADCAST_DEV_INFO);ptMsg->tMsgHead.magic = MSG_MAGIC_FLAG;ptMsg->tMsgHead.cmd = MSG_SERV2CLI_BROADCAST_QUERY_RESP;ptMsg->tMsgHead.sLen = htons(sSendLen);COMM_GetIpAddr(atEthNameInfo[i].acName, ptBroadCastInfo->acIpAddr, sizeof(ptBroadCastInfo->acIpAddr));read_interface(atEthNameInfo[i].acName, &ifindex, NULL, NULL);send_broadcast(ifindex, MSG_TEST_BROADCAST_PORT, ntohs(tSockAddr.sin_port), pcData, sizeof(T_MSG_HEAD) + sSendLen);}   }}close(iSocket);if (pcData){free(pcData);pcData = NULL;}return NULL;
}

使用tcpdump抓包工具可以抓到广播报文:

但是通过recvfrom函数则接收不到该报文。

二、异常原因分析

        考虑到ubuntu可以自带防火墙,但是通过查询ubuntu系统的防火墙功能,发现并没有开启,通过查询相关资料,发现可能跟Linux内核网络参数的设置有关,涉及到反向路径过滤,在/etc/sysctl.conf中有反向路径过滤参数可以设置,两项参数如下所示:

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=0
#net.ipv4.conf.all.rp_filter=0

两项参数解释如下:

  1. net.ipv4.conf.default.rp_filter=0: 这个设置表示在默认的网络接口上关闭反向路径过滤。反向路径过滤用于验证从系统收到的数据包是否通过与内核期望的相同的网络接口返回。将其设置为0表示禁用反向路径过滤。

  2. net.ipv4.conf.all.rp_filter=0: 这个设置表示在所有网络接口上关闭反向路径过滤。与前一个设置不同,这个设置应用于系统上的所有网络接口。

        由于上位机软件发送该广播报文时并没有绑定源地址,且此时ubuntu系统是默认开启源地址验证,则该报文则被系统方向过滤掉了。鉴于该种情况,在ubuntu系统中关闭反向路径过滤即可,如下:

重启ubuntu系统,在此运行程序时发现recvform可以接收到该广播报文。


总结

        在ubuntu系统如果碰到recvform接收不到广播报文的情况,可以参考本文内容解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/169089.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win下安卓打包指南

win下安卓打包指南 0、缘起 换了台电脑竟然忘了怎么打包&#xff0c;还好有笔记&#xff0c;用软件打包也挺好&#xff0c;但是我感觉用 命令行 更有操作感&#xff0c;分享下。 1、下载并配置apktool&#xff08;放在C://Windows无需配置环境变量&#xff0c;需要java环境&…

【Python大数据笔记_day06_Hive】

hive内外表操作 建表语法 create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... ) [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式 [clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式 注意: 可以排序[so…

免费3D骨架工具

免费3D骨架工具 : https://posemy.art/ ControlNet 1.1http://www.coloradmin.cn/o/839105.html?actiononClick https://pan.baidu.com/s/1rh39DI9xVbguLO5l7O4pjA yqqe  网盘里的 预处理器/downloads文件夹&#xff08;包含所有预处理器&#xff09;直接放在 extensions/sd…

智安网络|探索人机交互的未来:自然语言处理的前沿技术

自然语言处理是人工智能领域中研究人类语言和计算机之间交互的一门学科。它涉及了语言的理解、生成、翻译、分类和摘要等多个方面。随着人们对自然语言处理的重视和需求不断增长&#xff0c;成为了热门的研究方向。 首先&#xff0c;我们需要了解自然语言处理的基本概念。自然…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

SpringBoot集成easyexcel实现动态模板导出

添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-o…

Vue23组件自定义事件 和 解绑事件

Vue2&3组件自定义事件 和 解绑事件 Vue2组件自定义事件 功能&#xff1a;父组件绑定数据&#xff0c;子组件触发事件。&#xff08;父绑子触发&#xff09; 实现步骤&#xff08;前三步在父组件实现&#xff0c;第四步在子组件实现&#xff09;&#xff1a; 第一步&#…

scss 实用教程

变量 $ 定义变量 $link-color: blue;变量名可以与css中的属性名和选择器名称相同 使用变量 a {color: $link_color; }$highlight-border: 1px solid $link_color;中划线和下划线相互兼容&#xff0c;即中划线声明的变量可以使用下划线的方式引用&#xff0c;反之亦然。 $li…

find和grep命令的简单使用

find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径&#xff0c;可以是一个目录或文件名…

Rust图形界面egui初步

文章目录 下载和演示配置文件源代码 下载和演示 首先下载其源代码egui&#xff0c;然后进入其example文件夹&#xff0c;进入之后&#xff0c;使用cargo命令进行编译 cargo run --release -p hello_worldrust会自动下载一些相关的包和库&#xff0c;编译运行后&#xff0c;结…

移动端模型部署框架

移动端模型部署框架 1. MNN整体特点轻量性通用性高性能易用性架构设计主体工具致谢移动端模型部署框架 1. MNN https://www.yuque.com/mnn/cn/about MNN是全平台轻量级高性能深度学习引擎,广泛支持了阿里巴巴在计算机视觉、语音识别技术、自然语言处理等领域的70多个AI应用…

快速修复因相机断电导致视频文件打不开的问题

3-5 本文主要解决因相机突然断电导致拍摄的视频文件打不开的问题。 在日常工作中&#xff0c;有时候需要使用相机拍摄视频&#xff0c;比如现在有不少短视频拍摄的需求&#xff0c;如果因电池突然断电的原因&#xff0c;导致拍出来的视频播放不了&#xff0c;这时候就容易出大…