3

我在 Windows、Linux 和 MacOSX 中有一个 c++/Qt 应用程序,并且我有一个使用 Qt Local Server/Socket 的本地客户端-服务器机制。

当服务器拒绝连接时,我使用QLocalSocket::disconnectFromServer()发送消息并关闭套接字

从我看到的文档中

如果有等待写入的未决数据,QLocalSocket 将进入 ClosingState 并等待直到所有数据都已写入。

所以在客户端,我连接信号QLocalSocket::disconnected并在我的插槽中执行以下操作

void MyClientClass::onSocketDisconnected()
{
   qDebug() << "Socket disconnected";
   socket->readAll();
    //I do something with the data read
}

但有时,主要是在慢速 Linux 机器上(我尝试使用只有 1 个处理器的虚拟机),有时我没有收到服务器在关闭前发送的最后一条消息。

为什么会发生这种情况?它应该与文档形成对比,不是吗?

为什么我只在 Linux 和 MacOSX(Qt 使用 unix 域套接字)中注意到它而我在 Windows(Qt 使用管道)中没有注意到它,是否有一些动机?

也许有一些与域套接字相关的动机?或者我只是误解了什么?

编辑:正如在下面的评论中所写,在这些情况下,当我没有收到消息时,也QLocalSocket::ClosingState丢失了,我直接收到QLocalSocket::UnconnectedState

编辑2:正如评论中所建议的,我尝试了这个waitForReadyRead()功能。我做到了onSocketDisconnected()onStateChanged()当状态变为QLocalSocket::ClosingStateor时也是如此QLocalSocket::UnconnectedState。当我收到QLocalSocket::ClosingState一切顺利时,但正如我在上次编辑中所说的那样,问题是有时QLocalSocket::ClosingState会丢失。在这种情况下,waitForReadyRead()没有等待超时就失败了,并且我有一个警告“QIODevice:read (QTcpSocket): device not open”(即使我正在使用QLocalSocket,也可能警告消息在 Qt 源中没有很好地更新)。顺便说一句,我使用的是 Qt5.7。

4

0 回答 0