我正在使用Embarcadero RAD studio C ++ builder XE来创建一个C ++应用程序。应用程序在阻止模式下使用动态创建的TServerSocket
组件。我创建了一个派生自TServerClientThread
的类,它提供了一个自定义ClientExecute()
方法。这个类是通过我实现的TServerSocket
事件处理程序OnGetThread
创建的。我为OnAccept
,OnClientConnect
,OnClientDisconnect
和OnClientError
分配了事件处理程序。在我的线程类中,我使用TWinSocketStream
类来从套接字连接读取和写入。
我使用自定义编写的类(派生自TComponent
)来创建TServerSocket
,我分配的事件处理程序是此类的成员函数。
我的OnAccept
和OnClientDisconnect
事件触发,但OnClientConnect
和OnClientError
事件都没有发生。这是该组件的正常行为吗?我读到的有关此组件的所有内容都表明,所有事件都会在阻塞模式下触发TServerSocket
,而我根本无法理解为什么这些事件不会触发。还有什么我需要做的或这些事件在阻塞模式下不起作用吗?将TServerSocket
实例用作另一个TComponent
派生类的成员是否可能导致某些问题?
答案 0 :(得分:1)
OnClientConnect
事件由TServerClientWinSocket
构造函数触发。在WinSock接受新客户端套接字并且在调用TServerClientWinSocket
和OnGetSocket
事件之前调用OnAccept
事件后立即构造OnGetThread
对象。因此,OnClientConnect
不会被调用的唯一可能方式是,如果您实际上没有为其分配处理程序。
OnClientError
,TCustomWinSocket.SendStream()
和TCustomWinSocket.SendBuf()
会调用 TCustomWinSocket.ReceiveBuf()
。如果您使用TWinSocketStream
代替I / O,则不会调用这些方法。它会在失败时引发ESocketError
例外。如果你没有捕获这些异常,调用TServerClientThread
将自行终止(在将异常传递给主线程进行处理之后)。