我想使用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