我目前正在尝试修复我编写的与套接字 select() 调用相关的代理服务器中的错误。我正在使用 Poco C++ 库(使用 SocketReactor),问题实际上出在 Poco 代码中,这可能是一个错误,但我还没有收到他们的任何确认。
发生的情况是,每当连接突然终止时,套接字 select() 调用就会立即返回,这就是我认为它应该做的事情?无论如何,它会返回可读文件描述符集中的所有断开连接的套接字,但问题是当 Poco 尝试触发 onReadable 事件处理程序时抛出异常“套接字未连接”,这是我将放置代码的地方处理它。鉴于异常被静默捕获并且永远不会触发 onReadable 事件,因此 select() 调用会立即返回,从而导致 SocketReactor 中的无限循环。
我正在考虑修改 Poco 代码,而不是静默捕获异常,而是触发一个名为 onDisconnected 的新事件或类似的事件,以便可以执行清理。
我的问题是,是否有任何优雅的方法可以使用 select() 调用确定套接字是否异常关闭?我正在考虑使用异常消息来确定何时发生,但这对我来说似乎很脏。