【发布时间】:2015-09-12 12:18:48
【问题描述】:
当您在套接字上调用send 时,内核中的数据缓冲区并且您会得到一个非错误返回。内核实现忙于响应和窗口化以将所有数据传送到另一端。
如果北京梗咬断电线,连接将关闭,留下一些数据未发送。在收到指示关闭的错误后,有什么方法可以找出是这种情况吗?最终,Linux、Windows 和 OS/X 上的机制是可取的,但它不必是 相同 机制。
评论中有人想知道:为什么?
考虑一个已经可以从节点的整个崩溃中恢复的系统,但是在构建时假设“TCP 连接是永远的”(它们不一定在 AWS 上)。所以,如果一个 TCP 连接关闭,只有两种可能:另一端已经崩溃,我们有解决方案,或者它仍然正常。如果它仍然启动,那么它在套接字关闭之前获得的数据与 TCP 传递的数据一样多。 (我意识到这不一定是一个有效的假设。)由于 TCP 协议已经在内核中完成了所有这些确认簿记,因此在用户空间中复制它以跟踪从一端到另一个。
【问题讨论】:
-
我不知道。连接被重置,所有缓冲的数据都被丢弃。
-
有一个更大的问题迫在眉睫:你想要这个做什么?一个明显的意图是知道接收者是否有机会获得它,但是在“发送”之后,它可能会失败事件的方式有很多,在你提到的接收端 TCP 堆栈的位线之间,到应用程序另一端,最终这似乎是一种毫无意义的努力。至少对我来说。
-
@JB。该连接至少会在其内部结构的某处出现最后一个 ACKed seqnr。但我不认为这是可访问的,至少对于用户空间进程来说是不可访问的,当然在连接关闭后也不可访问。 (好消息是损坏的电缆不会导致连接关闭,最终只是超时)
标签: sockets tcp network-programming