2016-09-23 117 views
3

当我在UDP服务器上工作时,我通常将套接字设置为侦听指定的端口并接受任何IP。请记住,同步接收在这里正常工作。Boost Asio UDP服务器套接字侦听指定的IP

std::unique_ptr<boost::asio::ip::udp::socket> socketUDP;  
socketUDP.reset(new udp::socket(io_serviceUDP, udp::endpoint(udp::v4(), 9999))); 

但是,我真的很想有2个不同的服务器应用程序监听相同的端口(9999),但只接受一个单一的IP(我已经知道了IP)。每个应用程序都有自己的客户端,拥有自己的IP。 但由于某些原因如下不起作用(不接受在应用程序的任何数据包,而Wireshark的可以看到它)

socketUDP.reset(new udp::socket(m_io_serviceUDP, udp::endpoint(asio::ip::address::from_string("169.254.1.2"), 9999))); 

请注意: 1)按照答案:Issue with broadcast using Boost.Asio这应该实际上工作。当然,我的理解是不完全正确的,因为我失去了一些东西

2)所提供的IP是有效的,工作的,发送数据(通过Wireshark的确认),并能够被ping通

+0

做你现在的工作?我使用Boost 1.66的UDP组播样本,它工作。 – CaTx

回答

1

的问题是,您socketUDP的没有配置:

set_option(boost::asio::ip::udp::socket::reuse_address(true)); 

然而,简单地调用上面你的插座线将无法正常工作,因为你必须套接字绑定到端点之前调用reuse_address......但你正在构建udp::socketendpoint打开它将其绑定到端点,请参阅basic_datagram_socket

解决方法是调用只需要io_service的构造函数;打开它,它设置reuse_address选项,然后bind,例如:

// construct the socket 
boost::asio::ip::udp::socket socket_(io_service_); 

// open it 
boost::asio::ip::udp::endpoint rx_endpoint_(udp::v4(), 9999); 
socket_.open(rx_endpoint_.protocol(), error); 
if (error) 
    return false; 

// then set it for reuse and bind it 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(rx_endpoint_, error); 
if (error) 
    return false; 

// set multicast group, etc. 
socket_.set_option(boost::asio::ip::multicast::join_group(ip_address)); 
... 
+0

我认为这真的很棒,但它解决了之后会发生的问题。现在即使1台服务器也不能使用指定的IP。 – Arrr

+0

我很抱歉听到@ Arrr ..有一些代码为'UDP'接收器工作(据我所知)[这里](https://github.com/kenba/via-httplib/tree/master /包含/经由/通讯)。它仅为'TCP'套接字记录,但只需用'udp_adaptor'替换'tcp_adaptor'并调用'receive_multicast'函数。顺便说一下,你听的是哪个端口:'9999'或'4747'? – kenba