我正在使用 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
派生类的成员会导致某些问题?
最佳答案
OnClientConnect
事件由TServerClientWinSocket
构造函数触发。 TServerClientWinSocket
对象在 OnGetSocket
事件被调用后立即构造,当一个新的客户端套接字被 WinSock 接受时,就在 OnAccept
和 OnGetThread
事件被调用。因此,OnClientConnect
不会被调用的唯一可能方法是您实际上没有分配给它的处理程序。
OnClientError
在非阻塞套接字失败期间被调用,并由 TCustomWinSocket.SendStream()
、TCustomWinSocket.SendBuf()
和 TCustomWinSocket.ReceiveBuf()
。如果您使用 TWinSocketStream
代替您的 I/O,则它不会调用任何这些方法。它会在失败时引发 ESocketError
异常。如果您没有捕获这些异常,调用 TServerClientThread
将简单地自行终止(在将异常传递给主线程进行处理之后)。
关于c++ - 为什么在阻塞模式下不会为 TServerSocket 触发 OnClientConnect 和 OnClientError 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16011800/