Seite 1 von 1

alles daten aus dem socket auslesen

Verfasst: Freitag 30. Juni 2006, 10:37
von Afroklaus
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

Verfasst: Freitag 30. Juni 2006, 12:02
von Afroklaus
für die rechtschreibfehler entschuldige ich mich schon mal ,war in eile ;)

Verfasst: Freitag 30. Juni 2006, 13:50
von Leonidas
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.

Verfasst: Freitag 30. Juni 2006, 16:54
von Afroklaus
die daten sollen trotzdem ankommen

Verfasst: Freitag 30. Juni 2006, 17:32
von Leonidas
Ja, aber recv gibt die Daten erst aus, wenn die 1024 Bytes vollständig gelesen sind.

Re: alles daten aus dem socket auslesen

Verfasst: Freitag 30. Juni 2006, 17:37
von gerold
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
:-)

Verfasst: Montag 18. September 2006, 22:18
von JanDMC
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

Verfasst: Dienstag 19. September 2006, 05:44
von Brok3r
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()