套接字之间基于事件的通信

Event based communication between sockets

我在 Linux 平台上用 C 编写了客户端-服务器应用程序。

客户端在从服务器接收数据后将通过 'system()' 调用调用另一个程序来处理相同的数据。

在正常情况下,服务器套接字现在等待客户端的结果,客户端套接字等待其后端处理作业完成,以便将结果转发给服务器.

但是,根据某些事件的发生,服务器需要要求客户端停止处理当前输入。

由于目前的套接字状态是“服务器->等待接收”和“客户端->等待发送”,我如何在 'event' 的情况下反转角色?在服务器端,我可以捕获事件并相应地更改状态,但是如何将此更改传达给客户端?

处理它的一种方法是实现完全双向通信:即消除“套接字状态”的想法,并允许客户端或服务器随时向对方发送或接收数据。

这可以通过让客户端和服务器都在 select()(或另一个类似的 I/O multiplexing/wait-for-multiple-sockets-at-once 调用)内阻塞而不是在 recv() 内阻塞来完成,这样他们除了从对方那里接收数据之外,还能够对其他事件做出反应。

您可能遇到的另一个问题是,如果您的客户端被阻塞在 system() 等待后台进程退出,客户端将很难对来自服务器的传入数据做出反应。解决方案是用更复杂的东西替换 system() 调用,例如 forkpty()forkpty() 将生成一个子进程并为您提供一个文件描述符,您可以从 and/or select() 读取它,就好像它是子进程 stdin 的网络套接字一样/stdout,允许您的客户端进程根据需要响应来自服务器和子进程的传入数据。

我使用了我的网络库的 forkpty()implement the ChildProcessDataIO class,发现它很适合这个目的。