• 4875阅读
  • 5回复

TCP延迟 [复制链接]

上一主题 下一主题
离线sand.fj.wen
 
只看楼主 倒序阅读 楼主  发表于: 2010-01-14
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
高手们:
      我使用 QTcpServer.nextPendding() 返回的QTcpSocket对象作为服务端接收客户端发送消息的SOCKET,并且用该SOCKET发送消息给客户端.
客户端发送消息的函数如下所示:
deliverData(quint32 blockFlag, const QString& data, int version/* = DataStreamVersion*/)
{
    // 先刷新流
    m_sessionSocket->flush();

    // 写入新的数据
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);

    out.setVersion(version);
    out << (quint32)0;
    out << (quint32)blockFlag;
    out << data;

    out.device()->seek(0);
    out << (quint32)(block.size() - (quint32)(sizeof(quint32)));

    if(m_sessionSocket->write(block) < 0)
    {
        return false;
    }

    bool isSeccueed = m_sessionSocket->waitForBytesWritten();
#ifdef QT_DEBUG
    qDebug() << "Data sent succeed? " << (isSeccueed ? "Yes" : "No");
#endif

    return isSeccueed;
}
服务端使用
connect(m_sessionSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
连接 QTcpSocket与 onReadyRead() 函数,以读取客户端发送过来的数据,但是当客户端连接多次调用这个函数时.在服务端的onReadyRead()中总是无法
立即获取到数据,只有当客户端再次调用 deliverData() 函数向服务端发送数据时,服务端才会接收到客户端之前发送的数据,而当前发送的数据又滞留到下一次
发送,请问这是为什么?另外,服务端接收到消息时,立即给客户端发送消息,但客户端也接收不到,不知道为什么.我对 TCP 编程不是很熟悉,希望高手能够指教.非常感谢.
离线dbzhang800

只看该作者 1楼 发表于: 2010-01-14
试过
bool QAbstractSocket::flush ()
没?
离线sand.fj.wen
只看该作者 2楼 发表于: 2010-01-14
引用第1楼dbzhang800于2010-01-14 20:18发表的  :
试过
bool QAbstractSocket::flush ()
没?

大哥,代码里不是写得很清楚嘛?
离线dbzhang800

只看该作者 3楼 发表于: 2010-01-14
为什么不是尝试write之后flush而是之前呢?
离线sand.fj.wen
只看该作者 4楼 发表于: 2010-01-14
Well,先感谢大哥这么晚还在为小弟解疑.,但是还是一样的效果...
deliverData(quint32 blockFlag, const QString& data, int version/* = DataStreamVersion*/)
{
    // 先刷新流
    

    // 写入新的数据
    QByteArray block;
    QDataStream out(&block, QIODevice::ReadWrite);

    out.setVersion(version);
    out << (quint32)0;
    out << (quint32)blockFlag;
    out << data;

    out.device()->seek(0);
    out << (quint32)(block.size() - (quint32)(sizeof(quint32)));

    if(m_sessionSocket->write(block) < 0)
    {
        return false;
    }

    bool isSeccueed = m_sessionSocket->waitForBytesWritten();
#ifdef QT_DEBUG
    qDebug() << "Data sent succeed? " << (isSeccueed ? "Yes" : "No");
#endif

    m_sessionSocket->flush();
    return isSeccueed;
}
离线sand.fj.wen
只看该作者 5楼 发表于: 2010-01-15
没有高手知道怎么回事吗?郁闷啊...
快速回复
限100 字节
 
上一个 下一个