1.创建socket socketfd = socket(AF_INET, SOCK_DGRAM, 0); 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 (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"); } 4.退出多播组 if (setsockopt(socketfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &command, sizeof(command)) < 0) { perror("setsockopt: IP_DROP_MEMBERSHIP"); } close(socketfd);