2016-09-23 23 views
3

私は通常、指定したポートでリッスンして任意のIPを受け入れるようにソケットを設定します。同期受信はここで正しく動作することに注意してください。Boost Asio指定されたIPでリッスンするソケットを設定するサーバ

std::unique_ptr<boost::asio::ip::udp::socket> socketUDP;  
socketUDP.reset(new udp::socket(io_serviceUDP, udp::endpoint(udp::v4(), 9999))); 

しかし、私は本当に同じポート(9999)でリスニングだけ、単一のIPを受け入れる2つの異なるサーバーアプリケーションを持っていると思います(私はすでにIPことを知っています)。各アプリは独自のIPを持つ独自のクライアントを持っています。 しかし、いくつかの理由のために、以下は

socketUDP.reset(new udp::socket(m_io_serviceUDP, udp::endpoint(asio::ip::address::from_string("169.254.1.2"), 9999))); 

は注意してください(Wiresharkのは、それを見ることができますが、アプリ内の任意のパケットを受信して​​いません)動作しません。 1)ための答えによると:Issue with broadcast using Boost.Asioこれは実際に動作するはずです。もちろん、私の理解では、私が何か

2)提供IPが有効であることを欠けているように、非常に正確ではありません動作しますが、データは(wiresharkので確認)、問題があることである

+0

あなたはそれが今で働いていますか? Boost 1.66のUDPマルチキャストのサンプルを使用しています。 – CaTx

答えて

1

pingを実行することができ送りますあなたsocketUDP年代はで構成されていません。しかし

set_option(boost::asio::ip::udp::socket::reuse_address(true)); 

、あなたがソケットがエンドポイントにバインドされる前に、reuse_addressを呼び出す必要がありますので、単純に、動作しませんあなたのソケットに上記の行を呼び出す...しかし、あなたは工事中ですそれを開くendpointのは、およびは、それをエンドポイントにバインドします。basic_datagram_socketを参照してください。

解決策は、ただio_serviceを取るコンストラクタを呼び出すことです。 、それを開くreuse_addressオプションを設定し、その後、bindにそれは、例えば:

// construct the socket 
boost::asio::ip::udp::socket socket_(io_service_); 

// open it 
boost::asio::ip::udp::endpoint rx_endpoint_(udp::v4(), 9999); 
socket_.open(rx_endpoint_.protocol(), error); 
if (error) 
    return false; 

// then set it for reuse and bind it 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(rx_endpoint_, error); 
if (error) 
    return false; 

// set multicast group, etc. 
socket_.set_option(boost::asio::ip::multicast::join_group(ip_address)); 
... 
+0

私はそれが本当に素晴らしいコメントだと思っていますが、その後起こる問題に取り組んでいます。現在、1台のサーバでも、指定したIPで動作しません。 – Arrr

+0

@ Arrrを聞いて申し訳ありません。(私の知る限り)[ここ](https://github.com/kenba/via-httplib/tree/master)で動作する 'UDP '受信機のコードがあります/ include/via/comms)。 'TCP'ソケットについてのみ書かれていますが、' tcp_adaptor'を 'udp_adaptor'に置き換え、' receive_multicast'関数を呼び出してください。ところで、あなたが聞いているポートは '9999'か' 4747'ですか? – kenba

関連する問題