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

时间:2013-04-15 09:28:32

标签: 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派生类的成员是否可能导致某些问题?

1 个答案:

答案 0 :(得分:1)

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

在非阻塞套接字失败期间,OnClientErrorTCustomWinSocket.SendStream()TCustomWinSocket.SendBuf()会调用

TCustomWinSocket.ReceiveBuf()。如果您使用TWinSocketStream代替I / O,则不会调用这些方法。它会在失败时引发ESocketError例外。如果你没有捕获这些异常,调用TServerClientThread将自行终止(在将异常传递给主线程进行处理之后)。