首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt5.2: QLocalServer接收重复的readyRead信号

Qt5.2: QLocalServer接收重复的readyRead信号
EN

Stack Overflow用户
提问于 2014-02-11 21:56:02
回答 1查看 1.3K关注 0票数 1

我对设计一个简单的系统感到困惑。

QLocalServer等待一个新的连接,并将信号连接到适当的时隙。

代码语言:javascript
复制
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信号(来自同一个时隙指针,我验证了这一点)。

客户端操作相当简单:

代码语言:javascript
复制
   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);

_套接字->写(数据)调用在服务器上触发重复的readyRead (即使服务器端已经用ReadAll调用读取了所有数据)。

我该去哪看看有什么指示吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-11 22:06:15

QIODevice的语义是这样的,以至于readyRead信号仅仅意味着可能有数据可供读取。这并不意味着一定有可用的数据,也不意味着保证一定数量的数据是可用的。当然,实现尽力避免虚假信号,但它们可以任意发布任意数量的“虚假”信号。这将是一个更糟糕的问题(事实上,是一个bug!)如果错过了readyRead信号。

当你收到信号时,你要做的就是读取任何可用的数据。就这样。绝对不能保证你会在任何特定的“分块”中得到数据。例如,如果连接的一端执行单个1 1kByte的写操作,则连接的另一端可能会得到任意数量的readyRead信号。

保证的是,如果只在收到readyRead信号时读取数据,就不会错过任何数据--因此,您不需要从任何地方读取数据,只需要连接到readyRead信号的插槽。

所以,你看到的一切都很好。当readyRead触发时,您需要处理任何可用的数据。包括零字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21713908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档