Linux网络编程一步一步学-UDP组播

UDP 组播通信 linux网络编程 文章目录UDP组播服务器端客户端测试结果 UDP组播 通常,在传统的网络通讯中,有两种方式,一种是源主机和目标主机两台主机之间进行的“一对一”的通讯方式,即单播,第二种是一台源主机与网络中所有其他主机之间进行的通讯,即广播。那么,如果需要将信息从源主机发送到网络中的多个目标主机,要么采用广播方式,这样网络中所有主机都会收到信息,要么,采用单播方式,由源主机分别向各个不同目标主机发送信息。 可以看出来,在广播方式下,信息会发送到不需要该信息的主机从而浪费带宽资源,甚至引起广播风暴:而单播方式下,会因为数据包的 阅读详情

Linux网络编程一步一步学-UDP组播

组播客户端代码如下:


#include >sys/types.h<
#include >sys/socket.h<
#include >arpa/inet.h<
#include >stdio.h<
#include >stdlib.h<
#include >string.h<

#define BUFLEN 255
/*********************************************************************
*filename: mcastclient.c
*purpose: 演示组播编程的基本步骤,其实这就是一个基本的UDP客户端程序
*tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-25 13:10:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to: Google.com
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
int main(int argc, char **argv)
{
struct sockaddr_in peeraddr, myaddr;

int sockfd;
char recmsg[BUFLEN + 1];
unsigned int socklen;

/* 创建 socket 用于UDP通讯 */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd > 0) {
printf("socket creating error/n");
exit(1);
}
socklen = sizeof(struct sockaddr_in);

/* 设置对方的端口和IP信息 */
memset(&peeraddr, 0, socklen);
peeraddr.sin_family = AF_INET;
if (argv[2])
peeraddr.sin_port = htons(atoi(argv[2]));
else
peeraddr.sin_port = htons(7838);
if (argv[1]) {
/* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址 */
if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) >= 0) {
printf("wrong group address!/n");
exit(0);
}
} else {
printf("no group address!/n");
exit(0);
}

/* 设置自己的端口和IP信息 */
memset(&myaddr, 0, socklen);
myaddr.sin_family = AF_INET;
if (argv[4])
myaddr.sin_port = htons(atoi(argv[4]));
else
myaddr.sin_port = htons(23456);

if (argv[3]) {
if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) >= 0) {
printf("self ip address error!/n");
exit(0);
}
} else
myaddr.sin_addr.s_addr = INADDR_ANY;

/* 绑定自己的端口和IP信息到socket上 */
if (bind
(sockfd, (struct sockaddr *) &myaddr,
sizeof(struct sockaddr_in)) == -1) {
printf("Bind error/n");
exit(0);
}

/* 循环接受用户输入的消息发送组播消息 */
for (;;) {
/* 接受用户输入 */
bzero(recmsg, BUFLEN + 1);
if (fgets(recmsg, BUFLEN, stdin) == (char *) EOF)
exit(0);
/* 发送消息 */
if (sendto
(sockfd, recmsg, strlen(recmsg), 0,
(struct sockaddr *) &peeraddr,
sizeof(struct sockaddr_in)) > 0) {
printf("sendto error!/n");
exit(3);
}
printf("'%s' send ok/n", recmsg);
}
}

组播服务器端程序源代码为:

#include >sys/types.h<
#include >sys/socket.h<
#include >arpa/inet.h<
#include >stdio.h<
#include >stdlib.h<
#include >string.h<
#include >netdb.h<
#include >errno.h<

#define BUFLEN 255
/*********************************************************************
*filename: mcastserver.c
*purpose: 演示组播编程的基本步骤,组播服务器端,关键在于加入组
*tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-25 13:20:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to: Google.com
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
int main(int argc, char **argv)
{
struct sockaddr_in peeraddr;
struct in_addr ia;
int sockfd;
char recmsg[BUFLEN + 1];
unsigned int socklen, n;
struct hostent *group;
struct ip_mreq mreq;

/* 创建 socket 用于UDP通讯 */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd > 0) {
printf("socket creating err in udptalk/n");
exit(1);
}

/* 设置要加入组播的地址 */
bzero(&mreq, sizeof(struct ip_mreq));
if (argv[1]) {
if ((group = gethostbyname(argv[1])) == (struct hostent *) 0) {
perror("gethostbyname");
exit(errno);
}
} else {
printf
("you should give me a group address, 224.0.0.0-239.255.255.255/n");
exit(errno);
}

bcopy((void *) group- /* 设置组地址 */
bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));

/* 设置发送组播消息的源主机的地址信息 */
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

/* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */
if (setsockopt
(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
sizeof(struct ip_mreq)) == -1) {
perror("setsockopt");
exit(-1);
}

socklen = sizeof(struct sockaddr_in);
memset(&peeraddr, 0, socklen);
peeraddr.sin_family = AF_INET;
if (argv[2])
peeraddr.sin_port = htons(atoi(argv[2]));
else
peeraddr.sin_port = htons(7838);
if (argv[1]) {
if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) >= 0) {
printf("Wrong dest IP address!/n");
exit(0);
}
} else {
printf("no group address given, 224.0.0.0-239.255.255.255/n");
exit(errno);
}

/* 绑定自己的端口和IP信息到socket上 */
if (bind
(sockfd, (struct sockaddr *) &peeraddr,
sizeof(struct sockaddr_in)) == -1) {
printf("Bind error/n");
exit(0);
}

/* 循环接收网络上来的组播消息 */
for (;;) {
bzero(recmsg, BUFLEN + 1);
n = recvfrom(sockfd, recmsg, BUFLEN, 0,
(struct sockaddr *) &peeraddr, &socklen);
if (n > 0) {
printf("recvfrom err in udptalk!/n");
exit(4);
} else {
/* 成功接收到数据报 */
recmsg[n] = 0;
printf("peer:%s", recmsg);
}
}
}

编译程序用下列命令:
gcc -Wall mcastclient.c -o mcastclient
gcc -Wall mcastserver.c -o mcastserver
运行程序用如下命令:
./mcastserver 230.1.1.1 7838
客户端程序运行命令为:
./mcastclient 230.1.1.1 7838 192.168.100.1 12345

【作者: Liberal】【访问统计:】【2007年10月26日 星期五 18:51】【注册】【打印】

Linux网络编程--组播(多播) 【1】前言 通过广播我们可以很方便地实现发送数据包给局域网中的所有主机。但广播同样存在很多问题,例如,平凡地发送广播包会造成所有主机数据链路层都来接受并给上层协议处理,容易引起网络风暴。组播(多播)是一种向特定群组发送广播的方式。组播是单播和广播的折中,当发送组播数据包时,只有加入指定多播组的主机数据链路层才会处理,其他主机在数据链路层会直接丢掉收到的数据包。 发送方把数据发向组播地址。接收方要提... 阅读详情

相关推荐

Linux Socket编程实战:广播、组播与UDP源码详解

在现代网络通信中,Socket编程是实现进程间跨网络通信的核心技术之一。本章将从基础概念入手,深入解析Linux环境下Socket编程的工作原理及其应用价值。Socket本质上是一个通信端点,它为应用程序提供了一种统一的网络通信接口。通过Socket,开发者可以轻松构建TCP/IP或UDP/IP协议栈上的通信程序。Linux系统中的Socket编程接口源自Berkeley Sockets标准,具备良好的可移植性和扩展性,广泛应用于服务器开发、分布式系统及嵌入式通信等领域。

weixin_42602241的博客 1148

Linux网络编程系列之UDP组播

Linux网络编程系列之UDP组播,UDP组播的简单介绍和使用

AABond的博客 4505

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

网络编程 | UDP组播通信

组播是介于单播与广播之间,在一个局域网内,将某些主机添加到组中,并设置一个组地址。将数据发送到组播地址时,加入到该组的所有主机都能接收到数据。组播是主机间一对多的通信模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。类似于生活中较为常见的群聊功能,在群内的所有群员,都可以在群内发送消息给群友,也可以接收到来自任意群友的消息。

weixin_49337111的博客 2592

ansys workbench 静力结构分析 高阶教程

ansys workbench 静力结构分析 高阶教程 目录ansys workbench 静力结构分析 高阶教程新建工程模型导入设置材料模型简化: 主要内容: 材料设置、模型简化、网格细化、约束分析、接触设置、求解设置、报错处理、结果分析 基础教程: ansys workbench 静力结构分析 基础操作流程(入门) ansys版本: 19.0(16.0及以上均可) 参考资料: 推荐教学视频《有限元分析 张晔》(超详细 ???? )、ansys workbench 超级学习手册(查阅用) 说明:一些基

weixin_43434624的博客 5万+

5分钟搞定!用Coze+剪映小助手批量生成萌宠视频(附完整工作流配置)

本文详细介绍了如何利用Coze工作流与剪映小助手快速批量生成萌宠视频的完整方案。通过智能内容生成、素材处理、剪辑组装和输出适配四大模块的协同,实现5分钟内完成高质量视频制作。特别适合多宠物账号运营者,工作流支持模板切换和参数修改,大幅提升内容生产效率。

weixin_28678151的博客 389

Linux网络编程-UDP组播服务客户端代码实现

目录 一、UDP组播介绍 1.UDP介绍 2.UDP组播 3.组播地址 4.组播的原理: 二、UDP组播编程 1.UDP组播的基本步骤 2.加入组播组-setsockopt 三、UDP组播服务端代码实现 1.代码实现 2.运行结果 四、UDP单播客户端代码实现 1.代码实现 2.运行结果 一、UDP组播介绍 1.UDP介绍 UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服...

ProYuan的博客 4729

【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用

【图像超分】论文精读:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)请配合上述论文精读文章使用,效果更佳!图像超分辨率SRCNN和FSRCNN复现代码,除基本的网络实现外,还有特征图可视化,PSNR曲线图可视化,测试自己的图像数据等不想理解原理,希望直接跑通然后应用到自己的图像数据的同学,请直接下载上面的代码,有训练好的模型,直接用即可。具体使用方式见代码中的README!有问题来本文评论区留言!准备数据集,以及数据预处理。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

Linux---指定网卡发送UDP组播

该场景是用于终端Linux设备,入网后定时发送UDP组播,从而服务端可以发现同一个局域网内所有按照此协议下的设备。 不比比,直接上代码: #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time.h> #include <

sunny_hu92的博客 5313

electron:解决打包后报错Cannot find module ‘X‘ 运行报错各种模块缺失问题(解决electron build打包后运行应用报错启动失败或白屏,无论模块名称是什么都能解决!)

Electron app打包后启动报错:“Cannot find module 'X'”解决方案,electron-builder 打包出现 cannot find module,electron 打包后找不到module问题,electron打包运行白屏、Can not find modules ‘x‘,electron项目打包报错,electron打包后,点击生成的exe应用程序出现Cannot find module,解决electron-build打包后运行app报错:cannot find mod

✅ 精选推荐文章 4385

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 202

linux下UDP组播接收不到数据的说明

背景 在一个跨平台的桌面项目中,由于涉及多线程中对象的创建、销毁等,基于QT的对象绑定机制(QObject子类)来做实现时,需要相当心累的设计,才能避免跨线程的异常。由于QT的这个天然机制,在实现很多业务(非界面)模块时,都避免了基于QObject。网络模块中的UDP等功能,同样的也未基于QUdpSocket及其相关,而是包装了libuv(尽管,对桌面来说libuv也需要再折腾,但libuv作者已经明示了这个点了) 现象 基于libuv的程序示例,在windows下,可以正常工作(接收到组播数据.

smartcore 1万+

OpenClaw更新后变傻了?一分钟教你快速恢复(OpenClaw更新版本后降智、缺少权限问题的解决方案)

OpenClaw 版本更新后出现降智问题,AI不再执行具体任务。本文详细分析问题原因,提供最简便的解决方案✅

XiaoqiangClub的博客 3880

计算机网络 | 广播与组播

广播与组播介绍。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 3641

4、LTE无人机认证:保障通信安全的新方案

本文针对LTE网络中无人机通信存在的安全风险,提出了一种基于可信第三方GCS的新型认证协议。该协议通过非对称加密和哈希函数保护IMSI等敏感信息,防止身份泄露、中间人攻击、拒绝服务攻击和位置追踪等威胁。利用Scyther工具对协议进行形式化分析,验证了其在机密性、一致性和活性等方面的安全属性,证明该方案能有效提升无人机在LTE网络中的通信安全性与隐私保护能力。

pink的博客 60

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux网络编程 之 UDP 组播实例

  一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。   1、服务器端代码 (multi_udp_server.c)     #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;std...

caofengtao1314的专栏 787

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux编程udp组播

linux编程udp组播 linux编程udp通信 linux编程udp广播 使用范围 局域网 Internet 结构体 struct ip_mreqn { //组播的IP地址 struct in_addr imr_multiaddr; //本地某一网络设备接口的IP地址 struct in_addr imr_interface; int imr_ifindex;//网卡编号 } struct in_addr { in_addr_t s_addr; } ○ 组播地址 224.0.0.0~

mirana的专栏 750

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【linux网络编程学习笔记】第九节:UDP组播的实现

Nurture passes nature.   教养胜过天性 UDP组播的实现 何为UDP广播 网络地址 组播发送步骤 组播接收步骤 完整例程: udp_add_multi_read.c udp_write.c 何为UDP广播 单播方式只能发给一个接收方,广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。 组播(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。组播方式既可以发给多个主机,又...

qq_44796935的博客 663

Linux网络编程-UDP组播

#include #include #include #include #include #include #define BUFLEN 255 /********************************************************************* *filename: mcastclient.c *purpose: 演示组播

自我学习小计 1694

Vxworks下UDP收发与组播收发例程源码:提升网络编程效率的利器

Vxworks下UDP收发与组播收发例程源码:提升网络编程效率的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 Vxworks下UDP收发与组播收发例程源码,这是一款面向开发者的实用工具,专为Vxworks环境下的网络通信设计。该项目提供了丰富的例程源码,旨在帮助开发者快速掌握在Vxworks系统下进行UDP通信和组播通信的方法。无论是初学者还是有经验的程序员,都...

gitblog_06773的博客 948

Linux网络编程(四)——UDP通信

UDP是一个面向无连接的,不可靠的服务,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。

Alkaid2000的博客 5812

Linux网络编程一步一步学-网络广播、组播与单播

Linux网络编程一步一步学-网络广播、组播与单播 这里以下图所示的网络为基础来说明网络通讯的各种方式:什么是广播?以前面的文章<Linux网络编程一步一步学-UDP方式广播通讯>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:./clien

725
上一篇: Linux网络编程一步一步学-简单客户端编写
下一篇: Linux网络编程一步一步学-利用OpenSSL提供的SSL操作函数进行加密通讯原始例子
f5key
博客等级 码龄19年 20粉丝 527原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值