c++ - 在阻塞模式下使用 TServerSocket 时如何处理异常?

标签 c++ multithreading sockets c++builder tclientsocket

我正在以阻塞模式使用 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 异常。

我的问题是:哪种方法最好:

  1. 使用套接字错误事件处理程序来处理所有事情(这很好,因为我可以显示套接字错误代码以进行调试)
  2. 使用 try-catch 语句防止我的应用程序抛出异常
  3. 两者都使用(尽管在处理程序中没有将错误代码设置为零,否则异常将不会被抛出,使上面的 2. 毫无意义)

这是一个旧组件,已被弃用,但我必须使用它,但由于我无法找到正确使用它的铸铁指南,我从许多来源拼凑了一种方法。它已经运行了很长一段时间,但我时不时地收到一个静默错误,阻止服务器接受任何进一步的客户端连接 - 但我没有从 OnClientError 得到任何输出,也没有 抛出 ESocketErrors。此应用程序在嵌入式设备上运行,因此检测到它的唯一方法是当它变得无响应时。

如果有人可以就上述 3 种方法中哪一种最好(或提出替代方案)给我建议,我将不胜感激。

最佳答案

如果 TServerSocket 不再接受新的连接,那么它的内部 TServerAcceptThread 线程已经崩溃,所以 TServerWinSocket.Accept() 没有被接受不再调用,或者正在调用 Accept() 但遇到操作系统错误(缺少系统资源等)。无论哪种方式,TServerSocket 都不会从其代码的那些特定区域公开任何类型的错误信息,因此您无法检测和处理服务器何时停止接受连接,除非您的连接足够频繁以至于您可以使用计时器来检测 OnClientConnect 事件之间的长时间不活动。如果您怀疑您的服务器已进入非接受状态,您所能做的就是关闭您的应用程序并重新打开 TServerSocket

关于c++ - 在阻塞模式下使用 TServerSocket 时如何处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901022/

相关文章:

java - 将 Java 控制台输出(逐行)保存到不同的变量中?

c++ - 我们什么时候需要提及/指定数字文字的整数类型?

C++ 要求所有声明都有类型说明符

具有静态成员的 C++ 寄存器模式有效 "sometimes"

c++ - 对象渲染顺序,场景图?

multithreading - delphi中的DLL、表单和线程(合一)问题

c# - 为什么这个线程方法需要 900 毫秒才能完成?

database - 如何在线程下使用数据库和 UI?

java - 代码 Socket clientSocket = new Socket();即使在单独的线程中,Android 应用也会崩溃

ios - 使用 NSStream 进行 Objective-C 套接字编程