我在 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::ClosingState
or时也是如此QLocalSocket::UnconnectedState
。当我收到QLocalSocket::ClosingState
一切顺利时,但正如我在上次编辑中所说的那样,问题是有时QLocalSocket::ClosingState
会丢失。在这种情况下,waitForReadyRead()
没有等待超时就失败了,并且我有一个警告“QIODevice:read (QTcpSocket): device not open”(即使我正在使用QLocalSocket
,也可能警告消息在 Qt 源中没有很好地更新)。顺便说一句,我使用的是 Qt5.7。