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.
Schreibe einen Kommentar