套接字之间基于事件的通信
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,发现它很适合这个目的。
我在 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,发现它很适合这个目的。