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

时间:2013-04-09 11:48:55

标签: 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处理程序是正常的,因为事件将会触发。在我的事件处理程序中,我每次都将错误代码设置为零,以便不会抛出异常。

此外,每当我从Read()函数中调用Write()ClientExecute()时,我将其包装在try-catch块中并捕获ESocketError个异常。

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

  1. 使用套接字错误事件处理程序来处理所有事情(这很好,因为我可以显示套接字错误代码以便进行调试)
  2. 使用try-catch语句阻止我的应用程序抛出异常
  3. 同时使用两者(虽然未在处理程序中将错误代码设置为零,否则异常将抛出使2.使上面毫无意义)
  4. 这是一个旧的组件,已被弃用,但我必须使用它,但由于我无法找到正确使用它的铸铁指南,我已拼凑出许多来源的方法。它已经运行了很长一段时间,但是我一次又一次地得到一个无声的错误,它阻止服务器接受任何进一步的客户端连接 - 但我得不到OnClientError的输出而没有ESocketErrors是抛出。此应用程序在嵌入式设备上运行,因此检测它的唯一方法是它无响应时。

    如果有人能就上述3种方法中的哪种方法提供最佳建议(或建议替代方案),我将非常感激。

1 个答案:

答案 0 :(得分:2)

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