UDP组播的搭建流程
-----------------------------------------------------------------------------------------------------------------------------
【murecv.c】
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> int main() { //1创建socket int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } else { printf("create sock %d\n",sockfd); } //2加入组播 struct ip_mreq zu; //设置组播信息 zu.imr_multiaddr.s_addr = inet_addr("224.10.10.2"); zu.imr_interface.s_addr = inet_addr("0.0.0.0"); //让系统自动分配 int ret=setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&zu,sizeof(zu)); if(ret == -1) { perror("setsock fail\n"); } //设置组播信息 struct sockaddr_in serveraddr; bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET ; //IPV4协议 serveraddr.sin_port = htons(8888); //端口号 serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");//让系统自动分配 ret=bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); if(ret == -1) { perror("bind fail\n"); } //接收组播数据 char buf[50]={0}; struct sockaddr_in clienaddr; bzero(&clienaddr,sizeof(clienaddr)); socklen_t len = sizeof(clienaddr); while(1) { bzero(buf,50); ssize_t size=recvfrom(sockfd,buf,50,0,(struct sockaddr *)&clienaddr,&len); if(size>0) { printf("buf=%s\n",buf); } else { perror("recvfrom fail:"); } } }
-----------------------------------------------------------------------------------------------------------------------------
【musend.c】
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> int main() { //创建socket int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } else { printf("create sock %d\n",sockfd); } //设置组播信息 struct sockaddr_in serveraddr; bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET ; serveraddr.sin_port = htons(8888); serveraddr.sin_addr.s_addr = inet_addr("224.10.10.10"); //发送组播数据 int ret = 0; char buf[50]={"zubo!!!"}; while(1) { ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); if(ret > 0) { printf("size =%d\n",ret); } sleep(1); } }
-----------------------------------------------------------------------------------------------------------------------------