Linux 多播(组播)例程
本例程修改自:http://zhoulifa.bokee.com/6066993.html
博文提供的例程。
ser.c
#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 intmain (int argc, char **argv) { struct sockaddr_in peeraddr,ia; int sockfd; char recmsg[BUFLEN + 1]; unsigned int socklen, n; 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)); inet_pton(AF_INET,"224.0.1.2",&ia.sin_addr);/* 设置组地址 */ bcopy (&ia.sin_addr.s_addr, &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; peeraddr.sin_port = htons (7838); inet_pton(AF_INET, "224.0.1.2", &peeraddr.sin_addr); /* 绑定自己的端口和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); } } }
cli.c
#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <string.h> #define BUFLEN 255 int main (int argc, char **argv) { struct sockaddr_in peeraddr, myaddr; int sockfd; char recmsg[BUFLEN + 1]; unsigned int socklen; socklen = sizeof (struct sockaddr_in); /* 创建 socket 用于UDP通讯 */ sockfd = socket (AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) { printf ("socket creating error\n"); exit (1); } /* 设置对方的端口和IP信息 */ memset (&peeraddr, 0, socklen); peeraddr.sin_family = AF_INET; peeraddr.sin_port = htons (7838); inet_pton (AF_INET, "224.0.1.2", &peeraddr.sin_addr); /* 设置自己的端口和IP信息 */ memset (&myaddr, 0, socklen); myaddr.sin_family = AF_INET; myaddr.sin_port = htons (23456); 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); } }
运行方式:./ser
./cli
在属于同一子网的不同linux主机上运行测试成功!
Linux 多播(组播)例程相关推荐
- android multicast(组播)发送端和接收端源代码,android multicast 多播(组播)问题
有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我 获取组播锁 private InetAddress group; WifiManager wm=(WifiManager)ge ...
- TX2 Linux配置组播(Multicast)
单播组播广播区别 单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式.它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协 ...
- 单播、广播、多播(组播)的概念和区别
单播.广播.多播(组播)的概念和区别 简单理解如下: 1.一台机器和一台机器通信这是单播. 2.一台机器发出的数据包能被多台机器收到这就叫组播. 一个机器发送,多台机器接收,但是又不同于广播, 发送端 ...
- linux添加组播路由命令,linux – 使用ip route add将组播路由添加到多个接口
TLDR:有没有办法使用"ip route"为多个网卡添加组播路由? 我们的软件使用两个多播组与两个不同的物理网络上的两个不同的设备组进行通信.除此应用程序外,一个网络上的设备无需 ...
- linux添加组播路由命令,linux – 所有接口的组播路由
我有一堆程序产生多播流量,我希望在网络上看到wifi和以太网,但我也希望它们在网络出现故障时不会死于"无路由". 所以我真正想要的是将所有多播流量从一台机器路由到所有可用的接口,或 ...
- linux ipv6 组播地址,ipv6组播地址是什么意思
一.任何节点都能够成为一个多播组成员也叫做组播组成员: 二.源节点可以发送数据包到多播组: 三.在一个多播组的节点都能收到发往该组播组的数据. "组播组"是一个用IP组播地址进行标 ...
- 【Socket网络编程】5.单播、多播(组播)、广播
[单播].[多播(组播)].[广播] https://blog.csdn.net/daaikuaichuan/article/details/83474089 ####[单播] 用于两个主机之间的端对 ...
- rpf逆向路径转发 linux,CISCO 组播RPF 逆向路径转发 实验原理
RPF,reverse path forwarding. 是组播转发的一个重要基础.只有当RPF检测成功以后,组播流量才能正确的在网络中进行转发. 当在baidu或者google里面查询关键字 &qu ...
- C语言使用多播/组播IP_ADD_MEMBERSHIP出现Invalid argument错误解决方法
UDP练习遇到的问题 (1)在组播/多播开发练习过程中,使用setsockopt函数来添加多播组的时候,调用完成后返回值一直为-1.返回-1后,使用perror打印出错的原因.打印结果如下: **se ...
- linux配组播ip地址,linux 广播和组播
广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include #inclu ...
最新文章
- (完全解决)Windows如何使用批处理命令进行SSH连接并自动输入密码
- vs2015_ef 连接mysql
- pyqt5知识:如何接受密码输入?
- Python Django后台管理模板美化:使用django-simpleui模块
- idea配置Run Dashboard的方法(亲测有效)
- 【性能优化】 之 RAC架构性能优化
- 一个Mapreduce案例
- SAP Spartacus Spinner控件显示原理
- 【gRPC】ProtoBuf 语言快速学习指南
- java面试准备---JSF系统学习知识点总结---随时更新
- 哈尔滨工程大学微型计算机原理与接口技术,哈尔滨工程大学微机原理与接口技术第2-3讲.ppt...
- finally不管有没有错都会运行 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码...
- android 找不到类文件,Android库:当“实现项目”用于库的模块依赖时,找不到类文件...
- hdu 4314 Save the dwarfs
- JAVA NIO 实现群聊
- 前窗玻璃膜贴了一周还有气泡_新车前挡风玻璃贴膜后有气泡几天能下去
- 陆平老师论文Closed-Loop Endoatmospheric Ascent Guidance读后总结
- 金蝶K3案例教程采购管理前台操作
- m1芯片的macbook使用问题总结
- 聚类算法——python实现SOM算法
热门文章
- SSH应用之BBS之路-2、Hibernate配置
- output的用法java_JavaI/O:简单的使用BufferedOutputStream和BufferedInputStr
- 启动tomcat控制台日志出现乱码怎么办?
- Spring+Hibernate 零散知识点
- Windows环境下smarty安装最简明教程 分享
- moore 数据集_可计算存储:数据压缩和数据库计算下推
- The Falling Leaves UVA - 699
- 使用pyinstaller把pyton文件打包成exe文件
- 计算机三级之嵌入式系统学习笔记9
- Python中的AES加解密算法