Linux下实现多播(组播)

单播只能发送给一个接收方,但是当给多个接收者发送时,不仅仅耗费流量,而且耗费时间,总流量=每个接收者的流量*接受者。

广播方式是发送给所有的主机,广播的坏处是会造成信息污染,大量的信息会占用网络带宽。

多播(组播):只有加入某个多播组的主机才能接收到数据。多播既可以发给多个主机,又能避免像广播那样带来的过多的负荷。

组播的地址为D类地址:224.0.1.1-239.255.255.255

那么代码实现如下:

组播发送

 1 #include <sys/socket.h>
 2 #include <sys/types.h>
 3 #include <arpa/inet.h>
 4 #include <netinet/in.h>
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <errno.h>
 8 #include <error.h>
 9 #include <string.h>
10 #include <unistd.h>
11 #include <time.h>
12
13 #define MCAST_PORT    50001
14 #define MCAST_ADDR    "239.0.0.1"
15
16 #define error_exit(_errmsg_)    error(EXIT_FAILURE, errno, _errmsg_)
17
18 #define BUFF_SIZE    1024
19
20 int main()
21 {
22     int sockfd;
23     struct sockaddr_in mcastaddr;
24     char *buff = NULL;
25     int nbytes;
26     time_t time_sec;
27
28     /**创建用户数据包套接字**/
29     if (-1 == (sockfd = socket(AF_INET, SOCK_DGRAM, 0)))
30         error_exit("socket");
31
32     /**指定接收方地址为组播地址**/
33     mcastaddr.sin_family = AF_INET;
34     mcastaddr.sin_port = htons(MCAST_PORT);
35     mcastaddr.sin_addr.s_addr = inet_addr(MCAST_ADDR);
36
37     /**连接到组播地址**/
38     if (-1 == connect(sockfd, (struct sockaddr *)&mcastaddr, sizeof(mcastaddr)))
39         error_exit("bind");
40
41     time(&time_sec);
42     while (2)  {
43         sleep(1);
44         time_sec ++;
45         buff = ctime(&time_sec);
46         printf("%s", buff);
47         /**数据发送**/
48         if (-1 == send(sockfd, buff, strlen(buff), 0))
49             error_exit("send");
50     }
51     close(sockfd);
52
53     return 0;
54 }

组播接收,有多个接收者

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <errno.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <netinet/in.h>
 7 #include <arpa/inet.h>
 8 #include <unistd.h>
 9 #include <string.h>
10 #include <strings.h>
11
12 #define N 128
13
14 typedef struct sockaddr SA;
15
16 int main(int argc, const char *argv[])
17 {
18     int sockfd;
19
20     /**创建用户数据包套接字**/
21     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
22     {
23         perror("socket");
24         exit(-1);
25     }
26
27     struct sockaddr_in myaddr;
28     myaddr.sin_family = AF_INET;
29     myaddr.sin_addr.s_addr = inet_addr("239.0.0.1");
30     myaddr.sin_port = htons(50001);
31
32     /**绑定多播IP**/
33     if(bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1)
34     {
35         perror("bind");
36         exit(-1);
37     }
38
39     /*
40     ** struct ip_mreq  {
41     **     struct in_addr imr_multiaddr;   IP multicast address of group 设置多播组地址
42     **     struct in_addr imr_interface;   local IP address of interface  本机IP
43     ** };
44     */
45     /**加入多播组**/
46     struct ip_mreq mreq;
47     bzero(&mreq, sizeof(mreq));
48     mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.1");
49     mreq.imr_interface.s_addr = inet_addr(/*"0.0.0.0"*/"192.168.1.24");
50
51     if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
52     {
53         perror("setsockopt");
54         exit(-1);
55     }
56
57     char buf[N] = {0};
58
59     while(1)
60     {
61         /**等待接收数据**/
62         recvfrom(sockfd, buf, N, 0, NULL, NULL);
63         printf("recv : %s\n", buf);
64     }
65
66     close(sockfd);
67     return 0;
68 }
时间: 2024-10-13 06:08:59

Linux下实现多播(组播)的相关文章

Linux下用户和组之浅谈

关于Linux下用户和组的总结. 用户:获取系统资源权限的集合: 组:具有相同权限的用户的集合 用户组分类; 1.普通用户组:可以加入多个用户 2.系统组:一般加入一些系统用户 3.私有组(也称基本组):当创建用户时,如果没有为其指明所属组,则就为其定义一个私有的用户组,名称与用户名同名. Linux下与用户与组相关的文件主要在/etc目录下,主要有 /etc/passwd  ,/etc/shadow , /etc/group , /etc/gshadow 四个文件.这四个文件的格式主要如下:

IP多播(组播)

IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希仁)第五版中单播与多播示意图. 因特网上的多播成为IP多播. 多播组 实现多播,必定就须要有多播组.多播组须要有自己的标识符.而多播组IP即为多播组的标识符,一个多播组IP代表一个多播组. D类IP地址即为多播组IP地址.D类地址前四位为1110,范围是 224.0 .0 .0到 239. 255. 255.

Linux下用户和组管理

用户与组之间的关系是,组下面有若干个用户,每个用户必须从属于唯一一个组.组可以理解为权限的集合.用户管理的命令有:useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage.组管理的命令有:groupadd, groupdel, groupmod, gpasswd. (一)linux系统下用户角色 在linux系统下用户的角色不同,权限和所能完成的任务也不同,用户角色是通过UID来识别的,在linux下要注意root用户的UI

多播/组播

多播数据同时传递到加入特定组的大量主机 多播地址D类地址:224.0.0.0~239.255.255.255 数据的发送者和接收者发送者:只要往多播组地址发送数据接收者:需要加入到多播组通过如下代码加入多播组: /* struct ip_mreq { /* 多播组地址 */ struct in_addr imr_multiaddr; /* 加入多播组的主机地址 */ struct in_addr imr_interface; }; */struct ip_mreq join_addr;join_

linux下用户与组

用户与组 涉及文件: /etc/passwd     (用户信息) 分为七段: 第一段:用户名 第二段:密码     (口令) 第三段:uid     (用户号码) 第四段:gid     (组id) 第五段:用户属性信息 第六段:家目录 第七段:shell     (命令解释程序) 涉及文件: /etc/shadow     (用户密码存放地址) 分为九段: 第一段:用户名 第二段:密码     (*:已经被锁定:!!:还没有密码) 第三段:上次更改密码时间     (天) 第四段:过多少天才

【Linux下用户和组管理】 &#182586;

原文: http://blog.gqylpy.com/gqy/315 "> ##### 创建用户--useradd . 命令格式:useradd [参数] 用户名 useradd也可写成adduser . 参数如下 -u 指定UID号 -d 指定宿主目录 -e 指定生效时间 -g 指定基本组 -G 指定附加组 -M 不建立宿主目录 -s 指定shell -r 用于删除用户时,同时删除宿主目录 -f 一般用于强制删除用户 . 补充命令: echo '密码' | passwd --stdin

SDN网络IPv6组播机制支持实时视频业务海量用户扩展

以 OpenFlow 技术为核心的软件定义网络(SDN)框架具有集中控制的功能能够自己感知网络拓扑的变化,在细粒度的路径选择.接入控制.负载均衡方面有着天然的优势,为 IPv6 组播功能的实现提供了好的解决方案. 一.背景 随着互联网的迅猛发展,诸如视频直播.网络教学等实时业务的广泛应用,多个接收者需要同时从一个或多个源节点接收相同的流媒体数据,网络传输的信息容量大大增加,占用大量的网络带宽.对这些应用需求,传统的点播技术,不仅对源节点资源和网络带宽的消耗很大,同时用户数量的扩展受到限制.比较而

组播协议原理讲解

单播.组播.广播是计算机网络上三种基本的通信方式. 单播是相互感兴趣的主机双方进行通信的方式,主机不能接收对其不感兴趣的其它主机发送的信息,属于点对点通信. 广播是主机向子网内所有主机发送信息,子网内所有主机都能收到来自某台主机的广播信息,属于点对所有点的通信. 组播则介于两者之间,是主机向一组主机发送信息,存在于某个组的所有主机都可以接收到信息,属于点对多点通信. 下边用张图表示这三种方式的数据传输: 这张图可以简单看出来这三种方式的传输方式,下边来具体细分下. 首先说下单播与组播的区别: 单

Android开发:组播(多播)与广播

近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播)背景知识:组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255.JAVA编程:java中通过MulticastSoc