我想使用 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 字节),即使在 localhost 上测试,接收方也只能获得前 8KB 的数据。如果我减少发送方的大小数字,例如 1024。接收方仍然只能获得前 8KB 的数据。如果我将发送方的大小数增加到 X 字节(X > 8192)。接收方将获得前 X 字节数据。
似乎要传输的 Qt UDP 数据包的最小大小是 8192 字节。接收者总是得到第一个数据包,但不能接收其他数据包。
我对Qt和网络编程经验很少,所以不知道我的猜想是否正确。你能告诉我如何更改这些代码以支持在第一个数据包之后接收数据包,以便我可以传输大数据吗?