Linux下实现多播(组播)
单播只能发送给一个接收方,但是当给多个接收者发送时,不仅仅耗费流量,而且耗费时间,总流量=每个接收者的流量*接受者。
广播方式是发送给所有的主机,广播的坏处是会造成信息污染,大量的信息会占用网络带宽。
多播(组播):只有加入某个多播组的主机才能接收到数据。多播既可以发给多个主机,又能避免像广播那样带来的过多的负荷。
组播的地址为D类地址:224.0.1.1-239.255.255.255
那么代码实现如下:
组播发送
#include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <error.h> #include <string.h> #include <unistd.h> #include <time.h> #define MCAST_PORT 50001 #define MCAST_ADDR "239.0.0.1" #define error_exit(_errmsg_) error(EXIT_FAILURE, errno, _errmsg_) #define BUFF_SIZE 1024 int main() { int sockfd; struct sockaddr_in mcastaddr; char *buff = NULL; int nbytes; time_t time_sec; /**创建用户数据包套接字**/ == (sockfd = socket(AF_INET, SOCK_DGRAM, ))) error_exit("socket"); /**指定接收方地址为组播地址**/ mcastaddr.sin_family = AF_INET; mcastaddr.sin_port = htons(MCAST_PORT); mcastaddr.sin_addr.s_addr = inet_addr(MCAST_ADDR); /**连接到组播地址**/ == connect(sockfd, (struct sockaddr *)&mcastaddr, sizeof(mcastaddr))) error_exit("bind"); time(&time_sec); ) { sleep(); time_sec ++; buff = ctime(&time_sec); printf("%s", buff); /**数据发送**/ == send(sockfd, buff, strlen(buff), )) error_exit("send"); } close(sockfd); ; }
组播接收,有多个接收者
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <strings.h> #define N 128 typedef struct sockaddr SA; int main(int argc, const char *argv[]) { int sockfd; /**创建用户数据包套接字**/ )) == -) { perror("socket"); exit(-); } struct sockaddr_in myaddr; myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = inet_addr("239.0.0.1"); myaddr.sin_port = htons(); /**绑定多播IP**/ ) { perror("bind"); exit(-); } /* ** struct ip_mreq { ** struct in_addr imr_multiaddr; IP multicast address of group 设置多播组地址 ** struct in_addr imr_interface; local IP address of interface 本机IP ** }; */ /**加入多播组**/ struct ip_mreq mreq; bzero(&mreq, sizeof(mreq)); mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.1"); mreq.imr_interface.s_addr = inet_addr(/*"0.0.0.0"*/"192.168.1.24"); ) { perror("setsockopt"); exit(-); } }; ) { /**等待接收数据**/ recvfrom(sockfd, buf, N, , NULL, NULL); printf("recv : %s\n", buf); } close(sockfd); ; }
Linux下实现多播(组播)的更多相关文章
- android multicast 多播(组播)问题
有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我 获取组播锁 private InetAddress group; WifiManager wm=(WifiManager ...
- IP多播(组播)
IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希 ...
- Java单播、广播、多播(组播)---转
一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...
- Java单播、广播、多播(组播)
一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...
- 多网卡情况下接收udp组播
多网卡下接收udp组播 往往会接收失败 因为用错了网卡 例如我想要接收2网段 其他电脑出的udp组播 我电脑有有线网和wifi在window下可以这样 route add 230.0.0.1 mas ...
- Linux IPC socket 广播,组播
getsockopt()/setsockopt() //获得sockfd指向的socket的属性 int getsockopt(int sockfd, int level, int optname, ...
- Linux下用户和组管理
用户与组之间的关系是,组下面有若干个用户,每个用户必须从属于唯一一个组.组可以理解为权限的集合.用户管理的命令有:useradd, userdel, usermod, passwd, chsh, ch ...
- 2017.7.18 linux下用户、组和文件的操作
参考来自:<鸟叔的linux私房菜(基础学习篇)-第14章> 0 目的 在linux下搭建ELK环境时,因为elasticsearch不能在root下操作,所以要为其新增一个用户,以及随之 ...
- 【miscellaneous】多播(组播)原理分析
为什么要使用多播: 网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...
随机推荐
- 使用msbuild.exe绕过应用程序白名单(多种方法)
一.MSbuild.exe简介 Microsoft Build Engine是一个用于构建应用程序的平台.此引擎也被称为msbuild,它为项目文件提供一个XML模式,该模式控制构建平台如何处理和 ...
- linux内核分析 第六周 分析Linux内核创建一个新进程的过程
进程的描述 操作系统的三大管理功能:进程管理.内存管理.文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct:进 ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- [BZOJ1878][SDOI2009] HH的项链 (树状数组)
link 一道简单题. 不用可持久化. 对于统计颜色个数,可以看与其颜色一样的前一个位置. 设$las(i)$表示其与$i$颜色相等的上一个位置. 则对于二元组$(l,r)$,其答案为$\sum_{i ...
- poi excel导入纯数字单元格显示科学计数法的处理
POI读取Excel文件时,对纯数字单元格的处理 用POI读取Excel文件的时候,可能会遇到这样的问题:Excel文件中某一单元格中的数据为数字,例如12345678910123. 正常读取的话 ...
- Vuejs+axios+SpringMVC 1
原文:https://blog.csdn.net/annghi/article/details/78925668 Vuejs+axios+SpringMVC4.3.7 (一) 2017年12月28日 ...
- 【Asp.net入门5-01】SportsStore:一个真实的应用程序
- 网络优化之net.ipv4.tcp_tw_recycle参数
不要在linux上启用net.ipv4.tcp_tw_recycle参数 2015/07/27 CFC4N 本文为翻译英文BLOG<Coping with the TCP TIME-WAIT ...
- [老法新用]使用PADDING-TOP:(PERCENTAGE)实现响应式背景图片
处理响应式布局中背景图片的简单方法是等比例缩放背景图片.我们知道宽度设为百分比的 <img> 元素,其高度会随着宽度的变化自动调整,且其宽高比不变.如果想在背景图片中实现同样的效果,我们 ...
- GO_03:GO语言基础语法
1. Go项目的目录结构 一般的,一个Go项目在GOPATH下,会有如下三个目录: project --- bin --- pkg --- src 其中,bin 存放编译后的可执行文件:p ...