Seite 1 von 1

Kopieren übers Internet

Verfasst: Dienstag 27. Juli 2010, 20:02
von waki
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ß

Re: Kopieren übers Internet

Verfasst: Dienstag 27. Juli 2010, 20:12
von 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.

Re: Kopieren übers Internet

Verfasst: Mittwoch 28. Juli 2010, 07:58
von mkesper
Wieso nicht ein höheres Protoikoll verwenden? ftp, sftp oder Ähnliches gibt es ja schon für solche Zwecke.