非同期 I/O でネットワーク クライアントを処理するサーバー アプリケーションがあります。クライアント接続は受け入れられ、poll/epoll/select/etc で監視できる記述子セットに追加されます。apr_pollset_poll() apache APR ライブラリ呼び出しを使用して、読み取りまたは書き込みが可能な記述子をチェックしています。これは、プラットフォームに応じて内部的に epoll/poll/select/etc を使用します。
問題は、何らかの形でソケット記述子の 1 つが破損し、apr_pollset_poll が WSAENOTSOCK である errno 10038 を返すことです: ソケットではないものに対して操作が試行されました。残念ながら、これにより、特定のクライアント接続を開始するだけでなく、アプリケーションがまったく動作しなくなります。このソケットを記述子セットから無視または削除できれば、引き続き機能し、他のソケットを適切に読み書きできます。ソケットが破損する根本的な原因を見つけなければならないことはわかっていますが、フェイルセーフな回避策が必要です。
記述子がポーリングセットに追加されると、これらは OS/カーネルによって処理され、反復できるようにそれらを取得する方法がわかりません。これらを自分のリストでも維持すると、おそらくさらに下に他の問題が発生する可能性があります。これは、ソケットを閉じるときに、カーネル内のポーリングセットに対して自動的に発生する何らかの方法でそれらをクリーンアップする必要があるためです。
助言がありますか?