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

时间:2014-08-23 07:35:32

标签: c++ qt sockets tcp

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

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

这是为什么QTcpSocket::size()在我拨打close()时会返回0的原因?

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

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

编辑: 根据此post,关闭套接字会自动刷新所有剩余数据。由于我在客户端从服务器接收数据后关闭套接字,数据将被刷新到哪里?我还没有读过任何数据。

1 个答案:

答案 0 :(得分:3)

当调用close时,Qt会将QAbstractSocket状态更改为ClosingState

如果有数据尚未写入套接字,则立即写入。一旦完成,套接字完全关闭(我只考虑套接字的Qt“视图”,而不是它的实现和控制状态,如TIME_WAIT)。

查看QAbstractSockethere的源代码,并跟随QNativeSocketEngine类,看起来Qt没有为套接字存储读缓冲区,完全依赖于操作系统为此。

因此,一旦套接字关闭,读取缓冲区就不再存在,并且所有未读取的数据都将丢失。

结论:在关闭套接字之前,请确保在bytesAvaiable达到0(或某些强制限制)之前读取其数据。