Zu Lesende Bytes rausbekommen - Sockets



  • Hi,
    ich habe per UDP eine verbindung zu einem Server hergestellt und ihm eine anfrage gesendet, ich möchte nun nicht alles auf einmal empfangen sondern erst 20 Bytes und dann den rest. Wie könnte man soetwas realisieren.

    PS. bei PHP gibts die Funktion

    // Verbindungsstatus abfragen
    $status = socket_get_status($server_con);
    

    die unteranderem auch die anzahl der ungelesen bytes mitteilt.



  • Ein Socket ist aus der Sicht des OS der Endpunkt einer Netzwerkverbindung und wird wie ein Dateistrom behandelt. Das bedeutet, wenn Daten ankommen kannst Du auch weniger einlesen als vorhanden sind, der Rest verbleibt im Puffer.

    Lesen kannst die Daten häppchenweise mit recvfrom:

    MSDN:

    int recvfrom (
      SOCKET s,                   
      char FAR* buf,              
      int len,                    
      int flags,                  
      struct sockaddr FAR* from,  
      int FAR* fromlen            
    );
    

    int len ist die Anzahl der Bytes die du lesen möchtest, der Return wert sagt wieviel Bytes tatsächlich gelesen wurden. Das wiederholst häppchenweise solange bis der Returnwert 0 ist. Dann sind alle Daten eingelesen. 😉

    Da Du UDP verwendest musst du recvfrom verwenden, nicht recv!

    Gruss René



  • If the packet is longer than SIZE bytes, then you get the first
    SIZE bytes of the packet and the rest of the packet is lost.
    There's no way to read the rest of the packet. Thus, when you use
    a packet protocol, you must always know how long a packet to
    expect.

    zugegeben, das ist aus der libc-Doku, aber Winsock sollte sich davon nur marginal unterscheiden



  • aus MSDN:

    For message-oriented sockets, data is extracted from the first enqueued message, up to the size of the buffer supplied. If the datagram or message is larger than the buffer supplied, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost.

    Hatte da irgenwie was falsch in Erinnerung. sry! 🙄



  • Warum willst du denn nur 20 Bytes auslesen? Lies doch einfach alles aus (die maximale Nachrichtengröße erhältst du, glaube ich, korrekterweise über getsockopt mit SO_MAX_MSG_SIZE) und untersuch den Inhalt dann stückweise.


Anmelden zum Antworten