Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于TCP连接缓冲区的一个问题_C_Networking_Tcp - Fatal编程技术网

关于TCP连接缓冲区的一个问题

关于TCP连接缓冲区的一个问题,c,networking,tcp,C,Networking,Tcp,Linux 我在两台计算机之间有一根以太网电缆。C语言中的一个简单的服务器客户端程序,用于将文件从客户端传输到服务器。客户端从文件中读取100字节的数据并将其发送到服务器,然后等待2秒钟,然后再发送下一个数据包 当客户端发送数据时,我拔出了服务器端的以太网电缆,我希望客户端会出现一些错误,因为连接中断。但是客户端继续将数据写入管道,服务器没有接收到任何东西(但仍在等待接收)。客户端发送了整个文件并停止。现在,我再次连接以太网电缆,服务器接收客户端发送的所有数据。这怎么可能?数据包是否存储在某个缓

Linux

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

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


对不起,时间太长了

是的。根据配置,它甚至可能会等待一段时间,看看是否可以恢复连接。甚至,tcp超时可能长达几分钟。。。请注意,例如,参数
tcp\u fin\u timeout
和其他与超时相关的参数。

tcp的全部目的是提供可靠的数据传输,尽管下面有一个不可靠的网络。基本上,它的工作方式是TCP只考虑从远程机器接收确认数据包后发送的数据;在此之前,内核将数据存储在本地。缓冲时间可能相当长,这取决于
/proc
中的一系列设置以及测量的网络参数

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


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

在Linux上,您可以通过运行以下命令查看内核维护的发送队列和超时:

netstat -tanpo

当连接由于错误或超时而突然终止时,客户端可以通过检查
write()
shutdown()
close()
中的返回值来注意到这一点,谢谢您的时间。这个链接很有用。但我在这里遗漏了一些东西。这里失去了可靠性。如果TCP缓冲它,然后如果连接没有恢复,它最终将丢弃数据包。现在客户端不知道这一点,它认为它发送了数据包。不完全是这样。如果无法发送数据包(超时),将向客户端发送错误(关闭连接)。如果可以发送,即使断开连接,它们也会连接,因此不会出现错误。Package lost总是意味着返回给客户端的错误。不,它不是:客户端可能已经关闭了套接字,因此在这种情况下无法传递错误。一般来说,您无法知道最终传输已经到达。这就是所谓的两军问题。这也是我的理解。我不希望数据丢失。我想要一个可靠的连接。现在它存储在内核中,由于客户机程序没有收到任何错误,他很高兴地发送整个文件并退出。现在让我们假设,连接不会被恢复,TCP将释放内核缓冲区,而客户端不知道这一点。这里的可靠性是如何保持的?@Blacklabel:您的应用程序将看到连接重置,因此客户端可以知道。如果连接重置,则无法保证数据已交付。不幸的是,所有的抽象都泄漏了;这一个被称为“两个将军问题”@黑标签:你也应该考虑,即使远程机器已经接收并确认数据,它也会在远程机器的TCP接收缓冲器中,直到应用程序请求它为止。如果远程应用程序崩溃或无法处理数据…@Derobert。谢谢。我明白了:)。另一个业余爱好者的问题是,如何在C中找到是否重置了连接?@Blacklabel:您不想禁用此功能。您希望让发送应用程序等待,直到接收应用程序通知它数据已接收并保存到磁盘(或以其他方式处理)。“正确接收”是应用程序级属性,不能在TCP层处理。