当调用QTcpSocket::close()时会发生什么?

3

QTcpSocket::close()被调用时会发生什么?

我知道它最终会关闭连接,但是Tcp套接字的内部缓冲区会发生什么?它会被清除吗?

这就是为什么我调用close()QTcpSocket::size()返回0的原因吗?

从客户端接收到服务器数据后:

qDebug() << tcpSocket.size(); //170
tcpSocket.close();
qDebug () << tcpSocket.size(); //0

编辑: 根据这篇帖子,关闭套接字会自动刷新任何剩余的数据。由于我在客户端从服务器接收数据后关闭套接字,那么数据被刷新到哪里了呢?我还没有读取任何数据。
1个回答

3
当调用close时,Qt会将QAbstractSocket状态更改为ClosingState。
如果有尚未写入套接字的数据,则现在会写入该数据。一旦完成,套接字就完全关闭了(我只考虑Qt对套接字的“视图”,而不是其实现和控制状态,如TIME_WAIT)。
查看QAbstractSocket类here的源代码,并跟随到QNativeSocketEngine类,看起来Qt不为套接字存储读取缓冲区,完全依赖于操作系统。
因此,在关闭套接字之前,请确保读取其数据,直到bytesAvaiable达到0(或某个强制限制)。
结论:在关闭套接字之前,请务必阅读其数据,直到bytesAvaiable达到0(或某些强制限制)。

那么,QAbstractSocket文档中提到的内部缓冲区实际上是由操作系统创建的? - Quaxton Hale
1
是的。我没有找到任何指向Qt管理缓冲区的东西。 - Vinícius Gobbo A. de Oliveira
好的,谢谢。在文档中,它的措辞让我以为QAbstractSocket会创建一个缓冲区。 - Quaxton Hale
QTcpSocket 绝对会分配内部缓冲区。我找不到任何相关的文档。此外,调用 QTcpSocket::disconnectFromHost() 不会发出 close(2) 调用,可能是因为它仍在尝试从其内部缓冲区中写入数据。 - Cuadue
文档确实没有关于缓冲区的说明。但是,正如我所说,在检查代码时,我没有找到任何相关的内容。也许在代码的不同版本中,或者可能是我不够谨慎。现在,gitorious正在维护中,所以我无法再次确认。 - Vinícius Gobbo A. de Oliveira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接