我使用c ++ builder XE8,我是初学者。我想使用OnReceive
的{{1}}和OnSend
事件使其在Indy server and client
模式下运行。我已经读过Indy服务器/客户端在阻塞模式下工作,为了使它工作,我必须使用一个单独的线程。我也找到了例子,但那些是delphi而不是c ++。我可以使用non-blocking
执行此操作,还是必须使用单独的线程?请举一个简短的示例代码。
答案 0 :(得分:2)
我想使用Indy服务器和客户端的
OnReceive
和OnSend
事件使其在非阻塞模式下工作。
Indy专门使用阻塞套接字。您无法在非阻止模式下使用它们。没有OnReceive
和OnSend
个事件,就像VCL的TClientSocket
和TServerSocket
组件中一样。
我已经读过Indy服务器/客户端在阻塞模式下工作,为了使它工作,我必须使用一个单独的线程。
这是真的。
Indy服务器是多线程的。 TIdTCPServer
具有在工作线程上下文中触发的OnConnect
,OnDisconnect
和OnExecute
事件,每个连接的客户端都有一个事件。 TIdUDPServer
有一个OnUDPRead
事件,它在工作线程的上下文中触发,每个侦听端口都有一个事件。您需要在这些事件中执行套接字I / O.通常,您只需执行所需的任何读/写操作,并让Indy根据需要阻止调用线程。
Indy客户端大多是单线程的,它们在其使用的任何线程的上下文中运行(TIdCmdTCPServer
和TIdTelnet
是该规则的例外)。因此,如果您想要非阻塞行为,通常必须创建自己的线程来管理套接字I / O.
请阅读documentation了解更多详情:
我也找到了例子,但那些是在delphi而不是c ++。
和?两种语言的组件都相同。所以要么将代码从Pascal转换为C ++,要么只是按原样使用代码(你知道你可以在C ++ Builder项目中使用Delphi代码吗?你可以)。
我可以使用Intercept / IOHandler
来做到这一点
没有。拦截用于在数据传递到连接或从连接传递数据时进行操作(以应用加密,压缩等)。 IOHandler执行实际的I / O操作,但它与线程无关。
或者我必须使用单独的线程?
是
请举一个简短的示例代码。
如果你四处搜寻,有很多例子可供选择。 StackOverflow不是要求它们的地方。