Forum: PC-Programmierung QT Receive Interface


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Micha (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hey,

ich habe mir eine GUI in QT geschrieben die über alle 
Netzwerkschnittstellen Broadcast Pakete verschickt.
    QString discoveryMessage = "1234567890";
    QByteArray Data = QByteArray::fromHex(discoveryMessage.toLatin1());

    discoveryUdpSocket = new QUdpSocket(this);
    discoveryUdpSocket->bind(QHostAddress::Any, QUdpSocket::ShareAddress |     QUdpSocket::ReuseAddressHint);
    connect(discoveryUdpSocket, SIGNAL(readyRead()), this, SLOT(read_discover_datagram()));

    /* Update Network Adresses */
    foreach (QNetworkInterface interface, QNetworkInterface::allInterfaces()) {
        foreach( QNetworkAddressEntry entry, interface.addressEntries() ) {
            QHostAddress broadcastAddress = entry.broadcast();
            if (broadcastAddress != QHostAddress::Null && entry.ip() != QHostAddress::LocalHost) 
{
                    discoveryUdpSocket->writeDatagram(Data, broadcastAddress, 4321 );
            }
        }
    }
void TestClass::read_discover_datagram()
{
    while (discoveryUdpSocket->hasPendingDatagrams()) {
        QHostAddress sender;
        quint16 senderPort;
        QByteArray buffer;

        buffer.resize(discoveryUdpSocket->pendingDatagramSize());
        discoveryUdpSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
...

wie kann ich am einfachsten in read_discover_datagram() herausfinden von 
welchen Interfaces die Antwort zurückkam?

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Kommt auf die Qt-Version an. Ab 5.8 kannst du statt readDatagram() die 
Funktion receiveDatagram() verwenden. Die gibt dir ein QNetworkDatagram 
zurück, das diese Information enthält.

von Micha (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hey Rolf,

danke, ich hatte das eben versucht. Erhalte aber vom Qt-Designer:

Semantic Issue
testapp.cpp:94:57: error: calling 'receiveDatagram' with incomplete 
return type 'QNetworkDatagram'
qudpsocket.h:77:22: note: 'receiveDatagram' declared here
qudpsocket.h:52:7: note: forward declaration of 'QNetworkDatagram'

Da "class QNetworkDatagram;" in qudpsocket.h forwärtsdeklariert wird.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Dann musst du eben entsprechend der Doku den passenden Header einbinden.
Siehe https://doc.qt.io/qt-5/qnetworkdatagram.html

von Micha (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hey Rolf,

ja, das war es ;-).

Vielen lieben Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.