2012-02-18 79 views
4

我有一个服务器收集信息并在本地网络上广播一些消息。我使用boost::asio在端口8079上通过UDP广播这些数据,我可以使用WireShark验证这些数据包是否按照预期实际播出。无法听到UDP端口与升压:: asio

现在,我想跟进一个能够对这些消息作出反应的监听器,但我正在努力接收任何东西。我目前的做法是:

boost::asio::io_service io_service; 
boost::asio::ip::udp::socket socket(io_service); 
boost::asio::ip::udp::endpoint local(
    boost::asio::ip::address::from_string("192.168.2.102"), 
    8079); 
boost::system::error_code error; 

std::cout << "Local bind: " << local << std::endl; 

socket.open(boost::asio::ip::udp::v4(), error); 
if(!error) { 
    socket.bind(local); 
    boost::array<char, 2048> buf; 
    boost::asio::ip::udp::endpoint server; 
    std::cout << "Listening..." << std::endl; 
    while(true) { 
     size_t len = socket.receive_from(boost::asio::buffer(buf), server); 
     std::cout << "Received data:" << std::endl; 
     std::cout.write(buf.data(), len); 
     std::cout << std::endl; 
    } 
} 

但我从来没有收到任何东西。使用调试器,我发现我只是永远卡在receive_from中,我不知道为什么。

一些进一步的信息(主要来自Wireshark),我不知道它是否会导致这些问题:服务器和客户端在同一台机器上运行。服务器正在从端口34050(源)发送一个88 bytes消息,每两秒发送一次到8079(目标)。 192.168.2.102是本地网络内机器的IP地址。

+1

为本地端点地址尝试使用“0.0.0.0”或“ip :: address_v4 :: any”。 – 2012-02-18 04:15:41

+0

您的接收器是否需要绑定到特定的网络接口? – 2012-02-18 04:39:14

+0

@Emile Cormier'ip :: address_v4 :: any()'除了绑定到'0.0.0.0:8079'外不会改变任何东西。关于你的第二个问题,我认为'绑定'是指定你想要监听的端口所必需的;我错了吗? – nijansen 2012-02-18 12:01:20

回答

4

IIRC,您必须绑定到INADDR_ANY才能接收广播数据包。在讨论这个问题时,有很多讨论Linux message lists。除此之外,请确保两个计算机上的网络掩码相匹配。如果广播去192.168.255.255,并且你的客户端网络掩码是255.255.255.0,你将不会收到数据包。

-2

您不会在任何线程上调用io_service :: run,因此即使收到数据,也不会调用完成处理程序。

+0

没有完成处理程序 - 通信是同步的。 – cirrusio 2017-04-27 22:50:53