alles daten aus dem socket auslesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Afroklaus
User
Beiträge: 5
Registriert: Freitag 16. Juni 2006, 08:32

Freitag 30. Juni 2006, 10:37

habe das problem das ich eine unbekannte anzahl von byte einlesen und weiterleiten muss!!
habe es mit folgender funktion versucht:

Code: Alles auswählen

def datenEmpfangen(socket):
    data =''
    buffsize=1024
    while 1:
        recdata =socket.recv(buffsize)
        data=data+recdata
        if not len(recdata)==buffsize:
            break

    return data  

da besteht jetzt aber das problem das wenn man genau die 1024 bytes
als nachricht empfängt, das socket blockiert und die nachricht nicht weitergeleitet werden kann..

hat jemand da ne idee um dieses problem zu lösen????

bin dankbar für jeden vorschlag!!

gruß afro
Afroklaus
User
Beiträge: 5
Registriert: Freitag 16. Juni 2006, 08:32

Freitag 30. Juni 2006, 12:02

für die rechtschreibfehler entschuldige ich mich schon mal ,war in eile ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. Juni 2006, 13:50

recv liest so lange aus dem Socket bis eben die 1024 Bytes ausgelesen worden sind.
Du kannst socket auch auf nicktblokierend stellen oder select und/oder asyncore nutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Afroklaus
User
Beiträge: 5
Registriert: Freitag 16. Juni 2006, 08:32

Freitag 30. Juni 2006, 16:54

die daten sollen trotzdem ankommen
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. Juni 2006, 17:32

Ja, aber recv gibt die Daten erst aus, wenn die 1024 Bytes vollständig gelesen sind.
Zuletzt geändert von Leonidas am Freitag 30. Juni 2006, 17:48, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 30. Juni 2006, 17:37

Afroklaus hat geschrieben:habe das problem das ich eine unbekannte anzahl von byte einlesen und weiterleiten muss!!
Hi Afro!

Um das klar zu stellen. Ich habe es nicht ausprobiert, aber vielleicht verhält sich diese Thematik so ähnlich wie das Lesen aus STDIN.
Wenn Ja, dann wird "socket.recv(buffsize)" so lange blockieren, bis der Buffer gefüllt ist.

Also, entweder du kannst die Gegenseite dazu bewegen, immer nur ein Vielfaches von "buffsize" (=1024) zu versenden oder du kannst immer nur ein einzelnes Byte empfangen und prüfen, ob du den gesamten, erwarteten Datenstrom empfangen hast.
Ach so. :-( Das wird dir aber auch nicht viel bringen, wenn du mit dem Sender kein Signal zum Beenden der Kommunikation ausgemacht hast.

Andere Variante. Finde am Anfang heraus, wie viele Bytes du insgesamt zu empfangen hast. Dann kannst du dich darauf einstellen und bei erreichen der Gesamtdatenmenge die Kommunikation abbrechen.

Anderer Vorschlag: Wenn du irgendeinen Einfluss darauf hast --> Verwende eine andere Art der Kommunikation. Irgendein höheres Protokoll wie XMLRPC oder zumindest wie von Leonidas vorgeschlagen: Asyncore. Wenn nicht, dann könnte dir "select" evt. weiter helfen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Montag 18. September 2006, 22:18

Hi Afro...

Ich habe mir eine Funktion geschrieben die mir die länge der Daten immer als string ausgibgt der 10 bytes groß is das heisst aus 1400 wird 0000001400 das kannst du dann als länge rüber seden..

beim Empfänger sagst du zuerst mysocket.recv(10) # länge und dann mysocket.recv(int(länge)) somit weiss die gegenstelle immer wie viel daten noch kommen müssen..

Code: Alles auswählen

def mylen(text):

        laenge=str(len(text))
        if len(laenge)<10:
            while 1:
                if len(laenge)<10:
                    laenge="0"+laenge
                else:

                    return laenge
        else:

            return laenge
joa nää python is toll :D
Brok3r
User
Beiträge: 29
Registriert: Montag 24. Oktober 2005, 13:48

Dienstag 19. September 2006, 05:44

Hat ein ähnliches Problem bei dem Versand von Dateien mit Hilfe von Sockets habe das damals in etwa so gelöst, da ich aber leider mein Quellcode gerade nicht vor mir habe ohne Gewähr :D

Code: Alles auswählen

datei_laenge = conn.recv ( buffsize)
datei_laenge = atoi(datei_laenge)
file = open(zieldatei,'ab')

while 1: 
            if datei_laenge == 0:
                break

            data = conn.recv(buffsize) 
            file.write(data)
            data_tmp += len(data)
            if data_tmp == datei_laenge:
                    break

file.close()
Antworten