Beschädigte Dateien mit TCP -Prozess - Wie kann die Übertragung sicherstellen?Python

Python-Programme
Anonymous
 Beschädigte Dateien mit TCP -Prozess - Wie kann die Übertragung sicherstellen?

Post by Anonymous »

Ich habe ein Problem mit MP4-Dateiübertragungen über TCP. 2,93% beschädigte Dateien.

Code: Select all

MP4 : 6256 | None : 189
2.9325058184639256 % corrupted files
< /code>
 Wie mein Prozess funktioniert < /h4>
Ich habe eine TCP -Verbindung auf dem Speicher -Raspberry Pi eingerichtet. Jedes X -Mal stellt der Camera Raspberry Pi eine Verbindung zum Speicher -PI her und sendet die Videodatei. Sobald die Datei gesendet und geschrieben wurde, ist die Verbindung geschlossen. />  Ich habe die Dateigrößen nach dem Transfer mit dem Original auf der Kamera pi verglichen, aber diese Methode hat zu 100% beschädigten Dateien geführt (ich vermute, dass das Problem in meinem Code liegt, aber ich bin mir nicht sicher, wo es schief gelaufen ist). Ich strebe < /h4>
Ich möchte wirklich 0% beschädigte Dateien erreichen. Ich denke darüber nach, einen Überprüfungsschritt nach dem Schreiben zu implementieren, indem ich das Dateiformat überprüfe. Wenn es sich um einen Nicht -Einsatz -Typen handelt, würde ich eine Wiederherstellung anfordern. [url=viewtopic.php?t=14917]Ich möchte[/url] jedoch mein Programm optimieren, um unnötige Wiederversendungs ​​-Iterationen zu minimieren.def receive_file(self, client_socket, file_name):
with open(file_name+"/"+datetime.now().strftime("%y_%m_%d_%H_%M_%S"), 'wb') as f:
while True:
chunk = client_socket.recv(1500)
if not chunk:
break
f.write(chunk)
if chunk == b'END':
print("End Key, conenction will be closed")
break

def start_serv(self):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((self.server_host, self.server_port))
server_socket.listen(3)
print("[TCP] Server Started")
while True:
read, _, _ = select.select(self.connected + [server_socket], [], [])

for sock in read:
if sock == server_socket:
client_socket, addr = server_socket.accept()
self.connected.append(client_socket)
print(f"[TCP] New connection : {client_socket}")
print(f"[TCP] Currently in queue : {self.connected} ")
else:
try:
self.receive_file(sock, self.video_path+"/"+addr[0])
sock.close()
self.connected.remove(sock)

print(f"[TCP] Video stored in {self.video_path +'/'+ addr[0]}")
except Exception as e:
print(f"[TCP] Erreur lors de la réception : {e}")
self.connected.remove(sock)
sock.close()
< /code>
vor der Kamera PI: < /p>
 def send_file(self, file_path: str):
"""Envoie un fichier au serveur via TCP."""
if not self.client_socket:
print("[ERROR] TCP not linked anymore.")
return

if not os.path.exists(file_path):
print(f"[ERROR] wrong file path : {file_path}")
return

try:
with open(file_path, "rb") as file:
while chunk := file.read(1500):
self.client_socket.sendall(chunk)
self.client_socket.sendall(b'END')
print(f"[TCP] file '{file_path}' sent.")
os.remove(file_path)
except Exception as e:
print(f"[ERROR] Hu, something wrong happend : {e}")
< /code>
(Ich schließe es in einer anderen Funktion) < /p>
 Weitere Untersuchung < /h4>
Ich habe den Endschlüssel entfernt. Tatsächlich hat es keinen großen Zweck erfüllt. Die Methode zum Hinzufügen von Chunks mit += 
ist nicht lebensfähig und verursacht viele Fehler. Also füge ich die Teile jetzt an eine Liste hinzu und verwende B '' .Join (Chunk) bevor ich sie schreibe. Nachdem ich die Datei 1000 -mal gesendet hatte, habe ich zunächst Dateien mit Größen in der Nähe oder gleich der Referenzdatei erhalten, jedoch ohne Erweiterung. (Ich vermutete, dass es nicht so einfach wäre ...)
Ich habe dann versucht zu sehen, ob die Dateierweiterung vor dem Schreiben identifiziert werden könnte, und dafür habe ich die Magic Library mit Magic.from_buffer (Datei in Bytes, mime = true) verwendet. Leider konnte die Erweiterung das Dateiformat nicht erkennen. Dann hatte ich die Idee, die ersten 10 Zeilen zwischen der empfangenen Datei und der gesendeten Datei zu vergleichen, Bingo!

Code: Select all

raspberry@raspberrypi:~ $ hexdump -C  /home/raspberry/Tcp/25_04_11_13_22_54 | head -n 10
00000000  00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 00  |............@...|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 02 00 00 02 32  |...............2|
00000030  74 72 61 6b 00 00 00 5c  74 6b 68 64 00 00 00 03  |trak...\tkhd....|
00000040  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 01 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  00 00 00 00 40 00 00 00  0c a8 00 00 08 70 00 00  |....@........p..|
00000090  00 00 00 24 65 64 74 73  00 00 00 1c 65 6c 73 74  |...$edts....elst|
< /code>
Datei mit manueller Erweiterung: < /p>
raspberry@raspberrypi:~ $ hexdump -C  /home/raspberry/Tcp/25_04_11_13_22_54.mp4 | head -n 10
00000000  00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 00  |............@...|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 02 00 00 02 32  |...............2|
00000030  74 72 61 6b 00 00 00 5c  74 6b 68 64 00 00 00 03  |trak...\tkhd....|
00000040  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 01 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  00 00 00 00 40 00 00 00  0c a8 00 00 08 70 00 00  |....@........p..|
00000090  00 00 00 24 65 64 74 73  00 00 00 1c 65 6c 73 74  |...$edts....elst|
< /code>
Originaldatei: < /p>
raspberry@raspberrypi:~ $ hexdump -C  /home/raspberry/Tcp/reference.mp4 | head -n 10
00000000  00 00 00 1c 66 74 79 70  69 73 6f 35 00 00 02 00  |....ftypiso5....|
00000010  69 73 6f 35 69 73 6f 36  6d 70 34 31 00 00 03 30  |iso5iso6mp41...0|
00000020  6d 6f 6f 76 00 00 00 6c  6d 76 68 64 00 00 00 00  |moov...lmvhd....|
00000030  00 00 00 00 00 00 00 00  00 00 03 e8 00 00 00 00  |................|
00000040  00 01 00 00 01 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000070  40 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |@...............|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 02  |................|
00000090  00 00 02 32 74 72 61 6b  00 00 00 5c 74 6b 68 64  |...2trak...\tkhd|
< /code>
Das Problem ist, dass die ersten 5 Zeilen fehlen und der 6. teilweise da ist.  Wenn ich es gut verstanden habe, das alles verursacht, einschließlich der Dateierweiterung, zu verschieben.import socket
import select
from datetime import datetime
import magic
server_host="192.168.1.100"
server_port=8000
video_path = "/home/raspberry/Tcp"

connected = []

def receive_file(client_socket, file_name):
Transfer_size = client_socket.recv(100)
Transfer_size = int.from_bytes(Transfer_size,'big')
print(f"[TCP] Fichier video de {Transfer_size}")
sending=True
vid = []

while sending:
chunk = client_socket.recv(1500)
vid.append(chunk)
if not chunk:
break
contenu = b''.join(vid)
mime = magic.from_buffer(contenu,mime=True)
print(f"Extension detected : {mime}")

with open(file_name+"/"+datetime.now().strftime("%y_%m_%d_%H_%M_%S"), 'wb') as f:

print(f"Transfert end : {len(chunk)/Transfer_size}")
f.write(b''.join(vid))

def start_serv():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((server_host, server_port))
server_socket.listen(3)
print("[TCP] Server Started")
while True:
read, _, _ = select.select(connected + [server_socket], [], [])

for sock in read:
if sock == server_socket:
client_socket, addr = server_socket.accept()
client_socket.recv(100)
connected.append(client_socket)
print(f"[TCP] New connection : {client_socket}")
print(f"[TCP] Currently in queue : {connected} ")
else:
try:
receive_file(sock, video_path)
sock.close()
connected.remove(sock)

print(f"[TCP] Video stored in {video_path}")
except Exception as e:
print(f"[TCP] Erreur lors de la réception : {e}")
connected.remove(sock)
sock.close()

start_serv()
< /code>
Neue Kamera -Himbeere: < /p>
import socket
import os
server_host="192.168.1.100"
server_port=8000
server_host = server_host
server_port = server_port
client_socket = None
ip = "192.168.1.102"
path = "/home/raspberry/recorded_videos/13434423_3240_2160_25fps.mp4"
taille = os.path.getsize(path)
def connect():
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((server_host, server_port))
print(f"[TCP] connected {server_host}:{server_port}")
except Exception as e:
print(f"[ERROR TCP] : {e}")
client_socket = None
return client_socket

def send_file( file_path: str,client_socket,taille = taille):
compteur_envoi = 0
client_socket.send(taille.to_bytes(100,'big'))
if not client_socket:
print("[ERROR] TCP not linked anymore.")
return
if not os.path.exists(file_path):
print(f"[ERROR] wrong file path : {file_path}")
return
try:
with open(file_path, "rb") as file:
while chunk := file.read(1500):
client_socket.sendall(chunk)
compteur_envoi += len(chunk)
print(f"[TCP] file '{file_path}' sent.")
except Exception as e:
print(f"[ERROR] Hu, something wrong happend : {e}")

def close(client_socket):
if client_socket:
client_socket.close()
print("[TCP] Link closed.")
i =0
while i < 1000:
client_socket = connect()
send_file(path,client_socket )
close(client_socket)
i+=1
print(i)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post