1.创建socket
socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == socketfd)
{
perror("Opening socket");
exit(EXIT_FAILURE);
}
if (-1 == socketfd)
{
perror("Opening socket");
exit(EXIT_FAILURE);
}
2.设置socket可重用并绑定
loop = 1;
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: SO_REUSEADDR");
exit(EXIT_FAILURE);
}
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: SO_REUSEADDR");
exit(EXIT_FAILURE);
}
if (bind(socketfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
perror("bind");
exit(EXIT_FAILURE);
}
3.设置多播地址并加入多播组
struct ip_mreq command;
loop = 1;
if (setsockopt(socketfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: IP_MULTICAST_LOOP");
exit(EXIT_FAILURE);
}
command.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
command.imr_interface.s_addr = htonl(INADDR_ANY);
if (command.imr_multiaddr.s_addr == -1)
{
perror("224.0.0.1 not a legal multicast address.");
exit(EXIT_FAILURE);
}
if (setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(command)) < 0)
{
perror("setsockopt: IP ADD_MEMBERSHIP");
}
if (setsockopt(socketfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: IP_MULTICAST_LOOP");
exit(EXIT_FAILURE);
}
command.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
command.imr_interface.s_addr = htonl(INADDR_ANY);
if (command.imr_multiaddr.s_addr == -1)
{
perror("224.0.0.1 not a legal multicast address.");
exit(EXIT_FAILURE);
}
if (setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(command)) < 0)
{
perror("setsockopt: IP ADD_MEMBERSHIP");
}
4.退出多播组
if (setsockopt(socketfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &command, sizeof(command)) < 0)
{
perror("setsockopt: IP_DROP_MEMBERSHIP");
}
close(socketfd);
{
perror("setsockopt: IP_DROP_MEMBERSHIP");
}
close(socketfd);