[Python-de] UDP Pakete vollständig vom socket lesen wenn die Länge vorher nicht bekannt ist?

Bastian Venthur venthur at debian.org
Do Dez 13 14:17:40 UTC 2007


Hi Liste,

ich versuche über einen Socket UDP Pakete zu lesen. Nach meinem
Verständniss kommen UDP Pakete doch immer ganz (vollstädig) oder
garnicht an oder?

Wie lese ich also vollständige Pakete von einem socket, wenn ich vorher
nicht weis wie lang sie sind?

Früher habe ich immer socket.recv(LEN) gemacht und für LEN einen Wert
gesetzt der hoffentlich größer als jedes Paket was je eintreffen wird ist.

Sollte das nicht auch eleganter gehen? Ich denke da an eine Schleife die
solange vom Socket liest bis keine Daten mehr kommen (was dann
hoffentlich dem Paketende entspricht).

Nen Testcode den ich rasch geschrieben hab sieht so aus:

class Dispatcher(asyncore.dispatcher):

    def __init__(self, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.bind(('', port))

    def writable(self):
        return False

    def handle_read(self):
        data = ''
        while True:
            d = ''
            try:
                d = self.recv(4)
            except:
                print "Ooops, something went wrong reading the socket."
            if d:
                data += d
            else:
                break
        print data

    def handle_connect(self):
        pass


if __name__ == "__main__":
    d = Dispatcher(8080)
    asyncore.loop()


So wie ich asyncore.handle_read verstanden habe, sollte das nur
aufgerufen werden wenn neue Daten am Port lesbar sind, also wenn ein
neues Paket eingetroffen ist. Nun versuche ich solange Daten vom Socket
zu lesen bis nix mehr kommt, was ich ganz naiv als Paketende
interpretiere. Ich habe bewusst eine sehr kleine Buffersize von 4
gewählt damit ich testen kann.

Wenn ich nun Daten an den besagten Port schicke deren Länge <= 4 ist
scheint alles zu klappen, aber bei längeren Daten werden immer nur die
ersten vier bytes empfangen.

Weis jemand Rat?


Schöne Grüße,

Bastian


-- 
Bastian Venthur                                      http://venthur.de
Debian Developer                                 venthur at debian org