【问题标题】:Why do OnClientConnect and OnClientError events not fire for TServerSocket in blocking mode为什么在阻塞模式下不会为 TServerSocket 触发 OnClientConnect 和 OnClientError 事件
【发布时间】:2013-04-15 09:28:32
【问题描述】:

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

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

我的OnAccept 和OnClientDisconnect 事件触发,但OnClientConnect 和OnClientError 事件都没有触发。这是该组件的正常行为吗?我所读到的关于这个组件的所有内容都表明所有事件都将在阻塞模式下为TServerSocket 触发,我根本无法理解为什么这些事件不会触发。我还需要做些什么,或者这些事件在阻塞模式下不起作用?使用TServerSocket 实例作为另一个TComponent 派生类的成员是否可能会导致一些问题?

【问题讨论】:

    标签: c++ sockets c++builder c++builder-xe


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我确实分配了一个 OnClientConnect 处理程序,但我没有编写 OnGetSocket 处理程序,因为我知道它不是必需的。我确实有一个OnGetThread 处理程序,但没有OnGetSocket 处理程序是我的事件没有触发的可能原因吗?
    • OnGetSocket 是可选的,对OnClientConnect 是否被调用没有任何影响。如果您有一个分配给OnClientConnect 的处理程序,那么它应该被调用,除非 2010/XE 中的TServerSocket 有其他版本中没有的错误。我从来没有遇到过正确调用OnClientConnect 的问题。我建议你在你的项目选项中启用调试库,这样你就可以在ScktComp.pas 中进入 TServerSocket 的源代码,并找出TServerClientWinSocket.Create() 在被TServerWinSocket.GetClientSocket() 调用时没有调用OnClientConnect 的原因。
    • 我会尝试你的建议。谢谢你的帮助。
    猜你喜欢
    • 2019-02-18
    • 2017-07-30
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多