c++ - 为什么在阻塞模式下不会为 TServerSocket 触发 OnClientConnect 和 OnClientError 事件

标签 c++ sockets c++builder c++builder-xe

我正在使用 Embarcadero RAD studio C++ builder XE 创建 C++ 应用程序。应用程序以阻塞模式使用动态创建的 TServerSocket 组件。我创建了一个派生自 TServerClientThread 的类,它提供了一个自定义的 ClientExecute() 方法。此类是通过我已实现的 TServerSocket 事件处理程序 OnGetThread 创建的。我为 OnAcceptOnClientConnectOnClientDisconnectOnClientError 分配事件处理程序。在我的线程类中,我使用 TWinSocketStream 类从套接字连接读取和写入。

我使用自定义编写的类(派生自 TComponent)来创建 TServerSocket,我分配的事件处理程序是此类的成员函数。

我的 OnAcceptOnClientDisconnect 事件触发,但 OnClientConnectOnClientError 事件都没有触发。这是该组件的正常行为吗?我读到的有关此组件的所有内容都表明,所有事件都将在阻塞模式下触发 TServerSocket,我无法理解为什么这些事件不会触发。我还需要做些什么吗,或者这些事件在阻塞模式下不起作用?是否有可能将 TServerSocket 实例用作另一个 TComponent 派生类的成员会导致某些问题?

最佳答案

OnClientConnect 事件由TServerClientWinSocket 构造函数触发。 TServerClientWinSocket 对象在 OnGetSocket 事件被调用后立即构造,当一个新的客户端套接字被 WinSock 接受时,就在 OnAcceptOnGetThread 事件被调用。因此,OnClientConnect 不会被调用的唯一可能方法是您实际上没有分配给它的处理程序。

OnClientError 在非阻塞套接字失败期间被调用,并由 TCustomWinSocket.SendStream()TCustomWinSocket.SendBuf()TCustomWinSocket.ReceiveBuf()。如果您使用 TWinSocketStream 代替您的 I/O,则它不会调用任何这些方法。它会在失败时引发 ESocketError 异常。如果您没有捕获这些异常,调用 TServerClientThread 将简单地自行终止(在将异常传递给主线程进行处理之后)。

关于c++ - 为什么在阻塞模式下不会为 TServerSocket 触发 OnClientConnect 和 OnClientError 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16011800/

相关文章:

c++ - 如何将 PNG 文件加载到我的自定义组件中?无法获得正确的实例

c++ - bcc32 和 bcc32c 对象生命周期的区别

c++ - Arduino int 到字符串的转换

Java Socket 超时异常,什么会导致这些错误

sockets - 在 Luasocket 中,即使在 select 告诉它可以安全读取之后,在什么情况下 accept 调用也会阻塞?

c++ - 我应该通过套接字以一次读\写还是多个 block 的方式发送文件?

delphi - TVirtualStringTree - 重置非可视节点和内存消耗

c++ - 在混合模式 DLL 中链接到 presentationcore.dll

c++ - 初始化 vector 的 vector (外部 vector 和内部 vector )

c++ - 如何构建 FLTK 以与 Netbeans (Windows) 一起使用