【发布时间】:2010-04-30 06:32:03
【问题描述】:
我目前正在尝试修复我编写的与套接字 select() 调用相关的代理服务器中的错误。我正在使用 Poco C++ 库(使用 SocketReactor),问题实际上出在 Poco 代码中,这可能是一个错误,但我还没有收到他们的任何确认。
当连接突然终止时,socket select() 调用会立即返回,这就是我认为的意思吗?无论如何,它会返回可读文件描述符集中的所有断开连接的套接字,但问题是当 Poco 尝试触发 onReadable 事件处理程序时抛出异常“套接字未连接”,这是我将放置代码的地方处理它。鉴于异常被静默捕获并且永远不会触发 onReadable 事件,因此 select() 调用会立即返回,从而导致 SocketReactor 中的无限循环。
我正在考虑修改 Poco 代码,以便触发一个名为 onDisconnected 或类似的新事件,而不是静默捕获异常,以便执行清理。
我的问题是,是否有任何优雅的方法可以使用 select() 调用确定套接字是否已异常关闭?我正在考虑使用异常消息来确定何时发生,但这对我来说似乎很脏。
【问题讨论】:
-
您是否为 ErrorNotification 事件注册了处理程序?
-
是的,不会触发任何错误事件。
-
我对 Poco 一无所知,但总的来说,select() 不会报告可读套接字和断开连接的套接字之间的任何区别。它报告套接字在关闭/丢失/终止时是可读的。随后对套接字的读取指示是否发生了断开连接以及它是正常的还是异常的。听起来 Poco 在读取套接字时检测到异常断开连接(因此异常),但不是吞下它并返回 select(),而是应该停止对套接字的处理。这肯定向我暗示了 Poco 内部的一个错误。
标签: c++ sockets select poco-libraries