///////////////////////////////////////////////////////////////////////////// // Rev 11/12/2003 // // // SENDMULTICAST.C // --------------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // //Sending an IP Multicast Datagram Sample //The following sample application shows how to send 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 DEST_MCAST "234.5.6.7" #define DESTINATION_PORT 4567 #define SOURCE_PORT 0 int main() { int iOptVal = 64; char szMessage[] = "Multicasting message!"; // Sent message string SOCKET Sock = INVALID_SOCKET; // Datagram window socket SOCKADDR_IN source_sin, // Source socket address dest_sin; // Destination socket address #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 window socket, Sock. if ((Sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { printf( "Allocating socket failed! Error: %d", SOCKET_ERRNO); return FALSE; } // Fill out source socket's address information. source_sin.sin_family = AF_INET; source_sin.sin_port = htons (SOURCE_PORT); source_sin.sin_addr.s_addr = htonl (INADDR_ANY); // Associate the source socket's address with the socket, Sock. if (bind (Sock, (struct sockaddr FAR *) &source_sin, sizeof (source_sin)) == SOCKET_ERROR) { printf( "Binding socket failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } // Set the Time-to-Live of the multicast. if (setsockopt (Sock, IPPROTO_IP, IP_MULTICAST_TTL, (char FAR *)&iOptVal, sizeof (int)) == SOCKET_ERROR) { printf( "setsockopt failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } // Fill out the desination socket's address information. dest_sin.sin_family = AF_INET; dest_sin.sin_port = htons (DESTINATION_PORT); dest_sin.sin_addr.s_addr = inet_addr (DEST_MCAST); // Send a message to the multicasting address. if (sendto (Sock, szMessage, strlen (szMessage) + 1, 0, (struct sockaddr FAR *) &dest_sin, sizeof (dest_sin)) == SOCKET_ERROR) { printf( "sendto failed! Error: %d\n", SOCKET_ERRNO); closesocket (Sock); return FALSE; } // Disable sending on Sock before closing it. shutdown (Sock, 0x01); // Close Sock. closesocket (Sock); return TRUE; }