У меня есть два класса UDPSender и UDPReceiver.Senarios:(1) Это работает, когда я запускаю UDPSender в QNX и UDPReceiver в Linux.(2) Он не работает, когда я запускаю UDPSender в QNX и UDPReceiver в WindowsXP (но я вижу дейтаграммы UDP с помощью Wireshark, то есть Sender работает так же, как в Senario (1))(3) Он частично работает в Windows.i) если я использую отправителя, отправляющего UDP-сообщения на 127.0.0.1, получатель может получать сообщенияii) если я использую отправителя, отправляющего 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));
}
}