Пакет ответа Qt UDP mDNS, не структурированный верно

Я пытаюсь отправить правильный ответный пакет mDNS с помощью QUdpSocket. Проблема в том, что я правильно создаю пакет. Может кто-нибудь, пожалуйста, покажите мне правильный способ собрать пакет.

Пока что это не сработало:

    QByteArray datagram;
    QDataStream out(&datagram, QIODevice::WriteOnly);
out << 0x8400; //set standard query

    out << 0; //Reply code: no error;
    out << 0; //Questions; 0
    out << 0; //Answers; 0
    out << 1; //Authoritive answers: 0
    out << 0; //Additional RR;

    QByteArray name("_home-sharing._tcp.local");
    out <<  name;
    out << 0x000c; //PTR
    out << 1;//Class: IN
    out << 1;//Cache Flush
    out << 0; //Time to Live: 0;

Затем я отправляю дейтаграмму, любая помощь будет оценена. Спасибо

1 ответ

Решение

QDataStream кодируется в специальный формат Qt, он не форматируется в "сырой" двоичный файл.

Вам нужно будет сериализовать данные самостоятельно. Я бы порекомендовал просто добавить в QByteArray, Например, чтобы сериализовать uint16_t в порядке байтов в сети вы можете использовать такую ​​функцию:

void appendUint16NBO(QByteArray& ba, uint16_t i)
{
  ba.append(char((i >> 8) & 0xFF));
  ba.append(char(i & 0xFF));
}

Вы бы использовали функцию следующим образом:

QByteArray datagram;
appendUint16NBO(datagram, 0x0000);
appendUint16NBO(datagram, 0x8400);

QByteArray будет содержать: 00 00 84 00,

Другие вопросы по тегам