(Python - beschädigte Dateien mit TCP -Prozess) Wie kann die Übertragung sicherstellen? - bearbeitetPython

Python-Programme
Anonymous
 (Python - beschädigte Dateien mit TCP -Prozess) Wie kann die Übertragung sicherstellen? - bearbeitet

Post by Anonymous »

Ich habe ein Problem mit MP4-Dateiübertragungen über TCP. 2,93% beschädigte Dateien. Keine: 189
22.9325058184639256 % beschädigte Dateien < /p>

Wie funktioniert mein Prozess? 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. /> < /li>
< /ul>
Ich habe die Dateigrößen nach dem Transfer mit dem Original auf der Kamera -PI verglichen, aber diese Methode führte zu 100% beschädigten Dateien (ich vermute, dass das Problem in meinem Code liegt, aber ich bin mir nicht sicher, wo es schief gelaufen ist). Signifikante Änderung. 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. Ich möchte jedoch mein Programm optimieren, um unnötige Wiederversendungs ​​-Iterationen zu minimieren.

Code: Select all

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>
Code vor 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>
[Bearbeiten] < /p>
Vielen Dank für Ihr Feedback. Ich konnte nicht finden, wie ich auf Ihre Kommentare antworten sollte, also bearbeite ich die Frage. Die Methode zum Hinzufügen von Teilen mit "+=" ist nicht lebensfähig und verursacht viele Fehler. Also füge ich die Brocken 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 habe vermutet, dass es nicht so einfach wäre ....) < /p>
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!  File with no extension :

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|

File with manual extension :

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|

Original file :

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