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
|
static int init_connection(const char *address, SOCKADDR_IN *sin, struct ip_mreq *mreq)
{
/* UDP so SOCK_DGRAM */
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
struct hostent *hostinfo;
u_int yes=1; /*** MODIFICATION TO ORIGINAL */
if(sock == INVALID_SOCKET)
{
perror("socket()");
exit(errno);
}
hostinfo = gethostbyname(address);
if (hostinfo == NULL)
{
fprintf (stderr, "Unknown host %s.\n", address);
exit(EXIT_FAILURE);
}
/**** MODIFICATION TO ORIGINAL */
/* allow multiple sockets to use the same PORT number */
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes)) < 0) {
perror("Reusing ADDR failed");
exit(1);
}
/*** END OF MODIFICATION TO ORIGINAL */
/*(*sin).sin_addr.s_addr = htonl(INADDR_ANY);//*(IN_ADDR *) hostinfo->h_addr;
(*sin).sin_port = htons(PORT);
(*sin).sin_family = AF_INET;
*/
sin->sin_addr.s_addr = htonl(INADDR_ANY);//*(IN_ADDR *) hostinfo->h_addr;
sin->sin_port = htons(PORT);
sin->sin_family = AF_INET;
int error=bind(sock,(struct sockaddr *) sin,sizeof(sin));
printf("error=%d",error);
if (error < 0) {
perror("bind");
exit(1);
}
/* use setsockopt() to request that the kernel join a multicast group */
mreq->imr_multiaddr.s_addr=inet_addr(address);
mreq->imr_interface.s_addr=htonl(INADDR_ANY);
if (setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*) mreq,sizeof(mreq)) < 0) {
perror("setsockopt");
exit(1);
}
return sock;
} |
Partager