【问题标题】:What happens when QTcpSocket::close() is called?调用 QTcpSocket::close() 会发生什么?
【发布时间】:2014-08-23 07:35:31
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ qt sockets tcp


    【解决方案1】:

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

    如果有数据还没有写入socket,现在就写入。一旦完成,套接字就完全关闭了(我只考虑套接字的 Qt“视图”,而不是它的实现和像 TIME_WAIT 这样的控制状态)。

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

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

    结论:在关闭套接字之前,一定要读取它的数据,直到bytesAvaiable达到0(或施加一些限制)。

    【讨论】:

    • 那么QAbstractSocket的文档所指的内部缓冲区实际上是由操作系统创建的?
    • 是的。我没有找到任何指向 Qt 管理缓冲区的内容。
    • 好的,谢谢。在文档中,我认为QAbstractSocket 创建了一个缓冲区。
    • QTcpSocket 肯定确实分配内部缓冲区。我找不到任何相关的文件。此外,调用QTcpSocket::disconnectFromHost() 确实不会 发出close(2) 调用,大概是因为它仍在尝试从其内部缓冲区写入。
    • 文档确实没有说明任何关于缓冲区的内容。但是,正如我所说,在检查代码时我找不到任何相关的东西。也许在不同版本的代码中,或者我不够谨慎。目前,gitorious 正在维护中,所以我无法仔细检查。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多