为什么OnClientConnect和OnClientError事件不触发TServerSocket在阻塞模式
Why do OnClientConnect and OnClientError events not fire for TServerSocket in blocking mode
我正在使用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
构造函数触发。当WinSock接受一个新的客户端套接字时,在调用OnGetSocket
事件之后,在调用OnAccept
和OnGetThread
事件之前,立即构造TServerClientWinSocket
对象。因此,OnClientConnect
不会被调用的唯一可能的方法是,如果您实际上没有为它分配处理程序。
OnClientError
在非阻塞套接字失败时调用,TCustomWinSocket.SendStream()
、TCustomWinSocket.SendBuf()
和TCustomWinSocket.ReceiveBuf()
也会调用。如果您使用TWinSocketStream
来代替I/O,那么它不会调用这些方法。它会在失败时引发ESocketError
异常。如果您没有捕获这些异常,调用TServerClientThread
将简单地终止自身(在将异常传递给主线程进行处理之后)。
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 小字符串优化(调试与发布模式)
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 在C++的一系列数字中查找重复模式
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- C++ 使用存储在动态数组中的文本文件中的数据查找模式
- 为什么OnClientConnect和OnClientError事件不触发TServerSocket在阻塞模式
- 在阻塞模式下使用TServerSocket时,如何处理异常?