我有一个服务器应用程序,它使用异步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文档,您显然希望知道哪些描述符在给定的轮询集中。您可以将描述符添加到轮询集,或从轮询集中移除(已知)描述符。不清楚是否有方法遍历轮询集中的描述符。 –