我想使用Qt UDP(不是TCP)套接字来传输文件。 所以我写这样的代码:如何使用Qt UDP套接字发送和接收大数据?
发件人
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字节数据。
似乎要传输的Qt UDP数据包的最小大小是8192字节。接收机总是获得第一个数据包,但不能接收其他数据包。
我在Qt和网络编程方面几乎没有经验,所以我不知道我的猜想是否正确。你能告诉我如何改变这些代码以支持在第一个数据包后接收数据包,这样我就可以传输大数据了吗?
我一直在经历同样的问题一段时间,它真的让我癌症。在用QUdpSocket尝试了许多不同的方法并且花费相当多的时间后,我最终确定了同样的事情:QUdpSocket不适合处理高速率数据流。低级别的winsock udp线程倾向于更好地解决问题。但确实,**真的很难过。我希望Qt提出解决这个严重问题的方案。 – 2017-07-19 14:14:31