From 87814a5e33375a4118b75fce01f8a7c53ba39a37 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 21 Oct 2025 09:04:45 +0800 Subject: fix: p2p connection --- src/main.rs | 8 +++-- src/network.rs | 102 +++++++++++++++++++++++++++++++++------------------------ 2 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/main.rs b/src/main.rs index 096b533..0c25725 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::{sync::Arc, thread::sleep, time::Duration}; +use std::{sync::Arc, time::Duration}; use bitcoin::{blocks::BlockChain, network::Network}; use tokio::sync::Mutex; @@ -7,10 +7,14 @@ use tokio::sync::Mutex; async fn main() { let bc = Arc::new(Mutex::new(BlockChain::default())); let network = Network::new(bc).await; + network + .lock() + .await + .start(); network .lock() .await .broadcast(bitcoin::network::Request::Ibd(None)) .await; - sleep(Duration::from_secs(100)); + tokio::time::sleep(Duration::from_secs(100)).await; } diff --git a/src/network.rs b/src/network.rs index 82190a5..b198221 100644 --- a/src/network.rs +++ b/src/network.rs @@ -1,7 +1,4 @@ -use std::{ - net::SocketAddr, - sync::{Arc, Weak}, -}; +use std::sync::{Arc, Weak}; use serde::{Deserialize, Serialize}; @@ -29,19 +26,20 @@ pub enum Request { pub struct Network { this: Weak>, me: Client, - listener: TcpListener, + listener: Arc, peers: Vec>>, blockchain: Arc>, } impl Network { pub async fn new(blockchain: Arc>) -> Arc> { + let listener = TcpListener::bind("0.0.0.0:6767") + .await + .unwrap(); let this = Arc::new(Mutex::new(Self { me: Client::default(), this: Weak::new(), - listener: TcpListener::bind("0.0.0.0:6767") - .await - .unwrap(), + listener: Arc::new(listener), peers: Vec::default(), blockchain, })); @@ -52,17 +50,59 @@ impl Network { } async fn try_peer(&mut self) { + let peer = Arc::new(Mutex::new(Peer::new( + self.this + .clone(), + TcpStream::connect("192.168.143.90:6767") + .await + .unwrap(), + ))); self.peers - .push(Arc::new(Mutex::new(Peer::new( - self.this - .clone(), - TcpStream::connect("192.168.1.100") - .await - .unwrap(), - )))) + .push(peer.clone()); + + spawn(async move { + peer.lock() + .await + .start() + .await; + }); } - async fn start(&self) { + pub fn start(&self) { + let this = self + .this + .clone(); + let listener = self + .listener + .clone(); + spawn(async move { + loop { + let (stream, _addr) = listener + .accept() + .await + .unwrap(); + + let peer = Arc::new(Mutex::new(Peer::new(this.clone(), stream))); + + if let Some(parent) = this.upgrade() { + let mut net = parent + .lock() + .await; + net.peers + .push(Arc::clone(&peer)); + } + + spawn({ + let peer = Arc::clone(&peer); + async move { + peer.lock() + .await + .start() + .await; + } + }); + } + }); let this = self .this .clone(); @@ -71,38 +111,12 @@ impl Network { let mut net = parent .lock() .await; - net.listen() + net.try_peer() .await; } }); } - async fn listen(&mut self) -> ! { - loop { - let (stream, addr) = self - .listener - .accept() - .await - .unwrap(); - - let peer = Arc::new(Mutex::new(Peer::new( - self.this - .clone(), - stream, - ))); - - self.peers - .push(Arc::clone(&peer)); - - spawn(async move { - peer.lock() - .await - .start() - .await; - }); - } - } - pub async fn broadcast(&mut self, data: Request) { for p in &self.peers { p.lock() @@ -122,6 +136,7 @@ struct Peer { impl Peer { fn new(parent: Weak>, stream: TcpStream) -> Self { + eprintln!("a"); Self { parent, framed: Framed::new(TokioFramed::new(stream, LengthDelimitedCodec::new()), Json::default()), @@ -135,6 +150,7 @@ impl Peer { .next() .await { + eprintln!("a"); self.handle(req.unwrap()) .await; } -- cgit v1.2.3