私はUDPSenderとUDPReceiverの2つのクラスを持っています。
Senarios:
(1)LinuxのQNXとUDPReceiverでUDPSenderを実行すると動作します。
(2)WindowsXPのQNXとUDPReceiverでUDPSenderを実行すると動作しません(しかし、Wiresharkを使用しているUDPデータグラムを見ると、SenderはSenario(1)のように動作します)
(3) Windows。
i)送信者が127.0.0.1にUDPメッセージを送信する場合、Receiverはメッセージを受信できます。
ii)送信者がUDPメッセージを192.168.1.137(ネットワークのローカルアドレス)に送信する場合、受信者は受信できません。
boost :: asio UDP Windowsでメッセージを受け取る方法は?
私の質問は:
私が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ソケットを初期化しようとしました。 –