Seite 1 von 1

ein altes Problem: Qudpsocket bind (gelöst)(prog added)

Verfasst: 2. September 2010 12:38
von dynamo2
ADDED: habe ein kleines udp-receive-programm hinzugefügt... vll kann es ja mal jemand brauchen!

hallo,

mal wieder ein altes Problem. Ich bin relativ neu in QT und wollte UDP Pakete auslesen. Hab hier schon viel rumgesucht, konnte es aber bisher nur schaffen, die Verbindung aufzubauen!

1) ich bekomme von einer Ethernet Schnittstelle UPD packete geliefert. Das sagt mir ein Dienstprogramm vom Mac:
udp:
469051 datagrams received
0 with incomplete header
0 with bad data length field
7 with bad checksum
2771 dropped due to no socket
142984 broadcast/multicast datagrams dropped due to no socket
0 dropped due to full socket buffers
0 not for hashed pcb
323289 delivered
342323 datagrams output

2) in Folgendem Code wird eine Verbindung aufgebaut (Das funktioniert)

Frage: Muß ich erst ein UPD Packet senden, bevor ich eines empfangen kann? Wie funktioniert das?

3) Ansonsten kommt kein readyRead() und keine Ausgabe

4) Das Beispiel stammt aus der qt example Bibliothek. (receiver.cpp)

Wär schön, wenn sich das jemand kurz anschauen könnte. Viel sollt ja nicht mehr fehlen eigentlich.

Danke!

Code: Alles auswählen

 #include <QtGui>
 #include <QtNetwork>

 #include "receiver.h"

 Receiver::Receiver(QWidget *parent)
     : QDialog(parent)
 {
     statusLabel = new QLabel(tr("Listening for broadcasted messages"));
     quitButton = new QPushButton(tr("&Quit"));

     udpSocket = new QUdpSocket(this);

    // udpSocket->bind(45454, QUdpSocket::ShareAddress);

     //udpSocket->bind(QHostAddress::LocalHost, 7755);

     if(!udpSocket->bind(QHostAddress("169.254.175.42"), 3689, QUdpSocket::ShareAddress) )
     {
        QMessageBox::information(NULL, "","can't bind server");
     }

     connect(udpSocket, SIGNAL(readyRead()),
             this, SLOT(processPendingDatagrams()));
     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

     QHBoxLayout *buttonLayout = new QHBoxLayout;
     buttonLayout->addStretch(1);
     buttonLayout->addWidget(quitButton);
     buttonLayout->addStretch(1);

     QVBoxLayout *mainLayout = new QVBoxLayout;
     mainLayout->addWidget(statusLabel);
     mainLayout->addLayout(buttonLayout);
     setLayout(mainLayout);

     setWindowTitle(tr("Broadcast Receiver"));
 }

 void Receiver::processPendingDatagrams()
 {
     while (udpSocket->hasPendingDatagrams()) {
         QByteArray datagram;
         datagram.resize(udpSocket->pendingDatagramSize());
         udpSocket->readDatagram(datagram.data(), datagram.size());
         statusLabel->setText(tr("Received datagram: \"%1\"")
                              .arg(datagram.data()));
     }
 }

Re: ein altes Problem: Qudpsocket bind

Verfasst: 2. September 2010 22:01
von solarix
dynamo2 hat geschrieben:[..]Hab hier schon viel rumgesucht, konnte es aber bisher nur schaffen, die Verbindung aufzubauen!
[...]
<klugscheiss>UDP ist eigentlich verbindungslos...</klugscheiss>

Im Ernst: da können wir nur raten
* evt. ist "processPendingDatagrams()" ja gar kein Slot?
* evt. sendet der Partner an die falsche IP oder den falschen Port?
* evt. sendet der Partner nicht-printbare Zeichen?
* ..?

Verfasst: 2. September 2010 22:11
von dynamo2
Ah ok, wie sollte ich denn verbinden? nicht mit "bind" ?

Ich hab zum Beispiel hier einen Router am Kabel hängen. Sollte ich da nicht auch irgendwelche UPD Pakete empfangen?

Oder kann ich irgendeinen ping machen?

Wo lern ich solche Sachen?

Vielen Dank!
Alex

Verfasst: 2. September 2010 22:24
von dynamo2
ach ja:

mein bound state ist 4, also The socket is bound to an address and port (for servers).

aber das protokoll ist -1, also undefined... sollte das nicht ipv4 sein?

und der error gibt -1, also undefined error!!

was is da los? "heul" :cry:

alex

Verfasst: 2. September 2010 23:06
von solarix
Ah ok, wie sollte ich denn verbinden? nicht mit "bind" ?
Das ist kein "Verbinden".. du sagst dem Socket nur, dass er dort (auf diesem Port) horchen soll. Wenn du von der hübschen Nachbarin einen Anruf erwartest und neben dem Telefon wartest, hast du auch noch keine Verbindung zu ihr...
Ich hab zum Beispiel hier einen Router am Kabel hängen. Sollte ich da nicht auch irgendwelche UPD Pakete empfangen?
Kommt drauf wo sich der Client befindet und wohin er sendet.

Code: Alles auswählen

Oder kann ich irgendeinen ping machen?
Nein, aber du solltest mit 'netstat' prüfen können, ob der UDP-Server wirklich in Betrieb ist.
Wo lern ich solche Sachen?
Netzwerkgrundlagen? Bücher, Online-Einführungen, Beispielcode... sei kreativ ;)
und der error gibt -1, also undefined error!!
Das ist ok... kein Fehler ist ein "undefined error" (das ist der Default-Wert)

Ist denn nun "processPendingDatagrams()" ein gültiger Slot? (Header?). Was sendet denn nun der Client (Code?).

Verfasst: 2. September 2010 23:21
von dynamo2
hi! cool, jemand der sich erbarmt! :) danke!

1) ja, horchen, das dachte ich! also gut so!

2) der client: mein pc, der router eine netzwerkkabellänge entfernt. und da kommen wir wahrscheinlich zur Wurzel meines Problems. Es gibt da vll doch keinen, der da was sendet.(bis jetzt hab ich mich mit dem router selbst verbunden!) Ich dachte, dass der Router vll auch irgendwelche Pakete sendet, die ich empfangen sollte, weil:

3) netstat sagt, dass udp verbindung aktiv usw:
tcp:
7599647 packets sent
1227973 data packets (94167934 bytes)
2548 data packets (601295 bytes) retransmitted
0 resends initiated by MTU discovery
3601604 ack-only packets (22424 delayed)
0 URG only packets
0 window probe packets
2571216 window update packets
221266 control packets
10559482 packets received
1332114 acks (for 94158855 bytes)
12297 duplicate acks
0 acks for unsent data
9079762 packets (1918624396 bytes) received in-sequence
5318 completely duplicate packets (3190413 bytes)
152 old duplicate packets
169 packets with some dup. data (45927 bytes duped)
211778 out-of-order packets (280813693 bytes)
2 packets (2 bytes) of data after window
2 window probes
190 window update packets
2878 packets received after close
7 bad resets
3 discarded for bad checksums
0 discarded for bad header offset fields
0 discarded because packet too short
164714 connection requests
40 connection accepts
4 bad connection attempts
0 listen queue overflows
56889 connections established (including accepts)
179719 connections closed (including 495 drops)
527 connections updated cached RTT on close
527 connections updated cached RTT variance on close
206 connections updated cached ssthresh on close
77620 embryonic connections dropped
1331219 segments updated rtt (of 1441318 attempts)
47809 retransmit timeouts
121 connections dropped by rexmit timeout
1 persist timeout
0 connections dropped by persist timeout
223 keepalive timeouts
0 keepalive probes sent
188 connections dropped by keepalive
525 correct ACK header predictions
7996388 correct data packet header predictions
62 SACK recovery episodes
19 segment rexmits in SACK recovery episodes
15859 byte rexmits in SACK recovery episodes
1999 SACK options (SACK blocks) received
192671 SACK options (SACK blocks) sent
0 SACK scoreboard overflow
udp:
494366 datagrams received
0 with incomplete header
0 with bad data length field
7 with bad checksum
2961 dropped due to no socket
158551 broadcast/multicast datagrams dropped due to no socket
0 dropped due to full socket buffers
0 not for hashed pcb
332847 delivered
354073 datagrams output

... war wahrscheinlich falsch gedacht. hoffentlich...
also wär wohl ein weg das ganze zu testen, mir selbst udp pakete zu senden, oder? das könnt ich ja auch in einem kleinen qt programm machen oder? dann verbind ich mich einfach 2 mal mit meinem pc? oder gibts da ein tool?

4) undefined error, ah, gut zu wissen!

5) wieso stellt sich das protokoll nicht auf ipv4 ein?

6) der slot sollte ok sein!

grüße!

Verfasst: 2. September 2010 23:35
von dynamo2
Uha, es geht! :)

per netcat kann ich mir was senden! danke nochmal!

also meine fehler!:

1) (ich hab mich gar nich mit meinem router verbunden)

2) ich hatte mich mit meinem pc verbunden und gehorcht, da kann gar nix kommen

3) drauf hab ich gewartet... lange...

gelöst:

1) einfach mit sich selbst verbinden und

2) per netcat sich mal was schickten, das sieht dann zb. so aus:
nc -u 10.123.123.123 3689
hallo

das fazit: es ging die ganze zeit wahrscheinlich schon... bah! ... gelöst :)

danke an solarix!

gruß an alle!

Verfasst: 2. September 2010 23:48
von solarix
Nur noch also Info: die UDP-Angaben ("udp: 494366 datagrams received") sind eine Zusammenfassung für alle Verbindungen deines Rechners (Multimedia-Streams, Spiele usw) und nicht nur deiner Qt-Software..
also wär wohl ein weg das ganze zu testen, mir selbst udp pakete zu senden, oder?
Da fehlen mir nun schlicht die Worte :P

Gruss!