【问题标题】:Event based communication between sockets套接字之间基于事件的通信
【发布时间】:2021-11-17 19:30:26
【问题描述】:

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

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

在正常的事件过程中,服务器套接字现在等待来自客户端的结果,客户端套接字等待其后端处理工作完成,以便将结果转发给服务器。

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

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

【问题讨论】:

  • 您可以设计您的客户端-服务器,以便他们创建一个管理套接字来交换事件和另一个套接字来交换要处理的数据

标签: c linux sockets


【解决方案1】:

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

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

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

我使用了forkpty()implement 我的网络库的ChildProcessDataIO 类,发现它可以很好地用于此目的。

【讨论】:

  • 这有帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2013-07-07
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多