我有两个类UDPSender和UDPReceiver。
Senarios:
(1)当我在QNX中运行UDPSender和在Linux中运行UDPReceiver时,它可以工作。
(2)当我在QNX中运行UDPSender和WindowsXP中运行UDPReceiver时,它不起作用。(但是我看到使用Wireshark的UDP数据报,这意味着Sender在Senario(1)中工作)
(3)在Windows中部分起作用。
    i)如果我使用发送方将UDP消息发送到127.0.0.1,则Receiver可以获取消息
    ii)如果我使用发送方将UDP消息发送到192.168.1.137(网络中的本地地址),则Receiver无法接收。

我的问题是:

如何使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防火墙可能已将其阻止。

关于c++ - boost::asio UDP如何在Windows上接收消息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6590683/

10-17 01:16
查看更多