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

How do you handle exceptions when using TServerSocket in blocking mode?

本文关键字:何处理 处理 异常 模式 TServerSocket      更新时间:2023-10-16

我正在使用Embarcadero RAD studio和TServerSocket组件在阻塞模式下编写c++应用程序。我已经覆盖了套接字的OnGetThread处理程序,以创建一个派生自TServerClientThread的自定义类,该类覆盖了默认的ClientExecute()方法。在这个函数中,我使用TWinSocketStream并调用WaitForData()Read()Write()来接收和发送数据。根据我所读到的一切,这是一种可以接受的做事方式(尽管如果这是错误的,请纠正我)。

从这个答案中,什么事件被一个阻塞套接字触发?我相信在阻塞模式下使用OnClientError处理程序是可以的,因为事件将被触发。在我的事件处理程序中,我每次都将错误代码设置为零,这样就不会抛出异常。

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

我的问题是:哪一个是最好的方法:

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

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

如果有人能告诉我以上三种方法中哪一种是最好的(或建议一种替代方法),我将非常感激。

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