c - 关于 TCP 连接缓冲区的问题

标签 c networking tcp

Linux。

我在两台计算机之间使用以太网电缆。一个用 C 编写的简单的服务器-客户端程序,用于将文件从客户端传输到服务器。客户端从文件中读取100字节的数据发送给服务器,然后等待2秒再发送下一个数据包。

当客户端发送数据时,我拔掉了服务器端的以太网电缆,由于连接中断,我预计客户端会出现一些错误。但是客户端一直在将数据写入管道,而服务器没有收到任何东西(但仍在等待接收)。客户端发送了整个文件并停止了。现在,我再次连接以太网电缆,服务器接收客户端发送的所有数据。这怎么可能?数据包是否存储在某个缓冲区中并在连接建立时再次发送?

很抱歉让它太长了。

最佳答案

TCP 的全部意义在于提供可靠的数据传输尽管底层网络不可靠。基本上,它的工作方式是 TCP 仅在收到来自远程机器的确认数据包后才考虑发送的数据;在此之前,内核将数据存储在本地。缓冲的时间可能会很长,具体取决于 /proc 中的一系列设置以及测量的网络参数。

编辑:应用程序可以使用 SIOCOUTQ ioctl 检查未完成发送队列的大小;请参阅 tcp(7) 联机帮助页。同一联机帮助页也讨论了错误处理。

如果您希望数据丢失而不是缓冲,请使用 UDP。

关于c - 关于 TCP 连接缓冲区的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147219/

相关文章:

ios - ip camera feed 到 IOS 应用程序如何允许全局连接?

javascript - 跟踪 Ajax 请求

sockets - 如何在fiddler中捕获套接字编程的发送和接收请求

sockets - Apple 推送通知和端口 2195

c# - lambda 表达式的异常

C: 为什么静态变量不能像全局变量一样从外部链接

c - 我的老师声称这个代码块在 O(n) 时间内运行……这是为什么呢?

c - return !!myVar 是什么意思?

c++ - 我应该如何将 C 库包装到 C++ 中

c - 使用套接字将数据包发送到另一个子网/网络