0

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

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

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

4

1 回答 1

1

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

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

于 2013-04-15T18:04:43.563 回答