私はUPnP AV/DLNA DMSを書いており、SSDPのメッセージを送受信する必要があります。 M-SEARCH
パケットに応答して、INADDR_ANY
(0.0.0.0
)にバインドすることを選択したリソース(この場合はHTTPサーバー)のURLを返信する必要があります。もちろん、このアドレスはM-SEARCH
パケットの送信者にとって意味がありません。M-SEARCH
が受信されたインターフェイスのアドレスが最も適切です。SSDPとインターフェイスのIPアドレス
返信パケットに送信する適切なアドレスを決定するにはどうすればよいですか?私はと考えられてきた
いくつかのアイデアがあります:
- は、各ソケットに別の受信機を結合します。受信者が
M-SEARCH
パケットを受け取ると、返信アドレスは返信でソケットのローカルアドレスを使用できます。しかし、これには、すべてのインターフェイスの把握と反復、およびインターフェイスの可用性の変化に応じて受信者の追加と削除が必要です。 INADDR_ANY
に1台の受信機を置き、interface netmasksを反復して、発生源を特定します。ただし、複数のインタフェースが同じサブネットを共有している可能性があります。- 受信時にパケットのIPターゲットアドレスを抽出します。これはIP固有のものであり、ネットワーク抽象化のどこかで失われる可能性があります。
SSDPはUDPを超えています...あなたが言ったことは当てはまりますか? –
@Matt Joiner:ああ、Wikipediaのページでたくさんの "HTTP"の言及が見られ、それがTCPであると仮定しました。 UDPソケットを接続し、接続されたソケットで 'getsockname(2)'を使うことができます。私は接続されていないソケットについてはほとんど分かりませんが、ソケットを接続するのは恐ろしいことではありません。 – sarnold
これはうまくいくようです。私はUDPに焦点を当てるために質問を言い換えるべきです。 –