一,发送端
代码如下:
先调用initUdpMultiCastSender初始化,
int initUdpMultiCastSender(uint32_t localip,uint16_t localport)
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (-1 == sockfd)
{
printf("[initUdpMultiCastSender]socket fail\n");
return -1;
}
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(localport);
myaddr.sin_addr.s_addr = localip;
int bindret = bind(sockfd,(struct sockaddr *)(&myaddr),sizeof(struct sockaddr));
if (-1 == bindret)
{
perror("[initUdpMultiCastSender]bind fail\n");
close(sockfd);
return -1;
}
return sockfd;
}
后使用sendUdpMultiCast发送数据,
int sendUdpMultiCast(int sockfd,char *pMultiCastIp,uint16_t multicastPort,void *data,uint32_t len)
{
struct sockaddr_in destAddr;
destAddr.sin_family = AF_INET;
destAddr.sin_addr.s_addr = inet_addr(pMultiCastIp);
destAddr.sin_port = htons(multicastPort);
int sendLen = sendto(sockfd,data,len,0,(struct sockaddr *)(&destAddr),sizeof(struct sockaddr));
return sendLen;
}
发送端的代码,整体的思路就是创建socket->绑定本地ip,port(注意,该port不是组播port,而是本地port,指定个未使用的即可)->发送数据(注意,发送的ip和port为组播ip,port)
二、接收端
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (-1 == sockfd)
{
perror("socket fail\n");
return -3;
}
printf("socket succ\n");
struct ip_mreq mreq;
memset(&mreq,0,sizeof(struct ip_mreq));
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_multiaddr.s_addr = inet_addr(pUdpMultiCastIp);
int setoptret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq));
if (-1 == setoptret)
{
perror("setsockopt fail\n");
return -4;
}
printf("setsockopt ip_add_membership succ\n");
struct sockaddr_in peeraddr;
memset(&peeraddr,0,sizeof(struct sockaddr_in));
peeraddr.sin_family = AF_INET;
peeraddr.sin_addr.s_addr = inet_addr(pUdpMultiCastIp);
peeraddr.sin_port = htons(udpMultiCastPort);
int bindRet = bind(sockfd,(struct sockaddr *)(&peeraddr),sizeof(struct sockaddr));
if (-1 == bindRet)
{
perror("bind fail\n");
return -5;
}
printf("bind succ\n");
while(1)
{
char buffer[1024] = {0};
socklen_t addrLen = sizeof(struct sockaddr);
printf("ready 2 recv\n");
int recvRet = recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)(&peeraddr),&addrLen);
if (-1 == recvRet)
{
perror("recvfrom fail\n");
break;
}
printf("recvfrom succ,buffer is %s\n",buffer);
}
接收端的代码,整体的思路就是创建socket->加入组播(本地地址和组播地址赋值给mreq)->绑定ip,port(注意,该ip和port是组播ip和组播port)->接收数据(注意,接收的ip和port为组播ip,port)