WindowsUDPソケットでもこの問題が発生していました。何時間も試した後、最終的に問題が見つかったのはsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
、ソケットを作成するためにメインスレッドを呼び出し、ワーカースレッドを呼び出しbind(...)
、recvfrom()
ワーカースレッドを閉じた後closesocket(...)
、メインスレッドを呼び出していたということです。どの関数もエラーを返しませんでしたが、何らかの理由で、UDPアドレスとポートの組み合わせが使用されたままになります(したがって、bind()を今後呼び出すと、エラー10048 WSAEADDRINUSEがトリガーnetstat -abot -p UDP
され、アプリケーション全体が閉じられるまでポートがまだ使用中であることが示されます) )。解決策は、ワーカースレッドに移動socket(...)
して呼び出すことでした。closesocket(...)
上記のような奇妙な問題を除いて、通常、UDPサーバーソケットを呼び出しclosesocket()
た後に開いたままにする方法はありません。 Microsoftは、UDPソケットで維持される接続はなく、呼び出すshutdown()
必要も他の関数も必要ないと説明しています。通常、TCPソケットが呼び出し後に開いたままになる理由は、TCPソケットがclosesocket()
正常に切断されておらず、TCP_WAIT状態で約4分間待機してから、実際に閉じる前に追加のデータが入る可能性があるためです。上記の場合、netstatは、30分以上待っても、アプリケーションが閉じられるまでUDPソケットが閉じられないことを示しました。
.NET Frameworkのようなwinsockのラッパーを使用している場合は、非同期コールバックを設定すると、コールバックを正しくクリーンアップしないとUDPソケットが開いたままになる可能性があるなど、いくつかの機能も読みましたが、私はしませんそれを引き起こす可能性のあるwin32winsockAPIにそのような機能があると思います。