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にそのような機能があると思います。