9

ブロードキャスト送信用のポートでリッスンしている UDP ソケットがあり、正常に動作しています。

ただし、休止状態にして OS (Windows 7) を再開すると、ソケットはデータの受信を停止します (そして、Wireshark を使用してデータが到着していることがわかります)。

これは、IP アドレスの変更、ネットワーク アダプターの無効化と有効化などのネットワーク設定を変更した場合にも発生します。

OS は、休止状態のときにすべてのネットワーク アダプターを無効にし、再開時に再度有効にするようです。

select(タイムアウト) を返すだけ0で、データを受信して​​いない場合と同じです。この動作への参照はどこにも見つかりませんでした。

ソケットを閉じて再作成すると、再び機能し始めます。

OS を再開した後も、TCP リスニング ソケットは正常に動作します。

この状況をどのように検出して修正するかについてのアイデアはありますか?

編集:まだ直接アドレスデータを受信して​​いますが、ブロードキャスト送信を受信して​​いません。

EDIT2:ソケットに書き込む(ダミーパケットをどこにでも送信する)と、再び機能し始めることがわかりました...

4

1 に答える 1

2

あなたのコードはソケットを「0.0.0.0」アドレスに明示的にバインドしていないと思います。したがって、sentto を実行すると、その時点で使用可能なインターフェイス IP がバインドされます。この IP が変更されるか、インターフェースが無効になると、このソケットは TCP/IP スタックによってリセットされます。TCP ソケットでは、「0.0.0.0」アドレスにバインドする必要があるため、IP/インターフェイスの変更に関係なく、常に接続をリッスンします。データを送信する前に、udp ソケットを「0.0.0.0」にバインドすることもできます。これにより、休止状態や IP の変更後でも機能します。

于 2014-05-24T11:30:24.803 に答える