3

既知のポートにバインドし、それ自体をマルチキャストグループに追加し、クライアントの要求をリッスンするUDPサーバーがあります。(サーバーはWindows上にあり、WSARecvFromを使用して、クライアントデータグラムの重複受信を発行します。)クライアントは、既知のポートとマルチキャストIPアドレスでサーバーにメッセージを送信します。

ラップトップで「サーバー」をテストすると、ラップトップが「スリープ」状態になると、サーバーの受信ソケットがマルチキャストアドレスから「バインド解除」されることに気付きました(そのため、クライアントはマルチキャストアドレスに送信し、受信されなくなります)。 。ただし、127.0.0.1のポートへの送信は引き続き受信されるという点で、ソケットは引き続き受信しています。Windowsはエラーを示しません。(サーバーソケットはINADDR_ANYにバインドされています。)

「サーバー」はピアツーピアアプリケーションの一部であり、自動検出に使用されます。したがって、この状況は予想されるほど珍しいことではありません。

サーバーがマルチキャストアドレスに送信せずにマルチキャストアドレスをアクティブにリッスンしているかどうかを判断する方法を提案できますか(これにより、ネットワーク上のすべての「サーバー」に不要なトラフィックが発生します)。考えられる解決策の1つは、マルチキャストに使用されるアダプターのIPアドレスに送信することですが、これを判別する方法がわかりません。

4

1 に答える 1

7

ネットワークスタックは定期的にIGMPメッセージを送信します。ネットワーク上のスイッチは、IGMPスヌーピングを使用して、コンピューターに必要なマルチキャストメッセージ(存在する場合)を判別する場合があります。(これはすべて、ホストが要求していないトラフィックのためにホストに過度の負荷をかけないようにするための試みです。)

ラップトップがスリープ状態になると、特定のマルチキャストトラフィックへの関心を確認する定期的なメッセージの送信を停止します。スイッチはこれに気づき、ラップトップへのトラフィックの送信を停止します。

ラップトップが休止状態から再開したときにそれを見つけて、マルチキャストグループにメンバーシップを再度追加する必要があると思います。私は過去に、制御コードSIO_ADDRESS_LIST_CHANGEを使用してWSAIoctlを呼び出すことにより、これを実行しました(さらに、ネットワークアダプターの有効化/無効化への対処) 。ラップトップがスリープ状態になると、すべてのアダプターが無効として報告されます。再開すると、アダプタは再び有効になっていると報告されます。(アダプターが実際にUDPデータグラムを送信できるようになる数秒前に使用可能であると報告される可能性があるため、これは少し厄介な場合があることに注意してください。そのため、メンバーシップの追加を数回再試行する必要があります。必要に応じて、アダプターの変更が通知されてから30秒待つこともできます。)

于 2012-10-18T09:37:57.890 に答える