关于套接字和 accept() 的一些问题
Some questions around sockets and accept()
假设我们已经用 socket()
创建了一个套接字,然后我们使用了 bind()
和 listen()
。然后我们使用 accept()
等待客户端请求,如果我们关闭服务器(例如我们 ctrl+c 进程),客户端连接后。
- 客户端是否仍然连接到该端口?
- 我们能否以某种方式重新建立与套接字的连接?
- 这也是客户端问题吗?还是
recvfrom()
等待某人绑定回套接字?
我假设您使用的是 TCP。
If we shutdown the server:
客户端是否仍然连接到该端口?
没有。服务器端的操作系统会注意到服务器已终止,并会关闭连接,向客户端发送一个数据包来结束连接。即使这没有发生(例如网络故障),连接也不再可用,客户端第一次发送内容时,它会意识到连接丢失了。某些程序使用 TCP Keep-Alive 或发送心跳消息以确保它们注意到服务器是否消失。
我们能否以某种方式重新建立与套接字的连接?
没有。客户端需要建立新的连接。
这也是一个 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()
可用。
假设我们已经用 socket()
创建了一个套接字,然后我们使用了 bind()
和 listen()
。然后我们使用 accept()
等待客户端请求,如果我们关闭服务器(例如我们 ctrl+c 进程),客户端连接后。
- 客户端是否仍然连接到该端口?
- 我们能否以某种方式重新建立与套接字的连接?
- 这也是客户端问题吗?还是
recvfrom()
等待某人绑定回套接字?
我假设您使用的是 TCP。
If we shutdown the server:
客户端是否仍然连接到该端口?
没有。服务器端的操作系统会注意到服务器已终止,并会关闭连接,向客户端发送一个数据包来结束连接。即使这没有发生(例如网络故障),连接也不再可用,客户端第一次发送内容时,它会意识到连接丢失了。某些程序使用 TCP Keep-Alive 或发送心跳消息以确保它们注意到服务器是否消失。
我们能否以某种方式重新建立与套接字的连接?
没有。客户端需要建立新的连接。
这也是一个 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()
可用。