Wie zum senden und empfangen von großen Daten mit Qt-UDP-socket?
Will ich mit Qt UDP (nicht TCP) socket-Datei zu übertragen.
Also Schreibe ich code wie diesen:
Sender
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());
}
Empfänger
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());
}
Wenn ich senden kleine Datei, ist es kein problem.
Jedoch, wenn ich will, um das senden von großen Datei (> 8192 Byte), der Empfänger kann sich nur die oberen 8KB Daten selbst getestet auf localhost.
Wenn ich das verringern der Größe der Zahl im Absender, wie 1024. Der Empfänger bekommt nur noch die oberen 8KB Daten.
Wenn ich erhöhen Sie die Größe der Zahl im Absender X bytes (X > 8192). Die Empfänger erhalten die top-X Bytes an Daten.
Scheint es, wie die minimale Größe der Qt-UDP-Paket zu übertragen ist 8192 bytes. Der Empfänger bekommt immer das erste Paket, kann aber nicht andere erhalten.
Habe ich wenig Erfahrung in Qt und Netzwerk-Programmierung, so dass ich nicht weiß, ob meine Vermutung richtig ist oder nicht. Können Sie mir sagen, wie Sie ändern Sie diese codes, um Unterstützung empfangen Pakete nach dem ersten Paket, so kann ich die übertragung großer Datenmengen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Debuggen eine lange Zeit und mit Wireshark auf capture-Pakete. Ich denke, der Grund für das Problem ist QUdpSocket selbst. Wie viele andere Beispiele auf dem Internet, mein code wohl Recht. Aber die QUdpSocket Klasse ist nicht geeignet für die übertragung von großen Datenmengen. Denn wenn die slot-Funktion verbunden readyRead() ausgeführt wird, werden nachfolgende Datagramme können nicht, lösen Sie es wieder, bis die Funktion fertig ist. So muss der sender schlafen nach einer Weile schickte einige Daten zu warten, wird der receiver die slot-Funktion.
Abschluss ist QUdpSocket Klasse ist nicht eine zuverlässige übertragung großer Daten. Sollte ich low-level Socket-APIs, passen einige Protokolle und design multi-Prozess/multi-thread-Architektur zu lösen das problem grundlegend. Natürlich mit TCP-Sockets ist eine andere Wahl.
Dein Problem kommt wahrscheinlich von dieser Linie:
Bist du erwarten, dass die gesamte Reihe von Paketen in eine Warteschlange gestellt, und bereit, empfangen zu werden, auf einmal, aber es ist wahrscheinlicher, dass einige verfügbar sein wird und später mehr werden. So müssen Sie hören, um die Steckdose mehr als das, und bestimmen, wenn die andere Seite tatsächlich beendet hat, Daten zu senden.