linux 组播
组播(多播):
单播地址标识单口 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可跨广域网使用。
a. 组播既可以用于局域网,也可也用于广域网
b. 客户端需要介入多播组,才能接收到多播的数据
int setsockopt(int sockfd, int level, int optname, cosnt void *optval, socklen_t optlen); //服务器设置多播的多信息,外出接口 - level : IPPROTO_IP - optname : IP_MULTICAST_IF - optval : struct in_addr //客户端加入到多播组: - level : IPPROTO_IP - optname : IP_ADD_MEMBERSHIP - optval : struct ip_mreq struct ip_mreq { struct in_addr imr_multiaddr;//组播组的IP地址 struct in_addr imr_interface;//本地的IP地址 intimr_ifindex;//网卡编号 }; typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; };
组播地址:
IP 多播通信必须依赖于 IP多播地址,在 IPv4中它的范围从 224.0.0.0 到 239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:
多播客户端:
1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <string.h> 6 7 int main() 8 { 9 //创建socket 10 int fd = socket(PF_INET, SOCK_DGRAM, 0); 11 if(fd == -1) 12 { 13 perror("socket"); 14 return -1; 15 } 16 //客户端绑定本地的IP和端口 17 struct sockaddr_in addr; 18 addr.sin_family = AF_INET; 19 addr.sin_port = htons(9999); 20 addr.sin_addr.s_addr = INADDR_ANY; 21 int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); 22 if(ret == -1) 23 { 24 perror("bind"); 25 exit(-1); 26 } 27 struct ip_mreq op; 28 inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr); 29 op.imr_interface.s_addr = INADDR_ANY; 30 //加入到多播组 31 setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op)); 32 //通信 33 while(1) 34 { 35 char buf[128]; 36 // 接收数据 37 int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL); 38 printf("server say: %s\n",buf); 39 } 40 close(fd); 41 return 0; 42 }
多播服务端:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <arpa/inet.h>// #include <sys/types.h> #include <sys/socket.h> 6 7 int main() 8 { 9 //1.创建一个通信socket 10 int fd = socket(PF_INET, SOCK_DGRAM, 0); 11 if(fd == -1) 12 { 13 perror("socket"); 14 exit(-1); 15 } 16 //2.设置多播属性, 外出接口 17 struct in_addr imr_multiaddr; 18 //初始化多播地址 19 inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr); 20 setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr)); 21 //3.初始化客户端的地址信息 22 struct sockaddr_in cliaddr; 23 cliaddr.sin_family = AF_INET; 24 cliaddr.sin_port = htons(9999); 25 inet_pton(AF_INET, "239.0.010", &cliaddr.sin_addr.s_addr); 26 //3.通信 27 int num = 0; 28 while(1) 29 { 30 char sendBuf[128]; 31 sprintf(sendBuf, "hello,client...%d\n",num++); 32 //发送数据 33 sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); 34 printf("多播的数据 : %s\n",sendBuf); 35 sleep(1); 36 } 37 close(fd); 38 return 0; 39 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示