代码之家  ›  专栏  ›  技术社区  ›  Burkhard

QTcpServer和TCPClientSocket(Cayuga)之间的问题

  •  1
  • Burkhard  · 技术社区  · 16 年前

    我尝试通过TCP套接字在QT4应用程序(MyApp)和 Cayuga (用C++编写)。

    现在,MyApp正在向Cayuga发送一些数据,但没有收到任何数据。

    void MyApp::init()

    QTcpServer *m_server;
    QTcpSocket *clientConnection;
    //Open socket for transmission
    m_server = new QTcpServer(this);
    if (!m_server->listen(QHostAddress::Any, m_port)) {
    //Error handling
      return;
    }
    connect(m_server, SIGNAL(newConnection()), this, SLOT(startSend()));
    

    void MyApp::startSend()

    {
        clientConnection = m_server->nextPendingConnection();
    }
    

    书写在此处完成:

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << s;
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    clientConnection->write(block);
    clientConnection->flush();
    

    我的导师建议,如果我不能让外部库(cudb)与QTcpSockets一起工作,就使用它。这感觉不对,这就是为什么我希望你对我的问题有一个更好的答案。

    1 回复  |  直到 16 年前
        1
  •  1
  •   0defect 0defect    16 年前

    这是我对正在发生的事情的猜测:

    QDataStream实现了一个序列化协议(因此必须为它指定一个版本(Qt_4_0))。另一端需要了解该协议的东西(也就是说,另一个Qt_4_0数据流)。特别是,无论发送端和接收端的端号如何,QDataStream都能确保获得正确的数据。

    您可以尝试以下操作,而不是序列化到块然后写入块:

    QDataStream out(clientConnection, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out.writeRawData(data, length);
    clienConnection->flush();
    

    writeRawData()不会整理您的数据。。。