我正在以阻塞模式使用 Embarcadero RAD studio 和 TServerSocket
组件编写 C++ 应用程序。我已经覆盖了套接字的 OnGetThread
处理程序,以创建一个派生自 TServerClientThread
的自定义类,它覆盖了默认的 ClientExecute()
方法。在此函数中,我使用 TWinSocketStream
并调用 WaitForData()
、Read()
和 Write()
接收和发送数据。根据我所读到的所有内容,这是一种可以接受的处理方式(但如果有误,请纠正我)。
来自这个答案What events are fired for a blocking socket?我相信在阻塞模式下使用 OnClientError
处理程序是可以的,因为事件会触发。在我的事件处理程序中,我每次都将错误代码设置为零,这样就不会抛出异常。
此外,每次我从我的 ClientExecute()
函数中调用 Read()
或 Write()
时,我都会将它包装在一个try-catch block 并捕获 ESocketError
异常。
我的问题是:哪种方法最好:
- 使用套接字错误事件处理程序来处理所有事情(这很好,因为我可以显示套接字错误代码以进行调试)
- 使用 try-catch 语句防止我的应用程序抛出异常
- 两者都使用(尽管在处理程序中没有将错误代码设置为零,否则异常将不会被抛出,使上面的 2. 毫无意义)
这是一个旧组件,已被弃用,但我必须使用它,但由于我无法找到正确使用它的铸铁指南,我从许多来源拼凑了一种方法。它已经运行了很长一段时间,但我时不时地收到一个静默错误,阻止服务器接受任何进一步的客户端连接 - 但我没有从 OnClientError
得到任何输出,也没有 抛出 ESocketErrors
。此应用程序在嵌入式设备上运行,因此检测到它的唯一方法是当它变得无响应时。
如果有人可以就上述 3 种方法中哪一种最好(或提出替代方案)给我建议,我将不胜感激。
最佳答案
如果 TServerSocket
不再接受新的连接,那么它的内部 TServerAcceptThread
线程已经崩溃,所以 TServerWinSocket.Accept()
没有被接受不再调用,或者正在调用 Accept()
但遇到操作系统错误(缺少系统资源等)。无论哪种方式,TServerSocket
都不会从其代码的那些特定区域公开任何类型的错误信息,因此您无法检测和处理服务器何时停止接受连接,除非您的连接足够频繁以至于您可以使用计时器来检测 OnClientConnect
事件之间的长时间不活动。如果您怀疑您的服务器已进入非接受状态,您所能做的就是关闭您的应用程序并重新打开 TServerSocket
。
关于c++ - 在阻塞模式下使用 TServerSocket 时如何处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901022/