在阻塞模式下使用TServerSocket时,如何处理异常?
How do you handle exceptions when using TServerSocket in blocking mode?
我正在使用Embarcadero RAD studio和TServerSocket
组件在阻塞模式下编写c++应用程序。我已经覆盖了套接字的OnGetThread
处理程序,以创建一个派生自TServerClientThread
的自定义类,该类覆盖了默认的ClientExecute()
方法。在这个函数中,我使用TWinSocketStream
并调用WaitForData()
、Read()
和Write()
来接收和发送数据。根据我所读到的一切,这是一种可以接受的做事方式(尽管如果这是错误的,请纠正我)。
从这个答案中,什么事件被一个阻塞套接字触发?我相信在阻塞模式下使用OnClientError
处理程序是可以的,因为事件将被触发。在我的事件处理程序中,我每次都将错误代码设置为零,这样就不会抛出异常。
此外,每次从ClientExecute()
函数中调用Read()
或Write()
时,我都将其包装在try-catch块中,并捕获ESocketError
异常。
我的问题是:哪一个是最好的方法:
- 使用套接字错误事件处理程序来处理所有事情(这很好,因为我可以获得套接字错误代码以显示用于调试目的)
- 使用try-catch语句来防止我的应用程序抛出异常
- 两者都使用(尽管在处理程序中不要将错误码设置为零,否则异常将不抛出,使2。毫无意义的以上)
这是一个旧组件,已被弃用,但我必须使用它,但由于我无法找到正确使用它的铸铁指南,我已经从许多来源拼凑了一种方法。它已经工作了很长一段时间,但我时不时地得到一个无声的错误,阻止服务器接受任何进一步的客户端连接-但我没有从OnClientError
得到输出,也没有抛出ESocketErrors
。这个应用程序在嵌入式设备上运行,所以只有当它变得无响应时才会被检测到。
如果有人能告诉我以上三种方法中哪一种是最好的(或建议一种替代方法),我将非常感激。
如果TServerSocket
不再接受新的连接,那么它的内部TServerAcceptThread
线程已经崩溃,因此TServerWinSocket.Accept()
不再被调用,或者Accept()
正在被调用但遇到操作系统错误(缺乏系统资源等)。无论哪种方式,TServerSocket
都不会暴露来自这些特定代码区域的任何类型的错误信息,因此您无法检测和处理服务器何时停止接受连接,除非您的连接足够频繁,以至于您可以使用计时器来检测OnClientConnect
事件之间长时间的不活动。如果你怀疑你的服务器已经进入不接受状态,你所能做的就是关闭你的应用程序并重新打开TServerSocket
.
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在简单的外壳中进行批处理处理