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

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und wenn du TCP/IP verwendest, dann kannst du dir die ganze Prüfung auch gleich sparen.
Das Leben ist wie ein Tennisball.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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...
Antworten