首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT QTcpServer未及时连接

QT QTcpServer未及时连接
EN

Stack Overflow用户
提问于 2016-03-30 18:36:29
回答 1查看 378关注 0票数 1

我正在做一个简单的程序,将“连接”到自己,然后发送数据。它启动一个QTcpServer,然后等待任何传入的连接。我有一个单独的函数,它将尝试在我决定的本地主机和端口连接到这个服务器。当我在命令提示符中打开Telnet,但现在在我的实际程序中打开Telnet时,这是可行的。下面是我使用的代码(有些是来自其他来源的代码片段)

MainWindow.cpp:

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    server = new QTcpServer(this);
    //Initialize and start the server
    connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
    if (!server->listen(QHostAddress::Any, 3665))
    {
        qDebug() << "Server failed to start!";
    }
    else
    {
        qDebug() << "Server started";
    }
    //Try to connect to the server
    connectToServer("127.0.0.1", qint16(3665));
}

MainWindow::~MainWindow()
{
    delete server;
    delete ui;
}

void MainWindow::connectToServer(QString host, qint16 port)
{
    qDebug() << "Connecting to " + host + " at port " + QString::number(port);
    QTcpSocket socket;
    socket.connectToHost(host, port);
    if (!socket.waitForConnected(5000))
    {
        qDebug() << socket.errorString();
    }
    while (socket.bytesAvailable() < (int)sizeof(quint16))
    {
        if (!socket.waitForReadyRead(5000))
        {
            qDebug() << socket.errorString();
        }
    }
    quint16 blockSize;
    QDataStream in(&socket);
    in.setVersion(QDataStream::Qt_5_5);
    in >> blockSize;
    while (socket.bytesAvailable() < blockSize)
    {
        if (!socket.waitForReadyRead(5000))
        {
            qDebug() << socket.errorString();
        }
    }
    QString fortune;
    in >> fortune;
    qDebug() << fortune;
}

void MainWindow::newConnection()
{
    qDebug() << "A connection has been found.";
    QTcpSocket *socket = server->nextPendingConnection();

    socket->write("hello client\r\n");
    socket->flush();
    socket->waitForBytesWritten(5000);
    socket->close();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 20:47:30

问题的根源很可能是waitFor方法造成的伪同步混乱。把他们赶走。此外,您无法保证在readyRead上接收多少字节:在某些情况下,一次接收一个字节是完全正常的,或者实际上是任何数量的字节,包括比您预期的更多的字节。您的代码必须处理这一问题。

This就是这种方法的一个例子--它异步地做你想做的事情。That是另一个演示如何利用状态机使用易于阅读的声明性语法编写异步通信代码的示例。

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

https://stackoverflow.com/questions/36317026

复制
相关文章

相似问题

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