关于套接字和 accept() 的一些问题

Some questions around sockets and accept()

假设我们已经用 socket() 创建了一个套接字,然后我们使用了 bind()listen()。然后我们使用 accept() 等待客户端请求,如果我们关闭服务器(例如我们 ctrl+c 进程),客户端连接后。

  1. 客户端是否仍然连接到该端口?
  2. 我们能否以某种方式重新建立与套接字的连接?
  3. 这也是客户端问题吗?还是 recvfrom() 等待某人绑定回套接字?

我假设您使用的是 TCP。

If we shutdown the server:

  1. 客户端是否仍然连接到该端口?

    没有。服务器端的操作系统会注意到服务器已终止,并会关闭连接,向客户端发送一个数据包来结束连接。即使这没有发生(例如网络故障),连接也不再可用,客户端第一次发送内容时,它会意识到连接丢失了。某些程序使用 TCP Keep-Alive 或发送心跳消息以确保它们注意到服务器是否消失。

  2. 我们能否以某种方式重新建立与套接字的连接?

    没有。客户端需要建立新的连接。

  3. 这也是一个 client-side 问题吗?还是 recvfrom() 等待某人绑定回套接字?

    recvfrom()不会这样等待。服务器不能按照您暗示的方式“重新连接”或“重新绑定”。客户端将需要通过显式重新连接来响应断开连接。

Is the client still connected to the port?

客户端在 Windows 上读取时将获得连接重置,或者在 *nix 下读取时获得 EOS,或者在写入时获得连接重置。

Can we somehow reestablish connection to the socket?

端口。客户端可以尝试重新连接,但直到服务器 运行 并且正在侦听时才会成功。服务器重启后无法处理

Is this a client a client-side issue as well?

是的,见上文。

Or does recvfrom() wait for someone to bind back to the socket?

当然不是。

注意你应该使用 recv() 作为流套接字。你不需要 source-address 信息 recvfrom() 给你,如果确实如此,因为它已经通过套接字上的 getpeername() 可用。