![](/img/trans.png)
[英]How to receive a UDP broadcast sent to 255.255.255.255 using boost asio?
[英]boost::asio UDP how to receive messages on Windows?
我有兩個類 UDPSender 和 UDPReceiver。
場景:
(1) 當我在 QNX 中運行 UDPSender 和在 Linux 中運行 UDPReceiver 時,它可以工作。
(2) 當我在 QNX 中運行 UDPSender 和在 WindowsXP 中運行 UDPReceiver 時,它不起作用。(但我看到使用 Wireshark 的 UDP 數據報,這意味着 Sender 在 Senario(1) 中工作)
(3)它在 Windows 中部分工作。
i) 如果我使用 Sender 發送 UDP 消息到 127.0.0.1,Receiver 可以收到消息
ii) 如果我使用 Sender 將 UDP 消息發送到 192.168.1.137(網絡中的本地地址),Receiver 將無法接收。
我的問題是:
如何讓接收器在 Windows 上工作?
一些代碼:
UDPReceiver::UDPReceiver( boost::asio::io_service& service, unsigned short port )
: m_service( service ),
m_socket( service, udp::endpoint(udp::v4(), port)),
m_peerEndpoint(),
m_buffer(),
m_messageReceipient()
{
}
void UDPReceiver::SetMessageReceipient( const boost::function<void(const char*, unsigned int)>& r )
{
m_messageReceipient = r;
}
void UDPReceiver::Start()
{
m_socket.async_receive_from(
boost::asio::buffer(m_buffer, m_buffer.size()), m_peerEndpoint,
boost::bind( &UDPReceiver::HandleReceived, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void UDPReceiver::Stop()
{
m_socket.close();
}
void UDPReceiver::HandleReceived( const boost::system::error_code& error, size_t bytesReceived )
{
assert( !m_messageReceipient.empty() );
if( error ) {
LOG( Comms, Error, "UDPReceiver:" << error.message() );
}
else {
m_messageReceipient( &m_buffer.front(), bytesReceived );
m_socket.async_receive_from(
boost::asio::buffer(m_buffer, m_buffer.size()), m_peerEndpoint,
boost::bind( &UDPReceiver::HandleReceived, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
它可能被 Windows 防火牆阻止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.