【问题标题】:boost::asio UDP how to receive messages on Windows?boost::asio UDP 如何在 Windows 上接收消息?
【发布时间】:2011-07-06 01:41:03
【问题描述】:

我有两个类 UDPSender 和 UDPReceiver。
场景:
(1)当我在 QNX 中运行 UDPSender 和在 Linux 中运行 UDPReceiver 时,它可以工作。
(2)当我在 QNX 中运行 UDPSender 和在 WindowsXP 中运行 UDPReceiver 时,它不起作用。(但我看到使用 Wireshark 的 UDP 数据报,这意味着 Sender 在 Senario(1) 中工作)
(3)它在 Windows 中部分工作。
i) 如果我使用 Sender 向 127.0.0.1 发送 UDP 消息,则 Receiver 可以获得消息
ii) 如果我使用 Sender 向 192.168.1.137(网络中的本地地址)发送 UDP 消息,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));
    }
}

【问题讨论】:

  • 在 Senario(3) 中,我也尝试使用本地地址初始化 udp 套接字,结果相同。

标签: c++ udp boost-asio


【解决方案1】:

它可能被 Windows 防火墙阻止了。

【讨论】:

  • 与我们的网络支持人员交谈后,很有可能。但是愚蠢的公司笔记本电脑不允许我配置或查看任何内容。我会试试我同事的笔记本电脑(装有 Windows 7)看看。谢谢。
  • 它正在我同事的笔记本电脑(Windows 7)上运行!他的防火墙是可管理的。问题解决了,笨蛋!谢谢!!