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

Why do OnClientConnect and OnClientError events not fire for TServerSocket in blocking mode

本文关键字:TServerSocket 模式 OnClientConnect OnClientError 事件 为什么      更新时间:2023-10-16

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

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

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

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

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