From 79f523be48db1d3e5e5b811592bb77e12ccdac18 Mon Sep 17 00:00:00 2001 From: TIBERGHIEN corentin Date: Sun, 25 Jan 2026 00:55:57 +0100 Subject: [PATCH 1/3] wip bigfix --- client-gui/src/gui_app.rs | 16 ++- client-network/src/datum_parsing.rs | 145 ++++++++++++------------ client-network/src/message_handling.rs | 6 +- client-network/src/messages_channels.rs | 3 +- 4 files changed, 91 insertions(+), 79 deletions(-) diff --git a/client-gui/src/gui_app.rs b/client-gui/src/gui_app.rs index 3e380aa..5e606fe 100644 --- a/client-gui/src/gui_app.rs +++ b/client-gui/src/gui_app.rs @@ -262,6 +262,7 @@ impl eframe::App for P2PClientApp { if let Some(addr) = &self.active_peer { if let Some(roottree) = self.loaded_fs.get(addr) { if let Some(root) = roottree.data.get(&hash) { + self.current_downloading_file_map.root = hash; self.root_downloading_file = name; let _ = self .current_downloading_file_map @@ -299,11 +300,12 @@ impl eframe::App for P2PClientApp { } _ => {} } + println!("remaining chunks size: {}", self.remaining_chunks.len()); if self.remaining_chunks.is_empty() { - /*let file = OpenOptions::new() - .append(true) - .create(true) - .open(self.root_downloading_file.clone()); + let file = OpenOptions::new().append(true).create(true).open( + "./Download/".to_string() + + &remove_null_bytes(&self.root_downloading_file.clone()), + ); if let Some(current) = self .current_downloading_file_map @@ -322,8 +324,10 @@ impl eframe::App for P2PClientApp { eprintln!("error creaation file: {}", e); } } - }*/ - println!("bigfile téléchargé"); + } else { + eprintln!("error root absent"); + } + println!("bigfile téléchargé {}", self.root_downloading_file); } } NetworkEvent::Success(msg, peer_username) => { diff --git a/client-network/src/datum_parsing.rs b/client-network/src/datum_parsing.rs index 13aca63..d3f03e1 100644 --- a/client-network/src/datum_parsing.rs +++ b/client-network/src/datum_parsing.rs @@ -14,81 +14,86 @@ pub fn parse_received_datum( let value = &recevied_datum[32..recevied_datum.len()]; let value_slice = value.to_vec(); println!("valueslice: {:?}, {}", value_slice, value_slice.len()); - let datum_type = value_slice[0]; - match datum_type { - CHUNK => Some(( - hash_name, - MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), - )), - DIRECTORY => { - let mut dir_entries = Vec::new(); - let mut offset = 1 as usize; - for i in 0..((value_slice.len() - 1) / 64) as u8 { - offset = (1 + 64 * i as usize) as usize; - println!("offset:{}, i:{}", offset, i); - let name = &value_slice[offset..offset + 32]; - let mut hash = [0u8; 32]; - hash.copy_from_slice(&value_slice[offset + 32..offset + 64]); - let dp_name = String::from_utf8(name.to_vec()).expect("err"); - println!("name:{}", dp_name); - - // envoyer un datum request - dir_entries.push(DirectoryEntry { - filename: name.try_into().expect("incorrect size"), - content_hash: hash, - }); - } - - let current = DirectoryNode::new(dir_entries); - match current { - Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))), - Err(e) => { - println!("{}", e); - None - } - } - } - BIG => { - let mut bigdir_entries: Vec = Vec::new(); - let mut offset = 1 as usize; - for i in 0..((value_slice.len() - 1) / 32) as u8 { - offset = (1 + 32 * i as usize) as usize; - println!("offset:{}, i:{}", offset, i); - let hash = &value_slice[offset..offset + 32]; - - // envoyer un datum request - bigdir_entries.push(hash.try_into().expect("incorrect size")); - } - - println!("its a BIG bro"); - Some(( + let digest = Sha256::digest(&value); + if digest.to_vec() != hash_name.to_vec() { + None + } else { + let datum_type = value_slice[0]; + match datum_type { + CHUNK => Some(( hash_name, - MerkleNode::Big(crate::BigNode { - children_hashes: bigdir_entries, - }), - )) - } - BIGDIRECTORY => { - let mut bigdir_entries: Vec = Vec::new(); - let mut offset = 1 as usize; - for i in 0..((value_slice.len() - 1) / 32) as u8 { - offset = (1 + 32 * i as usize) as usize; - println!("offset:{}, i:{}", offset, i); - let hash = &value_slice[offset..offset + 32]; + MerkleNode::Chunk(crate::ChunkNode { data: value_slice }), + )), + DIRECTORY => { + let mut dir_entries = Vec::new(); + let mut offset = 1 as usize; + for i in 0..((value_slice.len() - 1) / 64) as u8 { + offset = (1 + 64 * i as usize) as usize; + println!("offset:{}, i:{}", offset, i); + let name = &value_slice[offset..offset + 32]; + let mut hash = [0u8; 32]; + hash.copy_from_slice(&value_slice[offset + 32..offset + 64]); + let dp_name = String::from_utf8(name.to_vec()).expect("err"); + println!("name:{}", dp_name); - // envoyer un datum request - bigdir_entries.push(hash.try_into().expect("incorrect size")); - } + // envoyer un datum request + dir_entries.push(DirectoryEntry { + filename: name.try_into().expect("incorrect size"), + content_hash: hash, + }); + } - let current = BigDirectoryNode::new(bigdir_entries); - match current { - Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), - Err(e) => { - println!("{}", e); - None + let current = DirectoryNode::new(dir_entries); + match current { + Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))), + Err(e) => { + println!("{}", e); + None + } } } + BIG => { + let mut bigdir_entries: Vec = Vec::new(); + let mut offset = 1 as usize; + for i in 0..((value_slice.len() - 1) / 32) as u8 { + offset = (1 + 32 * i as usize) as usize; + println!("offset:{}, i:{}", offset, i); + let hash = &value_slice[offset..offset + 32]; + + // envoyer un datum request + bigdir_entries.push(hash.try_into().expect("incorrect size")); + } + + println!("its a BIG bro"); + Some(( + hash_name, + MerkleNode::Big(crate::BigNode { + children_hashes: bigdir_entries, + }), + )) + } + BIGDIRECTORY => { + let mut bigdir_entries: Vec = Vec::new(); + let mut offset = 1 as usize; + for i in 0..((value_slice.len() - 1) / 32) as u8 { + offset = (1 + 32 * i as usize) as usize; + println!("offset:{}, i:{}", offset, i); + let hash = &value_slice[offset..offset + 32]; + + // envoyer un datum request + bigdir_entries.push(hash.try_into().expect("incorrect size")); + } + + let current = BigDirectoryNode::new(bigdir_entries); + match current { + Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))), + Err(e) => { + println!("{}", e); + None + } + } + } + _ => None, } - _ => None, } } diff --git a/client-network/src/message_handling.rs b/client-network/src/message_handling.rs index 96a41db..74f0a6e 100644 --- a/client-network/src/message_handling.rs +++ b/client-network/src/message_handling.rs @@ -468,7 +468,6 @@ pub fn parse_message( } } EventType::DatumRequestBig => { - let _ = &guard.remove_entry(&id); println!("message {} retiré de la liste", id); let received_length = u16::from_be_bytes( received_message[TYPE..LENGTH] @@ -481,6 +480,7 @@ pub fn parse_message( parse_received_datum(received_datum.to_vec(), received_length as usize); match parsed_node { Some(tuple) => { + let _ = &guard.remove_entry(&id); let _ = cmd_tx.send(NetworkEvent::DataReceived( tuple.0, tuple.1, @@ -488,7 +488,9 @@ pub fn parse_message( )); println!("datareceived event sent"); } - None => {} + None => { + println!("message corrompu, nouvelle tentative"); + } } } _ => {} diff --git a/client-network/src/messages_channels.rs b/client-network/src/messages_channels.rs index 9dd6285..33f4649 100644 --- a/client-network/src/messages_channels.rs +++ b/client-network/src/messages_channels.rs @@ -234,7 +234,8 @@ pub fn start_retry_thread( ); let base: u64 = 2; - let backoff = base.saturating_pow(attempt as u32); // 2^1 == 2 seconds + // let backoff = base.saturating_pow(attempt as u32); // 2^1 == 2 seconds + let backoff = 1; let newretry = RetryMessage { next_try: SystemTime::now() .duration_since(UNIX_EPOCH) -- 2.39.5 From cc64aa1b888dbb49c617d59671a6922a372fa7c8 Mon Sep 17 00:00:00 2001 From: TIBERGHIEN corentin Date: Sun, 25 Jan 2026 01:32:28 +0100 Subject: [PATCH 2/3] wip big --- client-network/src/datum_parsing.rs | 15 ++++++++++++--- client-network/src/messages_channels.rs | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/client-network/src/datum_parsing.rs b/client-network/src/datum_parsing.rs index d3f03e1..c4d4e74 100644 --- a/client-network/src/datum_parsing.rs +++ b/client-network/src/datum_parsing.rs @@ -13,9 +13,18 @@ pub fn parse_received_datum( let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error"); let value = &recevied_datum[32..recevied_datum.len()]; let value_slice = value.to_vec(); - println!("valueslice: {:?}, {}", value_slice, value_slice.len()); - let digest = Sha256::digest(&value); - if digest.to_vec() != hash_name.to_vec() { + //println!("valueslice: {:?}, {}", value_slice, value_slice.len()); + + // Créer une instance de Sha256 + let mut hasher = Sha256::new(); + + // Alimenter le hasher avec les données + hasher.update(value); + + // Obtention du résultat + let result = hasher.finalize(); + if result.to_vec() != hash_name.to_vec() { + println!("{:?},{:?}", result.to_vec(), hash_name.to_vec()); None } else { let datum_type = value_slice[0]; diff --git a/client-network/src/messages_channels.rs b/client-network/src/messages_channels.rs index 33f4649..6edb220 100644 --- a/client-network/src/messages_channels.rs +++ b/client-network/src/messages_channels.rs @@ -279,7 +279,7 @@ pub fn start_receving_thread( Ok((amt, src)) => { let received_data = buf[..amt].to_vec(); - println!("Reçu {} octets de {}: {:?}", amt, src, received_data); + println!("Reçu {} octets de {}", amt, src); handle_recevied_message( &messages_clone, &messages_received_clone, -- 2.39.5 From fbbd8cd6406907f297893cc3bc900127d2ad9446 Mon Sep 17 00:00:00 2001 From: TIBERGHIEN corentin Date: Sun, 25 Jan 2026 03:19:08 +0100 Subject: [PATCH 3/3] big download fixed --- client-network/src/data.rs | 11 +++++++++-- client-network/src/datum_parsing.rs | 11 ++++++++--- client-network/src/lib.rs | 2 +- client-network/src/message_handling.rs | 18 +++++++++--------- client-network/src/messages_channels.rs | 4 ++-- client-network/src/registration.rs | 1 + 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/client-network/src/data.rs b/client-network/src/data.rs index 7daf4fb..4479ffa 100644 --- a/client-network/src/data.rs +++ b/client-network/src/data.rs @@ -473,8 +473,15 @@ pub fn big_or_chunk_to_file(tree: &MerkleTree, node: &MerkleNode, file: &mut Fil } } MerkleNode::Chunk(chunk) => { - println!("wrote data"); - let _ = file.write_all(&chunk.data); + if !chunk.data.is_empty() { + // Enlève le premier élément + let mut data = chunk.data.clone(); // Clone pour éviter de modifier l'original + data.remove(0); // Enlève le premier élément + println!("wrote data {:?}", data); + let _ = file.write(&data); + } else { + println!("chunk.data is empty, nothing to write"); + } } _ => { println!("invalid type of file"); diff --git a/client-network/src/datum_parsing.rs b/client-network/src/datum_parsing.rs index c4d4e74..3797527 100644 --- a/client-network/src/datum_parsing.rs +++ b/client-network/src/datum_parsing.rs @@ -11,15 +11,19 @@ pub fn parse_received_datum( datum_length: usize, ) -> Option<([u8; 32], MerkleNode)> { let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error"); - let value = &recevied_datum[32..recevied_datum.len()]; + let value = &recevied_datum[32..datum_length]; let value_slice = value.to_vec(); - //println!("valueslice: {:?}, {}", value_slice, value_slice.len()); + println!("valueslice: {:?}, {}", value_slice, value_slice.len()); + println!( + "((value_slice.len() - 1) / 32) {} ", + ((value_slice.len() - 1) / 32) + ); // Créer une instance de Sha256 let mut hasher = Sha256::new(); // Alimenter le hasher avec les données - hasher.update(value); + hasher.update(value_slice.clone()); // Obtention du résultat let result = hasher.finalize(); @@ -27,6 +31,7 @@ pub fn parse_received_datum( println!("{:?},{:?}", result.to_vec(), hash_name.to_vec()); None } else { + println!("hashes equals!"); let datum_type = value_slice[0]; match datum_type { CHUNK => Some(( diff --git a/client-network/src/lib.rs b/client-network/src/lib.rs index d4d80b2..215fd4c 100644 --- a/client-network/src/lib.rs +++ b/client-network/src/lib.rs @@ -73,7 +73,7 @@ impl P2PSharedData { let mut threads = Vec::new(); - let senders = MultipleSenders::new(1, &shared_socket, cmd_tx, &mut threads); + let senders = MultipleSenders::new(5, &shared_socket, cmd_tx, &mut threads); let shared_senders = Arc::new(senders); let server_name = Arc::new(Mutex::new("".to_string())); let server_address = Arc::new(Mutex::new("".to_string())); diff --git a/client-network/src/message_handling.rs b/client-network/src/message_handling.rs index 74f0a6e..2ba2fb3 100644 --- a/client-network/src/message_handling.rs +++ b/client-network/src/message_handling.rs @@ -370,14 +370,11 @@ pub fn parse_message( // envoyer la root request let _ = &guard.remove_entry(&id); println!("message {} retiré de la liste", id); - - let rootrequest = construct_message( - ROOTREQUEST, - Vec::new(), - generate_id(), - crypto_pair, - ); - //&guard.insert(, v) + let new_id = generate_id(); + let rootrequest = + construct_message(ROOTREQUEST, Vec::new(), new_id, crypto_pair); + let _ = &guard.insert(new_id, EventType::RootRequest); + println!("root requesst sent"); return rootrequest; } EventType::Hello => { @@ -392,6 +389,7 @@ pub fn parse_message( } ROOTREPLY => { // recuperer le pseudo du peers ayant repondu + println!("root reply received"); let peers_exist = handhsake_history.get_peer_info_ip(ip.to_string()); match peers_exist { Some(peerinfo) => { @@ -429,7 +427,9 @@ pub fn parse_message( constructed_message = datumreqest; guard.insert(new_id, EventType::DatumRequest); } - _ => {} + _ => { + println!("event not prensent"); + } } } None => {} diff --git a/client-network/src/messages_channels.rs b/client-network/src/messages_channels.rs index 6edb220..d7da7b6 100644 --- a/client-network/src/messages_channels.rs +++ b/client-network/src/messages_channels.rs @@ -273,13 +273,13 @@ pub fn start_receving_thread( let messages_received_clone = shared_data.messages_received(); let servername_clone = shared_data.servername(); let thread = thread::spawn(move || { - let mut buf = [0u8; 1024]; + let mut buf = [0u8; 1500]; loop { match sock_clone.recv_from(&mut buf) { Ok((amt, src)) => { let received_data = buf[..amt].to_vec(); - println!("Reçu {} octets de {}", amt, src); + println!("Reçu {} octets de {}: {:?}", amt, src, received_data); handle_recevied_message( &messages_clone, &messages_received_clone, diff --git a/client-network/src/registration.rs b/client-network/src/registration.rs index 7df1e06..5f24264 100644 --- a/client-network/src/registration.rs +++ b/client-network/src/registration.rs @@ -75,6 +75,7 @@ pub async fn perform_handshake( sd.add_message(id, EventType::Hello); sd.set_serveraddress(sockaddr_bytes.to_string()); } else { + println!("hello the nroot"); sd.add_message(id, EventType::HelloThenRootRequest); } -- 2.39.5