1

我正在使用 Embarcadero RAD 工作室和TServerSocket阻塞模式的组件编写 C++ 应用程序。我已经重写了OnGetThread套接字的处理程序以创建一个自定义类,从该类派生TServerClientThread重写默认ClientExecute()方法。在这个函数中,我使用 aTWinSocketStream并调用WaitForData()Read()Write()来接收和发送数据。根据我读过的所有内容,这是一种可以接受的处理方式(尽管如果这是错误的,请纠正我)。

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

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

我的问题是:这是最好的方法:

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

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

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

4

1 回答 1

2

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

于 2013-04-09T17:36:51.330 回答