c - TCP 连接中链接断开时的 send() 函数行为

标签 c sockets tcp send

场景如下:

A <------------------------> B

我在 A 和 B(基于 Linux 的机器)上都使用非阻塞套接字。 A 和 B 有一个 TCP 连接,突然连接它们的链路断开(该链路可能不是直接链路)。 现在,在链接断开后,当在 A 端调用 send() 函数将一些数据发送到 B 时,它会成功返回(即返回要发送的字节数)。

这种行为的原因是什么,当我们知道远程端将无法接收此数据时,当链接断开时?

最佳答案

这是正常的预期行为。

when we know the remote side will not be able to receive this data

好吧,也许知道,因为您是您拔下电缆的人并且您不会再将其重新插入,但是计算机(或者,特别是 TCP 堆栈) ) 不知道。

它不知道数据不会发送的第一个原因是当 send() 调用完成时,数据还没有传输:它们仅在缓冲区中排队。

它不知道数据不会成功的第二个原因是它不能(至少在开始时)区分只是丢弃数据包的链路和数据包何时可以通过的区别它会尝试重新传输它,而不是真正切断的电缆。即使电缆被切断,TCP 也会继续重新传输一段时间,希望 (1) 链路恢复,或者 (2) 路由器将汇聚到另一条可用的网络路径上。

即使您可以立即知道链接何时断开(尽管在某些非常特殊的情况下您可以,但一般情况下您不能,您必须等待超时才能弄清楚),您也不希望 TCP每次发生时立即断开连接:如果每次网络中丢失数据包时 TCP 连接都断开,那将太脆弱了。

关于c - TCP 连接中链接断开时的 send() 函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326918/

相关文章:

c - 在 C 中读取和检查文件的内容

c - 带接收超时的套接字 : What is wrong with this code?

c++ - 套接字,Unix 域 UDP C++ recvfrom 无法填充源地址

Java通过Socket发送和接收多条消息

delphi - 在 TCP 连接中使用 Bind 方法的最佳方法是什么?

C,使用枚举 union 扩展枚举

C:建立一个字节

C程序-for循环中的fork命令

c# - TCP 包发送错误

c++ - 简单的 Http 获取响应