Kopieren übers Internet

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Hey,
ich möchte gerade gerne mit meinem Script Dateien übers Internet per socket kopieren. Momentan sieht mein code so aus :

Code: Alles auswählen

while 1:
    buff = sock.recv(buffsize)
    if not buff:
        break
    datei += buff
und

Code: Alles auswählen

while 1:
    buff = fobj.read(buffsize)
    if not buff:
        break
    sock.send(buff)
Das ganze funktioniert soweit, jedoch hab ich ein Problem dem oberen Code klarzumachen, wann der Empfang der Datei vorbei ist.
Ich habe schon versucht indem ich am schluss "closed" schicke, doch dies geht entweder in der vorherigen nachricht unter oder wird an die nächste hingehengt und beim nächste sock.recv() empfangen.

Ich habe auch schon ausrechnen lassen, in wie vielen Paketen es komment müssten, aber es wird zu früh der empfang abgebrochen, weil er anscheinend schon alle Pakete hat. Gibt es einen guten weg ies zu lösen? Die Methode hier hab ich aus der ftp lib geholt, aber hier funktioniert sie nicht.

Timeout will ich nicht nehmen, da ich die Verbindung sosnt wieder extra herstellen muss (oder?)

Jemand eine gute Idee oder weiß wie ich es machen muss?

gruß
BlackJack

@waki: Du musst entweder am Anfang übertragen wieviele Bytes an Daten folgen und dann eben so viele lesen, oder ein Endekennzeichen senden, dass nicht in den regulären Daten vorkommen kann, bzw. dort irgendwie gekennzeichnet wird, dass man es vom Ende eindeutig unterscheiden kann.

Noch zwei Anmerkungen: Es gibt in Python jetzt schon sehr lange Wahrheitswerte -- ein ``while True:`` ist IMHO verständlicher. Und das Zusammensetzen durch wiederholtes ``+=`` ist ineffizienter als das sammeln in einer Liste, die man am Ende mit der `join()`-Methode auf einer leeren Zeichenkette zusammensetzt.

Die ``while``-Schleifen könnte man auch mit der `iter()`-Funktion als ``for``-Schleifen schreiben. Beim Sender bräuchte man dazu noch `functools.partial()` wenn man keine ``lambda``-Funktion schreiben möchte.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wieso nicht ein höheres Protoikoll verwenden? ftp, sftp oder Ähnliches gibt es ja schon für solche Zwecke.
Antworten