一.组播
1.概述
单播地址标识单个IP 接口,广播地址标识某个子网的所有IP 接口,
多播地址标识一组IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),
多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,
也就是说由运行相应多播会话应用系统的主机上的接口接收。
另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。a.组播既可以用于局域网,也可以用于广域网
b.客户端需要加入多播组,才能接收到多的数据
2.api介绍
int setsockopt(int sockfd, int level, int opetname, const void *optval, socklen_t optlen)服务器设置多播的信息,外出接口-level : IPPROTO_IP- optname : IP_MULTICAS_IF- optval : struct in_addr客户端加入到多播组-level : IPPROTO_IP-optname : IP_ADD_MEMBERSHIP-optval : struct mreqn
3.服务端和客户端代码实现
3.1.serer
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int udp_sockfd = socket(AF_INET,SOCK_DGRAM,0);if(udp_sockfd == -1){perror("socket");exit(-1);}//设置多播的属性,设置外出接口struct in_addr imr_multiaddr;inet_pton(AF_INET,"239.0.0.10",&imr_multiaddr.s_addr);setsockopt(udp_sockfd,IPPROTO_IP,IP_MULTICAST_IF,&imr_multiaddr,sizeof(imr_multiaddr));//创建客户端的地址信息struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr("239.0.0.10"); //广播地址server.sin_port = htons(8000);int num = 0;while(1){char sendBuf[128];sprintf(sendBuf,"hello,client-----%d\n",num++);//发送数据sendto(udp_sockfd,sendBuf,strlen(sendBuf)+1,0,(const struct sockaddr*)&server,sizeof(server));printf("组播数据:%s\n",sendBuf);sleep(1);}close(udp_sockfd);return 0;
}
3.2.client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd = socket(PF_INET, SOCK_DGRAM, 0);if(fd == -1) {perror("socket");exit(-1);} struct in_addr in;// 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("server say : %s\n", buf);}close(fd);return 0;
}