QLocalSocket断开后我应该收到所有消息吗?

时间:2018-02-14 07:54:32

标签: c++ qt unix-socket qlocalsocket

我在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::ClosingStateQLocalSocket::UnconnectedState。当我收到QLocalSocket::ClosingState时,一切顺利,但正如我在上一次编辑中所说的那样,问题是有时会遗漏QLocalSocket::ClosingState。在这种情况下,waitForReadyRead()在没有等待超时的情况下失败并且我有一个警告&#34; QIODevice:read(QTcpSocket):设备未打开&#34; (即使我使用QLocalSocket,也许在Qt源中没有更新警告消息)。顺便说一句,我使用的是Qt5.7。

0 个答案:

没有答案