Beispiel #1
0
	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;
	}