Code:
Multicast Client:
...
/* Resolve destination address for multicast datagrams */
memset(&Hints, 0, sizeof (Hints));
Hints.ai_family = PF_INET6;
Hints.ai_socktype = SOCK_DGRAM;
Hints.ai_protocol = IPPROTO_UDP;
Hints.ai_flags = AI_NUMERICHOST;
RetVal = getaddrinfo("FF02::1", "7093", &Hints, &multicastAddr);
if (RetVal != 0) {
/* error handling */ }
AI = multicastAddr;
ServSock[i] = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol);
/* Set TTL limit */
multicastTTL = 1;
if ( setsockopt(ServSock[i],IPPROTO_IPV6, IPV6_MULTICAST_HOPS ,
(char*) &multicastTTL, sizeof(multicastTTL)) != 0 ) {
/* Error handling */
}
RetVal = sendto(ServSock[i], Buffer, AmountToSend, 0,
(LPSOCKADDR) AI->ai_addr, AI->ai_addrlen);
if (RetVal == SOCKET_ERROR) {
/* Error handling */
}
.....
AmountRead = recvfrom(ServSock[i], Buffer, sizeof (Buffer), 0,
(LPSOCKADDR) &From, &Fromlen);
if (AmountRead == SOCKET_ERROR) {
/* Error handling */
}
/*********** Here is the issue
Program never comes out of recvfrom () ***/
Server code:
**********
/* Resolve the multicast group address - For joining the group */
memset(&MulticastHints, 0, sizeof(MulticastHints));
MulticastHints.ai_family = PF_INET6;
MulticastHints.ai_flags = AI_NUMERICHOST;
RetVal = getaddrinfo("FF02::1", NULL, &MulticastHints, &multicastAddr);
if (RetVal != 0) {
/* Error hanlding */ }
/* Get a local address for IPv6 family */
memset(&LocalHints, 0, sizeof (MulticastHints));
LocalHints.ai_family = PF_INET6;
LocalHints.ai_socktype = SOCK_DGRAM;
LocalHints.ai_protocol = IPPROTO_UDP;
LocalHints.ai_flags = AI_PASSIVE;
RetVal = getaddrinfo(NULL, Port, &LocalHints, &localAddr);
if (RetVal != 0) {
/* Error hanlding */
}
AI = localAddr;
...
ServSock[i] = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol);
bind(ServSock[i], AI->ai_addr, AI->ai_addrlen);
RetVal = join_multicast_group(ServSock[i], &((struct sockaddr_in6*)(multicastAddr->ai_addr))->sin6_addr,
((struct sockaddr_in6*)(multicastAddr->ai_addr))->sin6_scope_id);
if (RetVal != 0) {
/* Error handling */
}
...
AmountRead = recvfrom(ServSock[i], Buffer, sizeof (Buffer), 0,
(LPSOCKADDR) &From, &FromLen);
...
RetVal = sendto(ServSock[i], Buffer, AmtSend, 0,
(LPSOCKADDR) &From, FromLen);
...
leave_multicast_group(ServSock[i], &((struct sockaddr_in6*)(multicastAddr->ai_addr))->sin6_addr);
closesocket(ServSock[i]);
...