#include #include int CreateUdpSocket(int port) { int sock = socket(PF_INET, SOCK_DGRAM, 0); if (sock < 0) { printf("could not create socket\n"); return -11; } struct sockaddr_in sock_addr; memset(&sock_addr, 0, sizeof(sock_addr)); sock_addr.sin_family = AF_INET; sock_addr.sin_port = htons(port); sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); if ((bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr))) < 0) { printf("could not bind socket\n"); return -1; } // success return sock; } int JoinMulticastGroup(int sock, const char* groupIP) { struct ip_mreq groupV4; memset(&groupV4, 0, sizeof(groupV4)); groupV4.imr_multiaddr.s_addr = inet_addr(groupIP); groupV4.imr_interface.s_addr = htonl(INADDR_ANY); if(setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &groupV4, sizeof(groupV4)) != 0) { printf("setting option IP_ADD_MEMBERSHIP failed\n"); return -1; } // success return 0; } int main() { // create echo socket used to check responsiveness int echosock = CreateUdpSocket(5000); if (echosock < 0) return echosock; // create multicast socket int mcastsock = CreateUdpSocket(5001); if (mcastsock < 0) return mcastsock; int ret = JoinMulticastGroup(mcastsock, "224.0.0.22"); if (ret < 0) return ret; // run indefinitely to handle the echo socket while (1) { char buffer[500]; // read content into buffer from an incoming client struct sockaddr_in client_address; socklen_t client_address_len = sizeof(client_address); // receive data... int len = recvfrom(echosock, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_address, &client_address_len); // ... trace it... buffer[len] = '\0'; printf("received: '%s' from client %s\n", buffer, inet_ntoa(client_address.sin_addr)); // ... and send it back sendto(echosock, buffer, len, 0, (struct sockaddr *)&client_address, sizeof(client_address)); } // never reached return 0; }