Datein über Netzwerk kopieren funktioniert fehlerhaft

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Gast

Hallo Leute,

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
Das Empfängerprogram:

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
Antworten