gpt4 book ai didi

qt - 如何使用Qt UDP套接字发送和接收大数据?

转载 作者:行者123 更新时间:2023-12-04 12:39:40 26 4
gpt4 key购买 nike

我想使用 Qt UDP(不是 TCP)套接字来传输文件。所以我写了这样的代码:

发件人

QFile file1(QString::fromStdString(filedir));
QByteArray bytes;
file1.open(QIODevice::ReadOnly);
QTextStream in(&file1);
while (!in.atEnd()) {
bytes = in.read(8192).toAscii();
udpSocket.writeDatagram(bytes, QHostAddress(ip), port.toInt());
}

接收者

udpSocket1.bind(ui->sendPort->text().toInt());
connect(&udpSocket1,SIGNAL(readyRead()),this,SLOT(listenfile()));

void Widget::listenfile() {
QFile file("received.txt");
file.resize(0);
file.open(QIODevice::Append);
QTextStream out(&file);
do {
QByteArray data;
data.resize(udpSocket1.pendingDatagramSize());
udpSocket1.readDatagram(data.data(),data.size());
QString str=data.data();
ui->textBrowser1->append(str);
out << data;
} while (udpSocket1.hasPendingDatagrams());
}

当我发送小文件时,没有问题。但是,如果我想发送大文件(> 8192 字节),即使在本地主机上测试过,接收方也只能获取前 8KB 数据。如果我减少发送方的大小数字,例如 1024。接收方仍然只获取顶部 8KB 数据。如果我将发件人中的大小数字增加到 X 字节(X > 8192)。接收方将获得最前面的 X Bytes 数据。

似乎要传输的 Qt UDP 数据包的最小大小是 8192 字节。接收方总是收到第一个数据包,但不能接收其他数据包。

本人对Qt和网络编程经验不多,不知道自己的猜想对不对。你能告诉我如何更改这些代码以支持在第一个数据包之后接收数据包,以便我可以传输大数据吗?

最佳答案

调试了半天,用Wireshark抓包。我认为问题的原因是 QUdpSocket 本身。与 Internet 上的许多其他示例一样,我的代码可能是正确的。但是 QUdpSocket 类不适合传输大数据。因为当连接到readyRead()的槽函数在执行时,后续的数据报要等函数执行完才能再次触发它。所以发送方必须在发送一些数据后休眠一段时间以等待接收方的槽函数。

结论是 QUdpSocket 类不能可靠地传输大数据。我应该使用底层的Socket API,自定义一些协议(protocol),设计多进程/多线程的架构,从根本上解决问题。当然,使用 TCP 套接字是另一种选择。

关于qt - 如何使用Qt UDP套接字发送和接收大数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15476469/

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