receiver(boost::asio::io_service& io_service, const boost::asio::ip::address& listen_address, const boost::asio::ip::address& multicast_address) : socket_(io_service) { // Create the socket so that multiple may be bound to the same address. boost::asio::ip::udp::endpoint listen_endpoint( listen_address, multicast_port); socket_.open(listen_endpoint.protocol()); socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); socket_.bind(listen_endpoint); // Join the multicast group. socket_.set_option( boost::asio::ip::multicast::join_group(multicast_address)); socket_.async_receive_from( boost::asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&receiver::handle_receive_from, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }
SC_UdpInPort(struct World * world, int inPortNum): mWorld(world), mPortNum(inPortNum), udpSocket(ioService) { using namespace boost::asio; BOOST_AUTO(protocol, ip::udp::v4()); udpSocket.open(protocol); udpSocket.bind(ip::udp::endpoint(protocol, inPortNum)); boost::asio::socket_base::send_buffer_size option(65536); udpSocket.set_option(option); #ifdef USE_RENDEZVOUS if (world->mRendezvous) { thread thread( boost::bind( PublishPortToRendezvous, kSCRendezvous_UDP, sc_htons(mPortNum) ) ); mRendezvousThread = std::move(thread); } #endif startReceiveUDP(); }