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);
}
}
-----------------------------------------------------------------------------------------------------------------------------