http://blog.chinaunix.net/uid-28458801-id-5085099.html
首先需要明白:单播,组播,广播
单播:点对点的通信
组播:一对多(这个多可以为1,就是单播,可以为N,就是广播)
广播:一对所有
- 我们把发送组播的设备叫做组播源,接受组播的设备叫做组播接收者。
- 239.0.0.1-239.255.255.255是本地有效的组播地址,即类似于私网IP地址。当在企业内部部署组播时,可以配置上述IP地址。
组播源:往多播地址和端口上发送消息,发送消息。
- IP_MULTICAST_IF:用于设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据
(1)建立一个socket。
(2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。
(3)加入多播组。
(4)发送和接收数据。
(5)从多播组离开。
#include #include #include #include #include int main() { int fd = socket(PF_INET, SOCK_DGRAM, 0); // 2.设置多播地址和端口 struct in_addr imr_multiaddr; inet_pton(AF_INET, "239.0.0.9", &imr_multiaddr.s_addr); setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr)); //3.初始化客户端的地址信息 struct sockaddr_in caddr; caddr.sin_family = AF_INET; caddr.sin_port = htons(9999); inet_pton(AF_INET,"239.0.0.10",&caddr.sin_addr.s_addr); // 4.通信 int num = 0; while (1) { char sendbuf[128]; sprintf(sendbuf, "hello,client.....%d\n", num++); //发送数据 sendto(fd, sendbuf, strlen(sendbuf) + 1,0,(struct sockaddr*)&caddr,sizeof(caddr)); printf("组播的数据:%s\n", sendbuf); sleep(1); } close(fd); return 0; }
- 组播接收者:加入组播组(指定组播地址和端口),接收消息。
bind----指定接收的端口和ip地址----指定网卡
setopt的IP_ADD_MEMBERSHIP-----加入组播组-----设置了组播地址
#include #include #include #include #include int main() { // 1.创建一个通信的socket int fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd == -1) { perror("socket"); exit(-1); } //2.客户端绑定本地的IP和端口号 struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(9999); addr.sin_addr.s_addr = INADDR_ANY; int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); if(ret ==-1 ) { perror("bind"); exit(-1); } struct ip_mreq op; inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr); op.imr_interface.s_addr = INADDR_ANY; //加入到多播组 setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op)); // 3.通信 while (1) { char buf[128]; //接受数据 int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL); printf("接受组播的数据:%s\n", buf); } close(fd); return 0; }