///////////////////////////////////////////////////////////////////////////// // Rev 11/12/2003 // // // RECVMULTICAST.C // --------------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // //Receiving an IP Multicast Datagram Sample //The following sample application shows how to receive an IP multicast datagram. // ///////////////////////////////////////////////////////////////////////////// #ifdef _WIN32 #include #include #else #include /* printf(), snprintf() */ #include /* strtol(), exit() */ #include #include /* socket(), setsockopt(), bind(), recvfrom(), sendto() */ #include /* perror() */ #include /* IPPROTO_IP, sockaddr_in, htons(), htonl() */ #include /* inet_addr() */ #include /* fork(), sleep() */ #include /* uname() */ #include /* memset() */ #define SOCKET int #define FAR #define FALSE 0 #define TRUE 1 #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define SOCKADDR_IN struct sockaddr_in #define closesocket close #endif #ifdef _WIN32 #define SOCKET_ERRNO WSAGetLastError() #else #define SOCKET_ERRNO errno #endif #define RECV_IP_ADDR "234.5.6.7" #define DEST_PORT 4567 int main() { int index = 0, // Integer index iRecvLen, cb; // Length of recv_sin char szMessage[100]; // ASCII string SOCKET Sock = INVALID_SOCKET; // Datagram window socket struct ip_mreq mreq; // Used in adding or dropping // multicasting addresses SOCKADDR_IN local_sin, // Local socket's address recv_sin; // Holds the source address upon // recvfrom function returns #ifdef _WIN32 WSADATA WSAData; // Contains details of the // Winsock implementation // Initialize Winsock. if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { printf( "WSAStartup failed! Error: %d\n", SOCKET_ERRNO); return FALSE; } #endif // Create a datagram socket, Sock. if ((Sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { printf( "Allocating socket failed! Error: %d\n", SOCKET_ERRNO); return FALSE; } // Fill out the local socket's address information. local_sin.sin_family = AF_INET; local_sin.sin_port = htons (DEST_PORT); local_sin.sin_addr.s_addr = htonl (INADDR_ANY); // Associate the local address with Sock. if (bind (Sock, (struct sockaddr FAR *) &local_sin, sizeof (local_sin)) == SOCKET_ERROR) { printf( "Binding socket failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } // Join the multicast group from which to receive datagrams. mreq.imr_multiaddr.s_addr = inet_addr (RECV_IP_ADDR); mreq.imr_interface.s_addr = INADDR_ANY; if (setsockopt (Sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&mreq, sizeof (mreq)) == SOCKET_ERROR) { printf( "setsockopt failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } iRecvLen = sizeof (recv_sin); // Receive data from the multicasting group server. if( (cb = recvfrom (Sock, szMessage, 100, 0, (struct sockaddr FAR *) &recv_sin, &iRecvLen)) == SOCKET_ERROR) { printf( "recvfrom failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } else { szMessage[cb] = 0; printf( szMessage ); } // Disable receiving on Sock before closing it. shutdown (Sock, 0x00); // Close Sock. closesocket (Sock); return TRUE; }