我有 C 语言的客户端/服务器程序,通过它我可以将文件从服务器传输到客户端。
但客户端甚至在收到文件的最后一个字节后仍在等待 recv。只有当我杀死它或服务器被我杀死时,客户端才会终止。但是服务器必须处于循环中,因为它必须处理其他客户端的请求。
我在服务器中使用 fork()
来处理每个客户端的请求。在满足客户端的请求后,我将退出子进程,但客户端仅在整个服务器程序被终止时才终止。
为什么当服务器的子进程退出时客户端不终止?
最佳答案
您应该确保在发送完所有数据后在服务器进程中调用 shutdown(s, SHUT_WR
),然后调用 close(s)
。
调用 shutdown()
告诉 TCP 层没有更多数据要发送。
TBH,我不太清楚为什么单独调用 close()
也不能实现这一点。
编辑 - 我现在已经弄明白了 - 这是因为此时在您的代码中,父级还打开了套接字,因此它不会被内核拆除。如果在 fork()
之后添加一些额外的逻辑:
if (p > 0) {
close(connected);
}
那么您的代码无需调用 shutdown()
即可运行。
如果您使用我在 my answer 中发送的代码对于您昨天提出的问题,客户端将得到一个 bytes_received
计数为零,然后终止其循环。
关于c - 套接字 :client waiting even after recieving last byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781422/