如何访问/使用Indy服务器/客户端的OnReceive和OnSend事件?

时间:2015-10-13 07:14:27

标签: c++builder indy

我使用c ++ builder XE8,我是初学者。我想使用OnReceive的{​​{1}}和OnSend事件使其在Indy server and client模式下运行。我已经读过Indy服务器/客户端在阻塞模式下工作,为了使它工作,我必须使用一个单独的线程。我也找到了例子,但那些是delphi而不是c ++。我可以使用non-blocking执行此操作,还是必须使用单独的线程?请举一个简短的示例代码。

1 个答案:

答案 0 :(得分:2)

  

我想使用Indy服务器和客户端的OnReceiveOnSend事件使其在非阻塞模式下工作。

Indy专门使用阻塞套接字。您无法在非阻止模式下使用它们。没有OnReceiveOnSend个事件,就像VCL的TClientSocketTServerSocket组件中一样。

  

我已经读过Indy服务器/客户端在阻塞模式下工作,为了使它工作,我必须使用一个单独的线程。

这是真的。

Indy服务器是多线程的。 TIdTCPServer具有在工作线程上下文中触发的OnConnectOnDisconnectOnExecute事件,每个连接的客户端都有一个事件。 TIdUDPServer有一个OnUDPRead事件,它在工作线程的上下文中触发,每个侦听端口都有一个事件。您需要在这些事件中执行套接字I / O.通常,您只需执行所需的任何读/写操作,并让Indy根据需要阻止调用线程。

Indy客户端大多是单线程的,它们在其使用的任何线程的上下文中运行(TIdCmdTCPServerTIdTelnet是该规则的例外)。因此,如果您想要非阻塞行为,通常必须创建自己的线程来管理套接字I / O.

请阅读documentation了解更多详情:

Introduction to Indy

  

我也找到了例子,但那些是在delphi而不是c ++。

和?两种语言的组件都相同。所以要么将代码从Pascal转换为C ++,要么只是按原样使用代码(你知道你可以在C ++ Builder项目中使用Delphi代码吗?你可以)。

  

我可以使用Intercept / IOHandler

来做到这一点

没有。拦截用于在数据传递到连接或从连接传递数据时进行操作(以应用加密,压缩等)。 IOHandler执行实际的I / O操作,但它与线程无关。

  

或者我必须使用单独的线程?

  

请举一个简短的示例代码。

如果你四处搜寻,有很多例子可供选择。 StackOverflow不是要求它们的地方。