我有一个服务器应用程序,它使用异步 i/o 处理网络客户端。客户端连接被接受,然后添加到描述符集中,可以使用 poll/epoll/select/etc 进行监视。我正在使用 apr_pollset_poll() apache APR 库调用来检查可以读取或写入的描述符。这取决于平台在内部使用 epoll/poll/select/etc。
问题是套接字描述符之一以某种方式损坏,并且 apr_pollset_poll 返回 errno 10038,即 WSAENOTSOCK:尝试对非套接字的操作进行操作。不幸的是,这导致我的应用程序完全停止工作,而不仅仅是能够启动该特定客户端连接。如果我可以以某种方式忽略或从描述符集中删除此套接字,那么它可以继续运行并正确读取/写入其他套接字。我知道我应该找到导致套接字损坏的根本原因,但我需要一个故障安全解决方法。
一旦将描述符添加到轮询集中,这些描述符就会由操作系统/内核处理,我看不到检索它们以进行迭代的方法。在我自己的列表中维护这些可能会进一步产生其他问题,因为在套接字关闭时,我需要以某种方式清理它们,这对于内核轮询集会自动发生。
有什么建议么?