c - TCP服务器停止连接

标签 c sockets tcp client-server

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

最佳答案

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

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

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

关于c - TCP服务器停止连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154354/

相关文章:

java - 如何使用java套接字在两个服务器之间进行通信

C程序编译错误(带头文件)

c - 如何抑制coverity警告 "CHECKED_RETURN"

c - 免费 `mmap()-ed` 私有(private)大页面

C 编程打开和读取文件

Java 服务器套接字缓冲区在 Mac 上没有被垃圾收集

python - 如何在 Windows 7 中运行的 python 2.5 中设置保持事件计时器

在客户端上创建多个套接字

jakarta-ee - Java EE 和传出 TCP 连接

C# HttpClient 的每个实例都获得它自己的 ServicePoint