c - 套接字 :client waiting even after recieving last byte

标签 c networking client-server posix

我有 C 语言的客户端/服务器程序,通过它我可以将文件从服务器传输到客户端。

但客户端甚至在收到文件的最后一个字节后仍在等待 recv。只有当我杀死它或服务器被我杀死时,客户端才会终止。但是服务器必须处于循环中,因为它必须处理其他客户端的请求。

我在服务器中使用 fork() 来处理每个客户端的请求。在满足客户端的请求后,我将退出子进程,但客户端仅在整个服务器程序被终止时才终止。

为什么当服务器的子进程退出时客户端不终止?

可以看到服务器代码here和客户代码 here .

最佳答案

您应该确保在发送完所有数据后在服务器进程中调用 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/

相关文章:

java - 基于 servlet 的堆栈是否有显着的开销?

c - While 中哪个条件为真?

c - getc 和 fscanf 之间的区别

c - C/C++ 编程中%0x%x 是什么意思?

networking - 如何以编程方式通过upnp实现双NAT端口转发

java - 以编程方式连接到 wifi 网络(首先访问 ssid)?

objective-c - 通过所有可用网络接口(interface)使用 GCDAsyncUdpSocket 进行 UDP 广播

c - 如何获取变量作为链接器映射文件的位置?

c++ - C/C++ 中的 Read() - 关于读取内容与缓冲区大小

C 代码错误 : free(): invalid next size (fast):