Empfangen von Daten mit dem UDP-Protokoll und readDatagram
Nach einem ersten Thema, die mir helfen, senden Sie korrekt Daten jemand über UDP-Protokoll, ich habe ein problem in der Rezeption dieser Daten. Dieses problem ist sehr merkwürdig und passieren nur das erste mal, dass ich starten Sie die Funktion zum senden von Daten. Das erste mal, die server erhalten nur den ersten frame. Aber wenn ich re-verwenden Sie die Funktion alles ok ist.
So, hier ist der code, der das senden von Daten über UDP-Protokoll (meine Daten einer Struktur) :
void MyUDP::sendUDP()
{
//Structure to send
typedef struct MyStructTag
{
int test1;
bool test2;
char test3;
} MyStruct;
MyStruct envoie;
envoie.test1 = 1;
envoie.test2 = true;
envoie.test3 = 97;
//Sends the datagram datagram
//to the host address and at port.
//qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
// const QHostAddress & host, quint16 port)
QByteArray buf;
QDataStream s(&buf, QIODevice::WriteOnly);
//The encoding is big endian by default, on all systems. You
//can change it if you wish.
if (false) s.setByteOrder(QDataStream::LittleEndian);
s << (qint32)envoie.test1 << (quint8)envoie.test2 << (qint8)envoie.test3;
//I'm sending 5 frames
socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
}
Und hier ist die Funktion, die mir erlauben, te erhalten diese Daten :
void MyUDP::readyRead()
{
QHostAddress sender;
quint16 senderPort;
//qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize,
// QHostAddress * address = 0, quint16 * port = 0)
//Receives a datagram no larger than maxSize bytes and stores it in data.
//The sender's host address and port is stored in *address and *port
//(unless the pointers are 0).
typedef struct MyStructTag
{
int test1;
bool test2;
char test3;
} MyStruct;
MyStruct recois;
socket->readDatagram((char*)&recois, sizeof (recois), &sender, &senderPort);
qDebug() << "Message from: " << sender.toString();
qDebug() << "Message port: " << senderPort;
qDebug() << "Message: " << recois.test3;
}
Warum habe ich nur 1 frame das erste mal, dass ich starten sendUDP ?
- Da UDP nicht zuverlässig pro-design?
- Ich bin in der lokalen übertragung, also werde ich nicht ein anderes Protokoll verwenden. Und wenn das problem ist immer das gleiche, das heißt, es kommt aus meinem code.
- Nur lokale, deterministische und ich keine Garantie für irgendwas. Hatte so Situationen, die mich in der Vergangenheit, lokale UDP, und das problem nachgewiesen wurde (nicht von mir) zu den OS Teil.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Probleme:
Innerhalb der
readyRead
Sie muss Schleife, währendsocket->hasPendingDatagrams()
wahr ist.Müssen Sie die
QDataStream
auf beide dem sendenden und dem empfangenden Ende.Schließlich, Sie schreiben von C++, sollten Sie nicht verwenden die C-Struktur-syntax. Es ist auch kontraproduktiv, mit der Struktur-Deklaration kopiert. Was du brauchst, ist die streaming-Operatoren für
MyStruct
.Unten ist ein komplettes Beispiel.
QDataStream
müssen Sie implementieren die Verpackung/Auspacken Funktionalität selbst, oder eine library, mit der es für Sie. Wenn Sie möchten, implementieren Sie von Grund auf in C, Sie sind frei zu Fragen, eine andere Frage. Es gibt keinen Vorteil durch die Verwendung der C-api in ein C++ - Programm. Ihr code wird zum Ballon, und Sie werden den Umgang mit den Dingen, dass Qt bereits behandelt.QDataStream
-basierten code funktioniert auf all Plattformen, die Qt, läuft auf. Dein C-code garantiert nicht mehr funktionieren, wenn Sie schalten Sie Ihren C-compiler.Nicht wirklich genug Informationen in deiner Frage um sicher zu sein, aber wenn Sie Lesen Sie ein Datagramm, Sie erhalten nur 1 Datagramm pro Lesen. Im Gegensatz zu TCP, die liest in einem stream-Modus, UDP-message orientiert werden. Wenn Sie möchten, um mehr zu Lesen von Nachrichten, mehrere liest, oder Lesen Sie in einer Schleife. Beachten Sie auch, dass Sie können nicht Sie verlassen sich auf garantierte Reihenfolge, oder sogar garantierte Lieferung...