【问题标题】:TCP server stop connectionTCP 服务器停止连接
【发布时间】:2019-11-30 22:06:53
【问题描述】:

我有一个经典的 TCP 服务器,它接受与系统调用 accept() 的连接。 在特定情况下,我接受了 n 个连接,因此创建了 n 个子节点。 当服务器上发生通用事件 A 时,我需要停止连接。在服务器和客户端中关闭套接字的最佳方法是什么? 现在我这样做:当事件 A 发生时,服务器向客户端发送特定消息,然后执行close()。客户端读取套接字,如果消息是特殊消息,它将关闭。 但是如果我需要在客户端做其他事情,这种方式是非常糟糕的。我能做什么?

【问题讨论】:

  • 您可以从每个客户端的进程模型切换到使用epoll/kqueue/poll/select(IO 事件监控功能)管理连接的单个进程。您将节省资源并使优雅地管理服务器范围的事件(例如关闭)变得更加容易。

标签: c sockets tcp client-server


【解决方案1】:

“n 个子进程已创建”我假设您的意思是 n 个子进程,每个子进程处理与一个客户端程序的 TCP 连接?

如果是这样,处理它的一种方法是让服务器的父进程跟踪它产生的子进程的进程 ID(由 fork() 返回)(通过列表或查找表或相似的)。然后当你需要一个特定的连接离开时,你的服务器的父进程可以调用kill(the_child_process_id, SIGTERM) 或类似的方法来让子进程尽快离开。 (SIGTERM 问得很好;如果你想使用全核,你可以指定SIGKILL)。

在任何情况下,一旦服务器上的子进程收到信号并退出,操作系统会确保服务器端的 TCP 连接关闭,然后客户端操作系统会收到 TCP 连接通知是关闭的,基于此,客户端(如果正确编码以处理远程关闭的连接,即通过关闭自己的 TCP 套接字对 recv() 返回 0 做出反应)也会做正确的事情。

【讨论】:

  • 所以我需要在客户端执行recv()并检查recv()是否返回0。客户端可以知道TCP服务器子进程没有执行recv()就结束了吗?例如接收特定信号?谢谢!!
猜你喜欢
  • 2019-04-30
  • 2016-11-18
  • 2019-01-04
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多