Seite 1 von 1

[Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Sonntag 29. August 2010, 18:41
von metty
Hallo zusammen,

ich "spiele" gerade ein wenig mit Sockets rum um eine Datei zu übertragen.
Keine Angst, mein Programm funktioniert schon und tut was es soll, mich interessiert jedoch ob es noch (eine) andere Möglichkeit(en) gibt, eine Datei via Sockets zu übertragen.

Bei meinem Programm mache ich es so:
Ich übertrage vor dem eigentlichen Transfer der Datei erst die Dateigröße, dann erst starte ich die eigentliche Übertragung der Datei.
Die zuvor gesendete Dateigröße verwende ich in einer Schleife, um sie mit der Buffersize "runterzuzählen". (Ich glaube diese Variante wird ziemlich oft verwendet.)

Welche Alternativen gibt es sonst noch? Geht es auch ohne vorher die Dateigröße senden zu müssen?
Hierzu würde mir nur etwas in der Art einfallen:

Code: Alles auswählen

while true:
  data = sock.recv(BUFFER)
  if not data:
    break
  machwasmitdata(data) #Funktion die irgendwas mit 'data' macht
Kennt ihr andere Varianten, bzw. welche Variante bevorzugt ihr?
Bei der Variante mit der Dateigröße könnte man am Schluss beispielsweise noch die übertragenen Daten mit der wirklichen Dateigröße vergleichen um zumindest eine "kleine Sicherheit" zu haben, ob alles funktioniert hat.

Freundliche Grüße

Re: [Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Sonntag 29. August 2010, 20:36
von Dauerbaustelle
Ich würde auf jeden Fall noch eine SHA-X-Summe übertragen, um sicherzustellen, dass auch das ankam, was versandt wurde. Ansonsten kann ich, falls auf deinem OS verfügbar, "py-sendfile" von Python Package Index empfehlen. Mit `sendfile` können Dateien ohne In-Memory-Kopieren an einen Socket versandt werden, was einen erheblichen Geschwindigkeitsvorteil bringt.

Re: [Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Sonntag 29. August 2010, 21:15
von metty
Dauerbaustelle hat geschrieben:Ich würde auf jeden Fall noch eine SHA-X-Summe übertragen, um sicherzustellen, dass auch das ankam, was versandt wurde. Ansonsten kann ich, falls auf deinem OS verfügbar, "py-sendfile" von Python Package Index empfehlen. Mit `sendfile` können Dateien ohne In-Memory-Kopieren an einen Socket versandt werden, was einen erheblichen Geschwindigkeitsvorteil bringt.
Ich habe bis jetzt immer md5 Summen mit übertragen, ist es sinnvoller SHA Summen zu verwenden?
py-sendfile guck ich mir mal an, vielen Dank.

Re: [Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Sonntag 29. August 2010, 23:29
von Dauerbaustelle
metty hat geschrieben:Ich habe bis jetzt immer md5 Summen mit übertragen, ist es sinnvoller SHA Summen zu verwenden?
Für deinen Einsatzzweck wohl vollkommen wurscht, aber bei MD5 ist die Kollisionsgefahr theoretisch höher.

Re: [Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Montag 30. August 2010, 09:47
von EyDu
Und wenn du TCP/IP verwendest, dann kannst du dir die ganze Prüfung auch gleich sparen.

Re: [Socket] Möglichkeiten eine Datei zu übertragen?

Verfasst: Montag 30. August 2010, 10:54
von metty
EyDu hat geschrieben:Und wenn du TCP/IP verwendest, dann kannst du dir die ganze Prüfung auch gleich sparen.
Naja, die Übertragung via TCP will ich damit auch nicht kontrollieren, sondern viel eher, ob das was ich gespeichert hab auch das ist, was vom Client abgeschickt wurde.
Es kann beim speichern immer etwas passieren. Deswegen Prüfsummen...