ich bin dabei, ein Programm zu erstellen, welches Dateien über Netzwerk kopiert. Die Übermittlung geschieht blockweise (z.B. 1MB-Packete) und wird Mithilfe eines SHA-Codes, welcher vor dem Versand erstellt wurde, nach dem Eingang auf ihre Vollständigkeit hin überprüft.
Kopiere ich local funktioniert alles reibungslos, doch sobald ich auf einen anderen Rechner im Netz kopieren möchte, scheint er mit dem Empfang von "checksum" und "filecontent" durcheinanderzukommen und vermischt die beiden. Das passiert mir vor allem, wenn die Packetgröße in der verschickt wird ("blocksize") ansteigt (1KB funktioniert gut, 1MB gar nicht, die Datei als ein Packet verschickt funktioniert wieder einwandfrei).
Wäre toll, wenn jemand eine Idee hat, wo mein Denkfehler liegt.
Das Versendeprogram:
Code: Alles auswählen
import filecmp
import socket
import sha
blocksize = 1024
readfrom="file1"
HOST = '192.168.1.99'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
fr=file(readfrom, "rb")
count_filecontent=0
count_checksum=0
# sending blocksize
s.send(str(blocksize))
s.recv(1)
while 1:
# read file
filecontent=fr.read(blocksize)
# create checksum of content
sha_check=sha.new(filecontent)
checksum=sha_check.hexdigest()
# sending data
count_filecontent+=s.send(filecontent)
s.recv(1)
print "CHECKSUM:", checksum
count_checksum+=s.send(checksum)
s.recv(1)
if len(filecontent) != blocksize:
break
fr.close()
s.close()
print count_filecontent/1024, "KB + ", count_checksum, "KB Data sent."
while 1:
try:
txt=input("Enter -> Ende")
break
except:
break
Code: Alles auswählen
import filecmp
import socket
import sha
writeto="file2"
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
fw=file(writeto, "wb")
# receiving blocksize
blocksize=int(conn.recv(32))
conn.send("1")
while 1:
# receiving data
filecontent=conn.recv(blocksize)
conn.send("1")
checksum=conn.recv(160)
conn.send("1")
print "CHECKSUM:", checksum
# checking file integrity
sha_check=sha.new(filecontent)
if not checksum == sha_check.hexdigest():
print "Fehler in der Uebertragung! -> Abbruch"
# writing data to file
fw.write(filecontent)
if len(filecontent) != blocksize:
break
fw.close()
s.close()
while 1:
try:
txt=input("Enter -> Ende")
break
except:
break