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