Seite 1 von 1

Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:02
von Luiki
Hallo, ich hab in diversen Bsp-Codes Schleifen gefunden, die Daten mit recv auslesen bis keine mehr sind, aktuell hab ich:

Code: Alles auswählen

# Receive request
        while True:
            data = conn.recv(16)  
            if data:
                print data
            else:
                break
Wenn ich es debugge hängt das Programm bei den recv() -Aufruf nachdem alle Daten eigtl ausgelesen worden sind. Was ich erwarten würde is ein NULL-data und damit der else-Fall. Bei mir tritt der else-Fall, jedoch nie ein

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:04
von jens

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:11
von Luiki
hab ich schon gelesen aber
erstens wird hier eine angepasste recv-fkt geschrieben (dürfte ja für so ne std anwendung nicht notwendig sein
zweitens weiß ich ja nicht wieviele bytes angekommen sind es soll einfach der komplette buffer ausgelesen werden

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:16
von Sirius3
@Luiki: es kommt halt sehr darauf an, was Du machen willst. Normalerweise erwartet man ja eine bestimmte Anzahl an Bytes, wenn die gelesen sind, wird die Schleife beendet. Oder man merkt, dass keine Daten mehr kommen, weil der Socket geschlossen wird. Keine Daten im Puffer heißt halt nicht automatisch, alle Daten empfangen, sondern meistens, die Leitung ist zu langsam.

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:20
von BlackJack
@Luiki: Diese Schleife liest alle Daten, also alle die da jemals kommen werden, also so lange bis die Gegenseite die Verbindung schliesst. Wenn Dein Programm also nicht endet, dann ist die Verbindung immer noch offen, da könnten also noch Daten kommen, `recv()` wartet also darauf. Irgendwelche Puffer kannst Du so nicht abfragen. Das ginge mit `select()` aus dem gleichnamigen Modul, aber bevor Du damit etwas machst, solltest Du vielleicht erst einmal verraten was Du da *eigentlich* machen willst, denn Deine Frage deutet auf Missverständnisse hin wie TCP funktioniert. Das ist ein Datenstrom von dem ein `recv()`-Aufruf einen Ausschnitt liefert der mindestens 1 Byte liefert (solange die Verbindung offen ist) bis maximal die angegebene Zahl von Bytes. Welcher Ausschnitt das ist muss *nichts* damit zu tun haben wie die Daten beim Sender auf die Reise geschickt wurden. `recv()` ist also in der tat alleine ziemlich doof und man wird sich so ziemlich *immer* eine Hilfsfunktion oder Klasse schreiben müssen!

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:32
von Luiki
ich möchte die funktion eines http-servers nachahmen, d.h.

GET von client
antwort vom server
evtl weiteres GET von client etc

sollte ich also für jede anfrage/antwort einen neuen socket öffnen?

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:38
von BlackJack
@Luiki: Grundsätzlich ja, HTTP kennt allerdings auch die Möglichkeit eine Verbindung für mehr als eine Anfrage/Antwort zu verwenden. Das steht in der HTTP-Spezifikation.

Edit: Die meisten Browser verwenden die Verbindung heutzutage anscheinend für mehr als eine Anfrage. Da musst Du also die Anfragen ordentlich auseinanderhalten beim empfangen.

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:53
von Sirius3
@Luiki: HTTP ist ein zeilenbasiertes Format, Du mußt also immer bis zum Ende einer Zeile lesen und diese verarbeiten. Damit ist das natürliche Ende der while-Schleife vorgegeben.

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Mittwoch 19. November 2014, 17:53
von jens
Luiki hat geschrieben:ich möchte die funktion eines http-servers nachahmen, d.h.
Warum gehst du dann so in die Tiefe und nutzt nicht https://docs.python.org/3/library/http.server.html ?

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Donnerstag 20. November 2014, 13:45
von Luiki
@jens: ich möchte keinen echten http-server, ist nur zu übuzngszwecken für ein anderes projekt

@Sirius3: wie erkenne ich das Ende einer Zeile? "\n"?

Re: Socket recv - abfragen wenn keine Daten mehr im Buffer

Verfasst: Donnerstag 20. November 2014, 14:02
von BlackJack
@Luiki: Bei HTTP eigentlich '\r\n' aber man sollte mit beidem klarkommen. Nicht jeder Client hält sich 100%ig an HTTP. :-)

Wobei man nicht nur die erste Zeile lesen darf, sondern auch eventuell gesendete Header. Das Endkennzeichen davon ist eine Leerzeile. Je nach dem was Du von HTTP untserstützen möchtest, können danach dann noch Daten kommen. Wie viele Bytes das sind steht in dem Fall im Header 'Content-Length'.