1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#include "multiSocketRcvfrom.h"
int multiSocketRcfrom(int port_dest, char *rcv_ip_addr){
int 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 succeed.\n");
}
else
{
printf( "WSAStartup failed! Error: %d\n", SOCKET_ERRNO);
return FALSE;
}
#endif
// Create a datagram socket, Sock.
if ((Sock = socket (AF_INET, SOCK_DGRAM, 0)) != -1)
{
printf( "Allocating socket succeed.\n");
}
else
{
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 (port_dest);
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 (rcv_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)) != -1)
{
printf("successful message reception.\n");
szMessage[cb] = 0;
printf( szMessage );
}
else
{
printf( "recvfrom failed! Error: %d\n", SOCKET_ERRNO);
closesocket (Sock);
return FALSE;
}
// Disable receiving on Sock before closing it.
shutdown (Sock, 0x00);
// Close Sock.
closesocket (Sock);
return TRUE;
} |
Partager