接收端
int init_recv_socket(int *pSockfd)
{
int recv_sockfd = -1;
struct ip_mreq mreq;
bzero(&mreq, sizeof(struct ip_mreq));
mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
struct sockaddr_in server;
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(MCAST_PORT);
server.sin_addr.s_addr= htonl(INADDR_ANY);
/*set up the destination address*/
memset(&group_addr,0,sizeof(struct sockaddr_in));
group_addr.sin_family = AF_INET;
group_addr.sin_port = htons(MCAST_PORT);
group_addr.sin_addr.s_addr = inet_addr(MCAST_ADDR);
group_addr_len = sizeof(group_addr);
if((recv_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("Create recv socket failed!\n");
return -1;
}
set_nonblocking(recv_sockfd);
if(setsockopt(recv_sockfd, IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)
{
printf("[%s(%d)] Adding multicast group error\n", __FUNCTION__, __LINE__);
close(recv_sockfd);
return -1;
}
unsigned char ttl=255;
setsockopt(recv_sockfd,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));
int loop=0;
if(setsockopt(recv_sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) <0)
{
close(recv_sockfd);
return -1;
}
if(bind(recv_sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
{
close(recv_sockfd);
return -1;
}
unsigned int value = 1;
if(setsockopt(recv_sockfd, SOL_SOCKET, SO_REUSEADDR,(void *)&value,sizeof(value)) <0)
{
close(recv_sockfd);
return -1;
}
set_nonblocking(recv_sockfd);
*pSockfd =recv_sockfd;
return 0;
}
发送端
int init_send_socket( )
{
bzero(&mreq, sizeof (struct ip_mreq));
mreq.sin_family = AF_INET;
mreq.sin_addr.s_addr= inet_addr(MCAST_ADDR);
mreq.sin_port = htons(MCAST_PORT);
if((g_send_socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("Create socket failed!");
return -1;
}
unsigned char ttl=255;
setsockopt(g_send_socket_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,sizeof(ttl));
int loop=0;
if(setsockopt(g_send_socket_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) <0)
{
close(g_send_socket_fd);
return -1;
}
unsigned int value = 1;
if(setsockopt(g_send_socket_fd, SOL_SOCKET, SO_REUSEADDR,(void *)&value,sizeof(value)) <0)
{
close(g_send_socket_fd);
return -1;
}
set_nonblocking(g_send_socket_fd);
return 0;
}