我有一個服務器應用程序,它使用異步I/O處理網絡客戶端。接受客戶端連接,然後將其添加到可以使用poll/epoll/select /等進行監視的描述符集。我正在使用apr_pollset_poll()apache APR庫調用來檢查可以讀取或寫入的描述符。這取決於平臺在內部使用epoll/poll/select/etc。如何檢測無效的fd /句柄
問題是,某個套接字描述符被破壞,並且apr_pollset_poll返回errno 10038,它是WSAENOTSOCK:一個操作嘗試的不是套接字。不幸的是,這會導致我的應用程序停止工作,而不是隻能啓動特定的客戶端連接。 如果我能以某種方式忽略或從描述符集中刪除這個套接字,那麼它可以繼續運行並正確讀/寫其他套接字。我知道我應該找到導致套接字損壞的根本原因,但我需要一個故障安全解決方法。
一旦描述符加入到pollset,這些然後由OS /內核處理,我看不出有任何檢索他們能夠迭代的方式。將這些維護在我自己的列表中可能會進一步導致其他問題,因爲在套接字關閉時,我需要以某種方式清理它們,這會自動發生在內核中的pollset中。
有什麼建議嗎?
問題是,一旦這些描述符加入到pollset,這些然後由OS /內核處理,我看不出有任何檢索他們能夠迭代的方式。 – b0ti
你確定嗎?我沒有詳細看過,但是你應該能夠找出哪些描述符在輪詢集合中,不過如果只是這樣,你可以在輪詢集合關閉後從輪詢集合中刪除描述符。如果最糟糕的是最壞的情況,那麼您必須在給定的輪詢集中保留獨立的描述符記錄,以便您可以執行此操作。 –
查看輪詢集的APR文檔,您顯然希望知道哪些描述符在給定的輪詢集中。您可以將描述符添加到輪詢集,或從輪詢集中移除(已知)描述符。不清楚是否有方法遍歷輪詢集中的描述符。 –