gpt4 book ai didi

c++ - QT QTcpServer 没有及时连接

转载 作者:可可西里 更新时间:2023-11-01 02:48:33 27 4
gpt4 key购买 nike

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

主窗口.cpp:

#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();
}

最佳答案

问题的根源很可能是由 waitFor 方法引起的伪同步困惑。摆脱他们。此外,您不能保证在 readyRead 时接收到多少字节:在某些情况下,一次接收一个字节是完全正常的,或者实际上是任何数量的字节,包括比你可能会期待。您的代码必须应对这种情况。

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

关于c++ - QT QTcpServer 没有及时连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36317026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com