调用QTcpSocket::close()
时会发生什么?
我知道它最终会关闭连接,但是Tcp套接字的内部缓冲区会发生什么?它被清除了吗?
这是为什么QTcpSocket::size()
在我拨打close()
时会返回0的原因?
从服务器接收数据后从客户端:
qDebug() << tcpSocket.size(); //170
tcpSocket.close();
qDebug () << tcpSocket.size(); //0
编辑: 根据此post,关闭套接字会自动刷新所有剩余数据。由于我在客户端从服务器接收数据后关闭套接字,数据将被刷新到哪里?我还没有读过任何数据。
答案 0 :(得分:3)
当调用close时,Qt会将QAbstractSocket
状态更改为ClosingState
。
如果有数据尚未写入套接字,则立即写入。一旦完成,套接字完全关闭(我只考虑套接字的Qt“视图”,而不是它的实现和控制状态,如TIME_WAIT)。
查看QAbstractSocket
类here的源代码,并跟随QNativeSocketEngine
类,看起来Qt没有为套接字存储读缓冲区,完全依赖于操作系统为此。
因此,一旦套接字关闭,读取缓冲区就不再存在,并且所有未读取的数据都将丢失。
结论:在关闭套接字之前,请确保在bytesAvaiable
达到0
(或某些强制限制)之前读取其数据。