- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对设计一个简单的 QLocalServer-QLocalSocket IPC 系统的问题感到困惑。
QLocalServer 等待新连接并将信号连接到正确的插槽。
void CommandProcessor::onNewConnection()
{
QLocalSocket* pLocal = _server->nextPendingConnection();
connect(pLocal,SIGNAL(disconnected()),this,SLOT(onSocketDisconnected()));
connect(pLocal,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
connect(pLocal,SIGNAL(error(QLocalSocket::LocalSocketError)),this, SLOT(onSocketError(QLocalSocket::LocalSocketError)));
qDebug("Socket connected. addr=%p", pLocal);
}
The readyRead slot implementation is:
void CommandProcessor::onSocketReadyRead()
{
QLocalSocket* pLocalSocket = (QLocalSocket *) sender();
qDebug("SocketReadyRead. addr=%p", pLocalSocket);
QDataStream in(pLocalSocket);
in.setVersion(QDataStream::Qt_5_2);
pLocalSocket->readAll();
qDebug("%s pLocalSocket->bytesAvailable() = %d", Q_FUNC_INFO, pLocalSocket->bytesAvailable());
}
此 readAll 是有意完成的,以检查我如何按顺序获得两个 readyRead 信号(从同一个槽指针,我验证了这一点)。
客户端操作相当简单:
QByteArray data;
QDataStream out(&data, QIODevice::ReadWrite);
out.setVersion(QDataStream::Qt_5_2);
cmd.toDataStream(out);
// write blocksize at first field
out.device()->seek(0);
out << data.size() - sizeof(BLOCKSIZE_T);
qint64 bw = _socket->write(data);
_socket->write(data) 调用会在服务器端触发重复的 readyRead(即使服务器端已使用 ReadAll 调用读取所有数据)。
我应该看哪里的任何指示?
最佳答案
QIODevice
的语义是这样的,readyRead
信号仅表示可能有数据可供读取。这并不意味着一定有数据可用,也不意味着一定有一定数量的数据可用。实现当然会尽最大努力避免虚假信号,但它们可以自由发出任意数量的“虚假”信号。如果错过了 readyRead
信号,那将是一个更糟糕的问题(实际上是一个错误!)。
您应该做的是在收到信号时读取任何可用的数据。就这样。绝对不能保证您将获得任何特定“分块”中的数据。例如,如果连接的一端执行单个 1kByte 写入,则连接的另一端可能会收到任意数量的 readyRead
信号。
可以保证的是,如果您仅在收到readyRead
信号时读取数据,您将不会错过任何数据 - 因此您不需要从连接到 readyRead
信号的插槽以外的任何地方读取数据。
所以,您所看到的完全没问题。当 readyRead
触发时,您需要处理任何数量的可用数据。包括零字节。
关于c++ - Qt 5.2 : QLocalServer receiving duplicated readyRead signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713908/
我是 Qt(和 C++)的新手。我有一个简单的问题:怎么了? #include #include int main(int argc, char *argv[]) { QCoreApplica
我正在 Qt 中创建一个简单的 QSocketServer。套接字开始监听,但 incomingConnection 方法似乎从未运行过。有人可以解释这里出了什么问题吗? 主要内容: m_pipese
我没能找到类似的问题,所以这里是: 我正在跨两个应用程序将 QString 从 QLocalSocket 发送到 QLocalServer。接收 (QLocalServer) 应用程序确实收到消息,但
我正在尝试在本地 OSX 10.11 中启动 QLocalServer。 我有客户端尝试循环连接到服务器: int connect(const char* filename) { int sock
是否可以让QLocalServer 对象监听unix 抽象套接字?我没有看到 qt5 docs 中提到的这种可能性,这里只提到了命名管道: Usually you would just pass in
我对设计一个简单的 QLocalServer-QLocalSocket IPC 系统的问题感到困惑。 QLocalServer 等待新连接并将信号连接到正确的插槽。 void CommandProce
我正在学习如何在 Ubuntu 14.04 上使用带有 Qt 5.6 的 Unix 域套接字传递文件描述符。从文档中可以看出,执行此操作的方法是使用 QLocalServer 和 QLocalSock
我是一名优秀的程序员,十分优秀!