これがすでにどこかで回答されている場合は申し訳ありませんが、ここで私の人生に適切な回答を見つけることができないようです.
私の問題は次のとおりです。イーサネット インターフェイスを備えた組み込みアプリケーションを開発しています。デバイスの IP がわからない場合でも、ネットワーク上でこれらのデバイスを検出し、それらの IP を構成できる必要があります。私の意図するアプローチは次のとおりです。
- 指定されたコマンドを含む PC からブロードキャスト パケット (255.255.255.255) を送信します (送信元ポート HOST_PORT、宛先ポート DEVICE_PORT から)。
- デバイスがブロードキャスト パケットでそのコマンドをリッスンするようにします。次に、デバイスは、ポート DEVICE_PORT からポート HOST_PORT への独自のブロードキャスト パケットで応答します。
- 私のアプリは、シリアル番号などの一連の情報を含む応答パケットを受信し、ネットワーク上のすべてのデバイスを列挙します。
(1) と (2) は動作していますが、PC でブロードキャスト パケットを受信しようとすると問題が発生します。パケットが実際にネットワークに正しくヒットしていることを Wireshark で確認したので、ブーストの使用法に問題があるに違いありません。
私が使用しているコードのスニペットは次のとおりです。
using namespace boost::asio;
io_service my_io_service; // Create socket and IO service, bind socket to endpoint.
ip::udp::socket socket(my_io_service);
socket.open(ip::udp::v4());
ip::udp::endpoint localEndpoint(ip::address_v4::any(), HOST_PORT );
ip::udp::endpoint remoteEndpoint(ip::address_v4::broadcast(), DEVICE_PORT );
socket.bind( localEndpoint );
socket.connect( remoteEndpoint );
socket_base::broadcast option(true);
socket.set_option(option);
TXMessage.str("");
TXMessage << "RECQRE" << (i++);
socket.send(buffer(TXMessage.str().c_str(), TXMessage.str().length()));
len = socket.receive(buffer(RXBuffer, (BUFFER_SIZE-1)));
アプリは単に socket.recieve(...) 呼び出しをロックします。このコードまたは構成で明らかな問題が見られる人はいますか? 私は適切にバインドして接続していると信じており、「ブロードキャスト」オプションを設定していることを知っています。
あるいは、私のデバイス識別問題に対する別の解決策の方向性を教えていただけると幸いです。
編集: 私がすでにチェックしたこと:
- 私はINADDR_ANYにバインドしています
- Windows ファイアウォールが無効になっています
- アプリケーションは、Wireshark を実行せずにテストされています
- リモート デバイスは正常に動作しています (これを確認するためのシリアル デバッグ接続があります)。