0

産業環境で LAN 経由で使用するピアツーピア通信ネットワークを開発しています。一部のメッセージは単に非同期であり、応答を必要としません。その他はリクエスト-レスポンスです。要求メッセージ (および非同期メッセージ) はマルチキャスト グループに送信され、要求への応答はユニキャストで送信されます。したがって、各エンドポイントは、マルチキャスト グループに送信された UDP パケットを受信し、プレーン ユニキャストを使用して送信されたばかりのメッセージも受信します。

これまでのところ正常に動作していますが、受信したUDPパケットの宛先アドレスを見つける方法がboost::asioにはないようです(socket.async_receive_fromを使用)-マルチキャストグループに送信されたか、実際のインターフェース。メッセージの内容から、マルチキャストで送信されたのかユニキャストで送信されたのかを推測できますが、宛先アドレスも確認できると便利です。

現在は Windows 7 を使用していますが、将来的には Linux に移行する予定です。

boost::asio を使用して受信した UDP パケットの宛先アドレスを見つける方法はありますか?

4

1 に答える 1

2

残念ながら、これは boost::asio では不可能であり、アプリケーション層でトランスポート層の情報にアクセスしようとするため、通常は「実行する方法」ではありません。

したがって、基本的に2つのオプションがあります。

a) Linux の IP_PKTINFO や SO_BINDTODEVICE などを使用して、移植性のないシステム コードを記述します。コードの例は、boost asio メーリング リストのこちらにあります。

b) マルチキャスト用とユニキャスト用の 2 つの異なるソケットを使用します。したがって、各ソケットで「0.0.0.0」以外の listen_address を指定する必要があります。

udp::endpoint(address_v4::from_string("239.192.152.143"), 6771)

SO に関するこの質問も役立つ場合があります: Using specific network interface for a socket in windows

于 2013-02-11T06:31:10.410 に答える