UDP empfangen bis keine Daten mehr kommen

Dieses Thema im Forum "C/C++" wurde erstellt von Greenleon, 18.11.2009.

  1. #1 Greenleon, 18.11.2009
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Hi,

    ich bastle im Moment an einem Tool, dass sich Daten von einem UDP Server holen soll.
    Dazu stelle ich erst eine Verbindung her, sende dann ein Kommando und will dann so lange empfangen, bis nichts mehr kommt.

    Das senden funktioniert gut und ich bekomme auch eine Antwort.

    Das Problem ist, dass ich vorher nicht weiss, wie lang die Kette ist, die ich bekomm, deswegen muss ich theoretisch mit while arbeiten.

    Der entsprechende Teil sieht so aus, wobei buffer ein char array ist und sock der udp socket.

    Code:
     do{
        n=recv(
         sock,
         buffer,
         sizeof(buffer),
         0
        );
       printf("%i\n",n);
       for(i=0; i<sizeof(buffer);i++)
         printf("%c\n",buffer[i]);
       
       } while(n>0);
    
    Auch merkwuerdig ist, dass er die Daten nur ausgibt, wenn ich das \n in printf belasse. Ansonsten gehts nur bis zum ersten Zeilenumbruch in den empfangenen Daten.

    Hat jemand ne Idee, wie ich eine gescheite Abbruchbedingung formuliert bekomme und warum die Ausgabe nicht richtig funktioniert?

    Danke euch!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 19.11.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    ich bin nicht so der C Crack, und auch mit UDP habe ich noch nie gearbeitet, aber gewisse Vermutungen und Ideen haette ich trotzdem anzubieten. ;)

    IMHO ist das genau genommen schon eine falsche Aussage, denn UDP arbeitet ohne Verbindungen, du schickst einfach drauf los. Es sei denn meine geringen UDP Kenntnisse lassen mich grade voellig im Stich. ;)
    UDP kennt zwar Source Port und Destination Port, aber keine Verbindungen.

    Zur Ausgabe siehe weiter unten, aber ich verstehe vor allem nicht warum du nicht einfach TCP benutzt. Aber auch mit UDP lassen sich natuerlich Dinge basteln; ich wuerde wahrscheinlich direkt am Anfang durchgeben lassen wie viele Bytes gesendet werden sollen, und mir das erst ordentlich bestaetigen lassen, bevor die eigentlichen Daten gesendet werden. Das dumme an UDP ist natuerlich, wenn alles ankommen soll, muss auch alles per Hand gecheckt werden. Fuer die genaue Implementierung empfehle ich ein gutes Netzwerkbuch a la Computer Networks von A. Tanenbaum.

    Wenn es doch nicht so wichtig ist dass wirklich alles ankommt, koenntest du doch z.B. einfach eine bestimmte Byte oder Bit Reihenfolge als Anfangsmarkierung und eine andere Folge als Endmarkierung mitgeben (jo, wuerde wohl byte oder bit stuffing erfordern). Aber den Anfang und das Ende muesste man sich wohl extra bestaetigen lassen, bestimmte TCP features muessen eben fuer kritische Stellen im Protokoll nachgebaut werden.

    Wie gesagt, meine C Kenntnisse sind eher bescheiden, aber ich wuerde vermuten dass der Rest noch gebuffert ist, und deswegen noch nicht geschrieben wird:
    http://drpaulcarter.com/cs/common-c-errors.php#4.3

    Statt \n mal fflush(stdout) probiert?

    mfg,
    bytepool
     
  4. #3 Greenleon, 19.11.2009
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Technisch gesehen hast du Recht. UDP ist Verbindungslos.
    Aber connect() in C kann man trotzdem aufrufen dann muss man beim Empfangen und Senden weniger Argumente uebergeben.

    Ich hab jetzt aber schon eine Loesung gefunden.
    Ich ueberpruefe, ob weniger Bytes empfangen wurden als die Puffergroesse ist, wenn ja, dann nehme ich einfach das Ende der Uebertragung an.

    Ich teste das mal ausgiebig.

    Ich benutze UDP, da die Serverapplikation nicht von mir ist. Ich versuche mir die Serverliste von nem Masterserver zu holen.
     
  5. #4 pferdefreund, 07.12.2009
    pferdefreund

    pferdefreund Doppel-As

    Dabei seit:
    26.12.2007
    Beiträge:
    144
    Zustimmungen:
    0
    Falls die Daten nur sporadisch kommen, könnte man auch in einem
    subthread nen Timer laufen lassen und bei Zeitüberschreitung nen
    Schalter im While abfragen. Dazu müßte man dann allerdings non-blocking lesen und
    auch hier ne kurze Wartezeit einbauen (wegen CPU-Last).
     
  6. #5 Greenleon, 08.12.2009
    Greenleon

    Greenleon Tripel-As

    Dabei seit:
    08.01.2007
    Beiträge:
    184
    Zustimmungen:
    0
    Hab rausgefunden, dass der Server immer EOF am Ende des letzten Pakets sendet. Ueberpruefe jetzt einfach bei jedem Schleifendurchlauf ob die letzten 3 Bytes ASCII 'E' 'O' 'F' entsprechen und breche dementsprechend ab.

    Aber danke :-)
     
Thema:

UDP empfangen bis keine Daten mehr kommen

Die Seite wird geladen...

UDP empfangen bis keine Daten mehr kommen - Ähnliche Themen

  1. kann keine Dateien über Kopete(msn) empfangen

    kann keine Dateien über Kopete(msn) empfangen: Tachchen, ich wieder... hab zwar scho hier im Forum gesucht,aber nichts dazu gefunden..oder ich hab eben nicht richtig geschaut, deswegen...
  2. Suche Programm zum SMS senden und empfangen via Handy SIM am PC

    Suche Programm zum SMS senden und empfangen via Handy SIM am PC: Hallo Leute, ich bin ein viel SMS-Schreiber und bin eig immer wieder zu faul die SMSen an meiner kleinen Handytastatur, die eh nicht mehr...
  3. exim4 für jedes empfangene Mail eine eigene Datei?

    exim4 für jedes empfangene Mail eine eigene Datei?: Hallo zusammen Habe eine kleine Frage zu exim4, welches ja die empfangenen Mails in eine Datei im Ordner /var/spool/mail anfügt. Leider sind...
  4. Mit Bash eine Mail empfangen, dann den Anhang auslesen und speichern

    Mit Bash eine Mail empfangen, dann den Anhang auslesen und speichern: Hallo Gemeinde, ich habe hier eine Problematik zu lösen - welche ich gerne auf gutem linuxianisch sauber automatisieren würde. Ich habe einen...
  5. Wie war das nochmal mit dem Empfangen von Daten über bluetooth ?

    Wie war das nochmal mit dem Empfangen von Daten über bluetooth ?: Hi@all Ich habe besitze ein T280i von Sony Erricson und einen i.Tech Dynamic Limited Bluetooth Dongle. Soweit bin ich bisher gekommen:...