【发布时间】:2013-07-14 02:58:23
【问题描述】:
客户端在等待读取 n 个字节的读取调用上阻塞。
服务器写入 n 个字节并立即关闭连接。
如果套接字在读取完成之前关闭或由于其他问题而在这种情况下读取调用返回负数或零吗? (在这种情况下,客户端/服务器在同一个 linux 机器上运行)
我正面临这样的情况,但不确定它在 TCP/IP 子系统中是如何工作的以及如何解决它。
Sever:
write
close
Client:
read
close
【问题讨论】:
-
Joni 下面说了什么。每个人都应该阅读 Ultimate SO_LINGER 页面 (blog.netherlabs.nl/articles/2009/01/18/…) 关于远程主机关闭套接字时丢失数据的内容。
-
发送最后一条消息的主机应该执行半关闭:shutdown(s, SHUT_WR) 然后循环调用 recv() 一段合理的时间,直到它返回错误或 0 指示远程主机已经离开或关闭了连接。
-
下面的答案可能会解决您的问题,但如果您需要更多帮助,请告诉我们
code! -
“终极 SO_LINGER 页面”不是规范性参考。在我数十年的经验中,“它经常无法完成我们想要的事情——传输的最后千字节或有时兆字节的数据永远不会到达”的说法是完全不真实的。 '当我们在 TCP/IP 套接字上发出 close() 函数时,根据情况,内核可能会这样做:关闭套接字,并随之关闭 TCP/IP 连接。这确实发生了——即使您的一些数据仍在等待发送”是完全不正确的:它违反了 RFC 793 中的规范。
-
不确定服务器在发送关闭后需要等待接收多长时间,因为服务器也有其他客户端并且可以工作。如果远程客户端速度很慢,不想阻塞 recv。服务器是单线程的。
标签: c sockets tcp network-programming client-server