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
两项参数解释如下:
-
net.ipv4.conf.default.rp_filter=0: 这个设置表示在默认的网络接口上关闭反向路径过滤。反向路径过滤用于验证从系统收到的数据包是否通过与内核期望的相同的网络接口返回。将其设置为0表示禁用反向路径过滤。 -
net.ipv4.conf.all.rp_filter=0: 这个设置表示在所有网络接口上关闭反向路径过滤。与前一个设置不同,这个设置应用于系统上的所有网络接口。
由于上位机软件发送该广播报文时并没有绑定源地址,且此时ubuntu系统是默认开启源地址验证,则该报文则被系统方向过滤掉了。鉴于该种情况,在ubuntu系统中关闭反向路径过滤即可,如下:

重启ubuntu系统,在此运行程序时发现recvform可以接收到该广播报文。
总结
在ubuntu系统如果碰到recvform接收不到广播报文的情况,可以参考本文内容解决。
相关文章:
ubuntu18-recvfrom接收不到广播报文异常分析
目录 前言 一、UDP广播接收程序 二、异常原因分析 总结 前言 在ubuntu18.04系统中,编写udp接收程序发现接收不到广播报文,使用抓包工具tcpdump可以抓取到广播报文,在此对该现象分析解析如下文所示。 一、UDP广播接收程序 UDP广播接收程序如…...
漏刻有时百度地图API实战开发(6)多个标注覆盖层级导致不能响应点击的问题
漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解…...
使用Net2FTP轻松打造免费的Web文件管理器并公网远程访问
文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…...
MySQL的表格去重,史上最简便的算法,一看就会
首先,表格my_tab02存在很多重复的数据: #表格的去重 方法一: 详细内容传送门:表格的去重 -- 思路: -- 1.先创建一张临时表 my_tmp,该表的结构和my_tab02一样 -- 2.把my_tmp的记录通过distinct关键字 处理后 把记录复…...
this是指向的哪个全局变量,改变this指向的方法有几种?
在JavaScript中,this关键字指向当前执行上下文中的对象。它的具体指向取决于函数的调用方式。 改变this指向的方法有四种: 1.使用call()方法:call()方法在调用函数时将指定的对象作为参数传递进去,从而改变函数的this指向。用法示…...
电脑msvcp110.dll丢失怎么办,msvcp110.dll缺失的详细修复步骤
在现代科技发展的时代,电脑已经成为我们生活和工作中不可或缺的工具。然而,由于各种原因,电脑可能会出现一些问题,其中之一就是msvcp110.dll文件丢失。这个问题可能会导致一些应用程序无法正常运行,给我们的生活和工作…...
cookie 里面都包含什么属性?
结论先行: Cookie 中除了名称和值外,还有几个比较常见的,例如: Domain 域:指定了 cookie 可以发送到哪些域,只有发送到指定域或其子域的请求才会携带该cookie; Path 路径:指定哪些…...
LinuxMySql
结构化查询语言 DDL(数据定义语言) 删除数据库drop database DbName; 创建数据库create database DbName; 使用数据库use DbName; 查看创建数据库语句以及字符编码show create database 43th; 修改数据库属性(字符编码改为gbk)…...
《微服务架构设计模式》之三:微服务架构中的进程通信
概述 交互方式 客户端和服务端交互方式可以从两个维度来分: 维度1:一对一和多对多 一对一:每个客户端请求由一个实例来处理。 一对多:每个客户端请求由多个实例来处理。维度2:同步和异步 同步模式:客户端…...
μC/OS-II---内核:任务调度
目录 内核:调度(oc_core.c文件的函数)OS_TCB(任务控制块)初始化任务控制块列表(ucos_ii.h文件的函数)系统调用,主动让渡CPU发生中断,强制当前任务让渡CPU就绪表(ucos_ii.h文件的函数)设置任务进…...
小程序发成绩
在这个数字化快速发展的时代,让学生能够方便快捷地获取自己的成绩已经成为一项基本的需求。那么,如何实现这一目标呢?对于许多老师来说,可能首先想到的是使用各种代码或者Excel来发布成绩查询。今天,我们就来探讨一下这…...
tensorflow内存泄漏或模型只加载不运行
使用tf2模型进行推理的过程中,发现模型的内存占用在逐步增加,甚至会因为OOM被kill掉进程,有时候模型只加载不运行,搜索得到很多五花八门的答案,有些认为是tf2本身的问题,但在使用内存追踪的时候发现&#x…...
npm和yarn的一些命令
文章目录 前言 前言 提示:生命并不短暂,短暂的是人。 --阿多尼斯 yarn config set registry https://registry.npmjs.org --globalnpm install -g cnpm --registryhttps://registry.npm.taobao.org # 切换淘宝源: yarn config set registry…...
Linux开发工具之自动化构建工具-make/Makefile
文章目录 1.make/Makefile的介绍2.简单编写及使用3.ACM时间4.extern的复习5.多文件的编译5.0复习翻译过程5.1多文件的构成5.2手动编译5.3利用Makefile 1.make/Makefile的介绍 make是一个命令 makefile是一个文件[makefile也对] 之前的学习都没有维护项目结构 当有多个.c文件 先…...
UE5蓝图接口使用方法
在内容区右键创建蓝图接口 命名自定义(可以用好识别的) 双击打开后关闭左边窗口 右键函数 -- 重命名 -- 名称自定义(用好记的) 点击下边输入后面的 号创建一个变量 点击编译并保存 在一个蓝图类里面 -- 点击类设置 在右侧已实现的…...
vue动态修改css样式
<span :style"{backgroundColor:colorHex}">测试文字</span> <button click"changeColor">更改颜色</button>export default{data(){return{colorHex:"#eeeeee",}},methods:{changeColor(){this.colorHex"#000&quo…...
小解List的使用【C++】
小解List的使用【C】 一. List1.1. 与vector的不同1.2 与vector的使用不同1.2.1 迭代器失效1.2.2. insert1.2.3 erase1.2.4 sort1.3. 其他接口 补充迭代器容器与迭代器的关系迭代器的类型 一. List 学习了STL,也已经到了List的内容 因为List与string以及vector比起…...
自动驾驶高效预训练--降低落地成本的新思路(AD-PT)
自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点:通过预训练的方式,可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…...
Spring笔记(四)(黑马)(web层解决方案-SpringMVC)
01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架,Spring3.0后发布的组件,SpringMVC和Spring可以无 缝整合,使用DispatcherServlet作为前端控制器,且内部提供了处理器映射器、处理器适配器…...
企业如何实现高效运转?工单管理系统有什么特点和优势?
在当今这个数字化、信息化的时代,企业需要一个高效、智能的工具来优化和协调内部和外部的工作流程。工单管理系统正是这样一个不可或缺的软件工具,它能够自动化、智能化地处理工单,提高工作效率和客户满意度。本文将详细介绍工单管理系统的特…...
网络安全SRC漏洞挖掘学习路线 - (四):常见漏洞挖掘实操,实现首次挖洞突破
网络安全SRC漏洞挖掘学习路线 - 第四期:常见漏洞挖掘实操,实现首次挖洞突破 摘要:承接第三期信息收集实战,本期作为SRC漏洞挖掘的“核心突破期”,聚焦新手最易上手、最高发的4类SRC漏洞——弱口令、SQL注入、XSS跨站脚…...
逻辑加密技术:硬件安全与IP保护的革新方案
1. 逻辑加密技术:硬件安全的新范式在集成电路设计领域,知识产权保护一直是个棘手的难题。想象一下,你花费数月心血设计的芯片,被人轻易逆向工程并复制,这种痛苦就像作家看到自己的小说被全文抄袭却无能为力。传统解决方…...
从零部署一个Web服务:在国产FT2000麒麟服务器上安装Nginx+Tomcat+MySQL全记录
国产飞腾FT2000服务器全栈部署指南:NginxTomcatMySQL银河麒麟V10实战 当Java Web应用遇上国产化技术栈,如何在飞腾FT2000处理器与银河麒麟V10操作系统构建的生产环境中,搭建稳定可靠的服务架构?本文将带你完整走通从系统准备到应用…...
手把手教你用示波器调试RK平台ES8323声卡:从‘No sysclk’到录音放音成功
手把手教你用示波器调试RK平台ES8323声卡:从‘No sysclk’到录音放音成功 在嵌入式音频开发中,遇到"录音放音失败"的问题就像在迷宫中寻找出口——软件日志只能告诉你"哪里错了",但示波器能揭示"为什么错"。本…...
AI智能体架构解析:从任务规划到工具调用的全能数字管家实现
1. 项目概述:当AI成为你的全能数字管家最近在GitHub上看到一个名为“Omnara-AI/Omnara”的项目,第一眼就被这个名字吸引了。“Omni-”这个前缀意味着“全能的”,而“Nara”听起来又有点“叙述者”或“向导”的味道。直觉告诉我,这…...
别再死记硬背了!用大白话+动图拆解Faster R-CNN里的RPN(附代码片段)
用围棋思维理解Faster R-CNN中的RPN机制 想象你正在下一盘围棋——每次落子都代表一个潜在的"势力范围",而RPN(Region Proposal Network)就像一位围棋高手,在图像上快速判断哪些区域可能存在目标物体。这个类比或许能帮…...
高一被开除、16岁被赶出家门,这个广东小伙做出了中国第一台智能手机,却亲手把公司搞没了
大家好,我是写代码的篮球球痴。今天这篇文章,聊一个中国手机圈最让人又爱又恨的人——黄章(本名黄秀章),魅族科技的创始人。如果你是 2010 年前后入坑数码的老玩家,一定记得这个名字。他在论坛上叫 J.Wong&…...
C++变量命名进阶技巧
1. 变量命名的艺术与科学匈牙利命名法的现代变体// 类型前缀(可读性 vs 类型安全) // 现代C更推荐有意义的命名,但某些场景仍有价值// 微软风格(传统) int iCount; // i 表示 int bool bFlag; // b …...
3分钟永久备份你的QQ空间:GetQzonehistory终极指南
3分钟永久备份你的QQ空间:GetQzonehistory终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还记得那些年发过的QQ空间说说吗?从青涩的学生时代到初入社会…...
Python数据清洗实战:5个高效函数解决常见问题
1. 数据清洗:从入门到精通的5个Python实用函数作为一名长期与数据打交道的从业者,我深知数据清洗这个"脏活累活"的重要性。无论你是刚入门的数据分析师,还是经验丰富的数据科学家,数据清洗都占据了日常工作70%以上的时间…...
