11

以下では、1枚のネットワークカードを想定しています。

サブネット内の他のユーザーにその存在を知らせるように設計されたプログラムのコンポーネントがあります。このために、プログラムが起動するたびに(そしてその後定期的に)ブロードキャストを送信するソリューションを実装しましINADDR_BROADCASTた。必要なポートでリッスンする人は誰でも、後で使用するためにどこから来たかを覚えています。

これの問題は、私が自分の放送を覚えたくないということです。理論的には、これは簡単に実行できると思いました。ローカルIPを見つけて、取得したものと比較するだけですrecvfrom

ただし、ローカルIPを取得するのは難しいことがわかりました。NULLの場合はをgetaddrinfo返し127.0.0.1getaddrinfoホスト名の場合はパブリックIPを返します。誰かが実際のサブネットIPを見つける方向に私を向けることができますか?私はここで非常に明白な何かを見逃しているに違いないと思いますが、まあ...私はまだそれを見逃しています:)

注:ブロードキャストに関する他のSOの質問、特にこれを読んだことがあります:すべてのインターフェイスでのUDP-ブロードキャストですが、マルチインターフェイスの問題についてはまだ理解していません。

4

5 に答える 5

8

起動時に、ランダムな(ただし追跡された)値で別のメッセージをブロードキャストし、そのメッセージを待って自分のアドレスを発見することができます。それ以降は、ソースメッセージを無視して通常のメッセージを送信できます。

于 2009-11-19T09:54:50.433 に答える
2

Linuxでは、オプションを指定したioctlを使用して、特定のインターフェースのIPアドレスを取得できSIOCGIFADDRます。ただし、これはWindowsでは機能しないと思います。そのためには、このような間抜けなことをする必要があります。

于 2009-11-19T19:53:48.050 に答える
1

getsockname(関数のドキュメント) は、特定のソケットに関連付けられたローカル IP アドレスを検出できます。ブロードキャストの送信に使用しているソケットでこれを呼び出すと、 によって返されるのと同じ IP アドレスが表示されるはずですrecvfrom

于 2009-11-19T15:25:29.467 に答える
0

scoket オプションを検索し、これらが機能するかどうかを確認します: IP_MULTICAST_LOOP,IP_BLOCK_SOURCE

于 2009-11-19T09:57:19.607 に答える