void Bind( const IpEndpointName& localEndpoint ) { struct sockaddr_in bindSockAddr; SockaddrFromIpEndpointName( bindSockAddr, localEndpoint ); // KEVIN: allow for multicast SetAllowReuse(true); struct ip_mreq group; if (localEndpoint.IsMulticastAddress()) { group.imr_interface.s_addr = htonl(INADDR_ANY); group.imr_multiaddr.s_addr = bindSockAddr.sin_addr.s_addr; if (setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) { throw std::runtime_error("error adding multicast group\n"); closesocket(socket_); // winsock2 equivalent of close() exit(1); } } bindSockAddr.sin_addr.s_addr = INADDR_ANY; // KEVIN: the above line needs to be added for winsock2, otherwise bind // will fail with error 10049 WSAEADDRNOTAVAIL // solution suggested from: http://www.sockets.com/err_lst1.htm#WSAEADDRNOTAVAIL if (bind(socket_, (struct sockaddr *)&bindSockAddr, sizeof(bindSockAddr)) < 0) { throw std::runtime_error("unable to bind udp socket\n"); } isBound_ = true; }
void Bind( const IpEndpointName& localEndpoint ) { struct sockaddr_in bindSockAddr; SockaddrFromIpEndpointName( bindSockAddr, localEndpoint ); if (localEndpoint.IsMulticastAddress()) { group.imr_interface.s_addr = htonl(INADDR_ANY); group.imr_multiaddr.s_addr = bindSockAddr.sin_addr.s_addr; if (setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) { throw std::runtime_error("error adding multicast group\n"); close(socket_); } } if (bind(socket_, (struct sockaddr *)&bindSockAddr, sizeof(bindSockAddr)) < 0) { throw std::runtime_error("unable to bind udp socket\n"); } isBound_ = true; }