2012-02-18 9 views
4

私は情報を収集し、ローカルネットワークを介していくつかのメッセージをブロードキャストするサーバーを持っています。私はboost::asioを使用してUDP経由でこれらのパケットをポート8079にブロードキャストし、WireSharkでこれらのパケットが実際に意図したとおりにブロードキャストされていることを確認できます。boost :: asioでUDPポートを聞くことに失敗しました

自然に、私はこれらのメッセージに反応するリスナーにフォローアップしたいと思いますが、私は何かを受け取るのに苦労しています。私の現在のアプローチは:

boost::asio::io_service io_service; 
boost::asio::ip::udp::socket socket(io_service); 
boost::asio::ip::udp::endpoint local(
    boost::asio::ip::address::from_string("192.168.2.102"), 
    8079); 
boost::system::error_code error; 

std::cout << "Local bind: " << local << std::endl; 

socket.open(boost::asio::ip::udp::v4(), error); 
if(!error) { 
    socket.bind(local); 
    boost::array<char, 2048> buf; 
    boost::asio::ip::udp::endpoint server; 
    std::cout << "Listening..." << std::endl; 
    while(true) { 
     size_t len = socket.receive_from(boost::asio::buffer(buf), server); 
     std::cout << "Received data:" << std::endl; 
     std::cout.write(buf.data(), len); 
     std::cout << std::endl; 
    } 
} 

私は何も受け取っていません。デバッガを使用して、私はちょうどreceive_fromに詰め込まれていることがわかりました。なぜか分かりません。

これらの問題を引き起こす可能性があるかどうかわからない情報(主にWiresharkから):サーバーとクライアントが同じマシンで実行されています。サーバーは88 bytesメッセージをポート34050(送信元)から8079(送信先)に2秒ごとに送信しています。 192.168.2.102は、ローカルネットワーク内のマシンのIPです。

+1

ローカルエンドポイントアドレスに「0.0.0.0」または「ip :: address_v4 :: any」を試してください。 –

+0

受信機は特定のネットワークインターフェースにバインドする必要がありますか? –

+0

@Emile Cormier 'ip :: address_v4 :: any()'は、 '0.0.0.0:8079'にバインドされている以外は何も変更しません。あなたの2番目の質問に関しては、あなたが聞きたいポートを指定するために 'bind'が必要だと思います。私が間違っている? – nijansen

答えて

4

IIRCブロードキャストパケットを受信するには、INADDR_ANYにバインドする必要があります。この問題については、Linux message listsに議論があります。これを超えて、両方のコンピュータでネットマスクが一致することを確認します。ブロードキャストが192.168.255.255になり、クライアントのネットマスクが255.255.255.0の場合、パケットは受信されません。

-2

データを受信して​​も完了ハンドラが呼び出されないように、任意のスレッドでio_service :: runを呼び出さないでください。

+0

完了ハンドラはありません。通信は同期しています。 – cirrusio