UDP的组播发送与接收C语言测试和nc接收组播测试

组播这个东西,很多年前用过一次。本身的原理不复杂,未知的是使用的环境,受使用环境的影响有多大,还是那句废话,具体问题具体分析。

发送端代码multicast.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <netdb.h>  #define MULTICAST_ADDR "224.0.0.1" // 组播地址  
#define MULTICAST_PORT 9990       // 组播端口  int main(int argc, char *argv[]) {  int sockfd;  struct sockaddr_in local,addr;  char message[] = "Hello, multicast!";  // 1. 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  perror("socket creation failed");  exit(EXIT_FAILURE);  }  // 2. 设置套接字选项以允许组播  int reuse = 1;  if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {  perror("setsockopt (SO_REUSEADDR) failed");  exit(EXIT_FAILURE);  }  // 3. 绑定套接字(可选,通常不需要)  // ...  local.sin_family = AF_INET;  // 假设你想绑定到本地的IP地址 "192.168.1.100",你可以通过inet_addr或inet_pton来设置  local.sin_addr.s_addr = inet_addr("192.168.0.3");  // 或者使用inet_pton来处理IPv6地址  // if (inet_pton(AF_INET, "192.168.0.3", &serv_addr.sin_addr) <= 0) {  //     perror("inet_pton failed");  //     exit(EXIT_FAILURE);  // }  local.sin_port = htons(12345); // 假设端口是12345  // 4. 构造组播地址结构  memset(&addr, 0, sizeof(addr));  addr.sin_family = AF_INET;  addr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR);  addr.sin_port = htons(MULTICAST_PORT);  // 5. 发送数据  if (sendto(sockfd, message, strlen(message), 0, (const struct sockaddr *)&addr, sizeof(addr)) < 0) {  perror("sendto failed");  exit(EXIT_FAILURE);  }  // 6. 接收数据(如果需要)  // ...  // 7. 关闭套接字  close(sockfd);  return 0;  
}

接收端代码multicast_recv.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <netdb.h>  #define MULTICAST_ADDR "224.0.0.1" // 组播地址  
#define MULTICAST_PORT 9990       // 组播端口  
#define BUFFER_SIZE 1024            // 接收缓冲区大小  int main(int argc, char *argv[]) {  int sockfd;  struct sockaddr_in addr;  char buffer[BUFFER_SIZE];  struct ip_mreq mreq;  socklen_t addrlen = sizeof(addr);  // 1. 创建UDP套接字  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  perror("socket creation failed");  exit(EXIT_FAILURE);  }  // 2. 设置组播地址和端口  memset(&addr, 0, sizeof(addr));  addr.sin_family = AF_INET;  addr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到所有可用的网络接口  addr.sin_port = htons(MULTICAST_PORT);  // 3. 绑定套接字(如果需要特定的端口,就绑定;否则,通常不需要绑定)  if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {  perror("bind failed");  exit(EXIT_FAILURE);  }  // 4. 设置组播选项  mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_ADDR);  mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 或者设置为特定的网络接口IP  if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {  perror("setsockopt failed");  exit(EXIT_FAILURE);  }  // 5. 接收数据  printf("Waiting for multicast packets...\n");  while (1) {  int nbytes = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&addr, &addrlen);  if (nbytes < 0) {  perror("recvfrom failed");  exit(EXIT_FAILURE);  }  buffer[nbytes] = '\0'; // 确保字符串以null字符结尾  printf("Received: %s\n", buffer);  }  // 6. 关闭套接字(注意:由于我们在一个无限循环中,这行代码实际上不会被执行)  close(sockfd);  return 0;  
}

编译脚本:

#!/bin/bashecho "hello"
source /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
echo $ARCH
aarch64-poky-linux-gcc --sysroot=/opt/fsl-imx-xwayland/5.4-zeus/sysroots/aarch64-poky-linux multicast.c -o multicast
gcc multicast_recv.c -o multicast_recv
sudo cp multicast /home/lkmao/nfsroot/yocto/home/root/
#make
exit 0

设置网关:

测试发现,如果不设置网关,组播数据发不出去。

root@imx8mpevk:~# route add default gw 192.168.0.1 dev eth1
root@imx8mpevk:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth1
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
root@imx8mpevk:~#

测试结果

使用nc作为接收端测试

测试的时候,发现,直接监听udp的9990端口就可以,这个有点诧异啊。

nc -ul 9990

小结

这个还得具体问题具体分析吧。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

k8s 自动伸缩机制-------HPA 超详细解读

目录 在K8s中扩缩容分为两种&#xff1a; 前言 弹性伸缩是根据用户的业务需求和策略&#xff0c;自动“调整”其“弹性资源”的管理服务。通过弹性伸缩功能&#xff0c;用户可设置对定时、周期或监控策略&#xff0c;恰到好处地增加或减少“弹性资源”&#xff0c;并完成实例…

最小生成树prim算法详解

prim算法解决的是最小生成树问题&#xff0c;即在一个给定的无向图G中求一棵生成树T&#xff0c;使得这棵树拥有图G中的所有顶点&#xff0c;且所有边都是来自图G中的边&#xff0c;并且满足整棵树的边权之和最小。 prim算法的基本思想是对图G设置集合S来存放已被访问的顶点&a…

适用于 macOS 的最佳免费数据恢复软件

升级到 macOS 后&#xff0c;它可以帮助您从 HDD、SSD、存储卡、USB 闪存驱动器、数码相机或其他存储介质设备中完全恢复已删除、格式化或无法访问的数据。 当 macOS Monterey 用户寻找数据恢复解决方案时&#xff0c;免费数据恢复软件始终是一个不错的选择。实际上&#xff0…

【Qt】chartView设置橡皮筋效果(RubberBand)

1. 效果 2. 代码 QChartView* chartView new QChartView();chartView->setRubberBand(QChartView::RectangleRubberBand);

C# 数据结构与算法:近邻算法的详解

文章目录 1、什么是K最近邻算法&#xff08;KNN&#xff09;&#xff1f;2、 KNN算法的原理3、实现近邻算法算法使用示例 4、应用&#xff1a;使用KNN算法进行简单的分类5、算法的优势与不足6、总结 近邻算法是一种基于实例的学习方法&#xff0c;它通过找到与给定测试点最接近…

社区团购系统搭建部署 :便捷高效,连接消费者与商家新篇章

一、前言 随着科技的快速发展和互联网的普及&#xff0c;社区团购系统作为一种新型的购物模式&#xff0c;正以其便捷高效的特性&#xff0c;逐渐改变着消费者和商家的互动方式。社区团购系统为商家提供丰富的营销活动和便捷高效的门店管理体系&#xff0c;为消费者提供真正实惠…

以bert为例,了解Lora是如何添加到模型中的

以bert为例,了解Lora是如何添加到模型中的 一.效果图1.torch.fx可视化A.添加前B.添加后 2.onnx可视化A.添加前B.添加后 3.tensorboard可视化A.添加前B.添加后 二.复现步骤1.生成配置文件(num_hidden_layers1)2.运行测试脚本 本文以bert为例,对比了添加Lora模块前后的网络结构图…

冰与火时空门特效解析

本文在线示例查看。更多精彩内容尽在数字孪生平台&#xff0c;关注公众号&#xff1a;sky的数孪技术&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 基本信息 三维渲染库采用threejs&#xff0c;项目用vite打包。 版本&#xff1a;v1.1.0 场景解析 时空…

Python第二语言(十四、高阶基础)

目录 1. 闭包 1.1 使用闭包注意事项 1.2 小结 2. 装饰器&#xff1a;实际上也是一种闭包&#xff1b; 2.1 装饰器的写法&#xff08;闭包写法&#xff09; &#xff1a;基础写法&#xff0c;只是解释装饰器是怎么写的&#xff1b; 2.2 装饰器的语法糖写法&#xff1a;函数…

Flink作业执行之 2.算子 StreamOperator

Flink作业执行之 2.算子 StreamOperator 前文介绍了Transformation创建过程&#xff0c;大多数情况下通过UDF完成DataStream转换中&#xff0c;生成的Transformation实例中&#xff0c;核心逻辑是封装了SimpleOperatorFactory实例。 UDF场景下&#xff0c;DataStream到Transf…

Java——LinkedList

1、链表 1.1 链表的概念及结构 链表在逻辑层面上是连续的&#xff0c;在物理层面上不一定是连续的 链表结构可分为&#xff0c;单向或双向、带头或不带头、循环或非循环&#xff0c;组合共计8种 重点&#xff1a;无头单向非循环链表、无头双向链表 1.2 模拟实现无头单向非…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 35&#xff0c;连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提&#xff1a;数组 思路&#xff1a;全局贪心算法&#xff1a;最小累加剩余汽油为负数&#xff0c;说明…

面向对象编程重载

系列文章目录 文章目录 系列文章目录前言一、重载&#xff08;overload&#xff09; 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了…

Antd 自定义列表全选功能

背景 需要为List组件自定义全选功能&#xff0c;如下图所示&#xff1a; 全选checkbox需要与下面每一项的checkbox联动&#xff1b;当从第一页翻页到第二页的时候&#xff0c;第一页已选的内容保持&#xff0c;可以对第二页勾选&#xff0c;同时保证全选checkbox的状态是正确的…

在自己的电脑上搭建我的世界Java版服务器

很多朋友&#xff0c;喜欢玩Minecraft&#xff0c;也希望搭建一个服务器&#xff0c;用于和小伙伴联机&#xff1b; 并且&#xff0c;拥有服务器后&#xff0c;即使所有玩家都下线&#xff0c;“世界”依旧在运行&#xff0c;玩家可以随时参与其中&#xff0c;说不定一上线&am…

【Da-SimaRPN】《Distractor-aware Siamese Networks for Visual Object Tracking》

ECCV-2018 中科大 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Features and Drawbacks in Traditional Siamese Networks4.2 Distractor-aware Training4.3 Distractor-aware Incremental Learning4.4 DaSiamRPN for Long-t…

mmap引起的内存泄漏分析

最近遇到一个内存泄漏问题&#xff0c;由于问题出现在客户端&#xff0c;只能通过客户提供的Log来分析。 根据客户提供的/proc/meminfo数据发现&#xff0c;MemAvailable 由294072kB减小至18128kB&#xff0c;减小约269MB&#xff0c;引起该变化的最直接原因是PageTables由614…

49.Chome浏览器有三种清缓存方式

49.Chome浏览器有三种清缓存方式&#xff1a;正常重新加载、硬件重新加载、清空缓存并硬性重新加载 1、【正常重新加载】 触发方式&#xff1a;①F5  ②CtrlR  ③在地址栏上回车  ④点击链接 如果缓存不过期会使用缓存。这样浏览器可以避免重新下载JavaScript文件、图像、…

kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现增量同步

1、之前kettle cdc mysql的时候使用的方案是canalkafkakettle&#xff0c;今天我们一起学习下使用kettle的插件Debezium直接cdc mysql。 注&#xff1a;CDC (Change Data Capture) 是一种技术&#xff0c;用于捕获和同步数据库中的更改。 1&#xff09;Debezium步骤解析mysql b…