From ff284832dcad371a646d6c3f886951891b6f205a Mon Sep 17 00:00:00 2001 From: Unchainablemobb Date: Wed, 7 Jan 2026 00:08:09 +0900 Subject: [PATCH 1/8] add block structures and trasaction file --- src/block/block.rs | 11 +++++++++++ src/block/mod.rs | 6 ++++++ src/{block.rs => block/transaction.rs} | 0 3 files changed, 17 insertions(+) create mode 100644 src/block/block.rs create mode 100644 src/block/mod.rs rename src/{block.rs => block/transaction.rs} (100%) diff --git a/src/block/block.rs b/src/block/block.rs new file mode 100644 index 0000000..6ac3293 --- /dev/null +++ b/src/block/block.rs @@ -0,0 +1,11 @@ +use crate::block::transaction::Transaction; + +pub struct Block_Header{ + prev_hash: [u8; 32], + nonce: u64, + merkle_root: [u8; 32] +} +pub struct Block{ + block_header: Block_Header, + txs: Vec +} \ No newline at end of file diff --git a/src/block/mod.rs b/src/block/mod.rs new file mode 100644 index 0000000..b87e751 --- /dev/null +++ b/src/block/mod.rs @@ -0,0 +1,6 @@ +pub mod block; +pub mod transaction{ + pub struct Transaction{ + + } +} \ No newline at end of file diff --git a/src/block.rs b/src/block/transaction.rs similarity index 100% rename from src/block.rs rename to src/block/transaction.rs From 8cd89864b8df57dfe71c8e818fccd29403d1215b Mon Sep 17 00:00:00 2001 From: tmvkrpxl0 Date: Wed, 7 Jan 2026 00:30:59 +0900 Subject: [PATCH 2/8] Cleanup --- src/block/block.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/block.rs b/src/block/block.rs index 6ac3293..f282e9f 100644 --- a/src/block/block.rs +++ b/src/block/block.rs @@ -1,11 +1,11 @@ use crate::block::transaction::Transaction; -pub struct Block_Header{ +pub struct BlockHeader { prev_hash: [u8; 32], nonce: u64, merkle_root: [u8; 32] } pub struct Block{ - block_header: Block_Header, + block_header: BlockHeader, txs: Vec } \ No newline at end of file From e5e077f1e14eedc489d84074b64c4457701b5fe1 Mon Sep 17 00:00:00 2001 From: pnyani Date: Wed, 7 Jan 2026 01:29:14 +0900 Subject: [PATCH 3/8] feat: Add UdpBroadcast struct and socket2 dependency for networking --- Cargo.lock | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/network.rs | 60 ++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 7e8a115..9167868 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -252,6 +252,7 @@ version = "0.1.0" dependencies = [ "rsa", "sha256", + "socket2", ] [[package]] @@ -360,6 +361,16 @@ dependencies = [ "rand_core", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spki" version = "0.8.0-rc.4" @@ -409,6 +420,79 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "zeroize" version = "1.8.2" diff --git a/Cargo.toml b/Cargo.toml index cb00155..b5be23f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ edition = "2024" [dependencies] rsa = "0.10.0-rc.11" -sha256 = "1.6.0" \ No newline at end of file +sha256 = "1.6.0" +socket2 = "0.5" \ No newline at end of file diff --git a/src/network.rs b/src/network.rs index e69de29..5fdb27e 100644 --- a/src/network.rs +++ b/src/network.rs @@ -0,0 +1,60 @@ +use socket2::{Domain, Protocol, Socket, Type}; +use std::io::Result; +use std::net::{SocketAddr, UdpSocket}; + +pub struct UdpBroadcast { + socket: UdpSocket, + target: SocketAddr, + local: SocketAddr, +} + +impl UdpBroadcast { + pub fn new(port: u16) -> Result { + let socket = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; + socket.set_reuse_address(true)?; + socket.set_broadcast(true)?; + + let addr: SocketAddr = ([0, 0, 0, 0], port).into(); // 0.0.0.0 != 192.168.x.x.. 미래의 나, 해결해라! + socket.bind(&addr.into())?; + + let socket: UdpSocket = socket.into(); + let local = socket.local_addr()?; + + Ok(Self { + socket, + target: ([255, 255, 255, 255], port).into(), // 브로드캐스트 주소 바꿀 것 + local, + }) + } + + pub fn send(&self, data: &[u8]) -> Result { + self.socket.send_to(data, self.target) + } + + pub fn recv(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)> { + self.socket.recv_from(buf) + } + + pub fn local_addr(&self) -> SocketAddr { + self.local + } + + pub fn is_self(&self, addr: SocketAddr) -> bool { + addr == self.local + } +} + +#[cfg(test)] +mod tests { + use std::sync::mpsc; + #[test] + fn test_broadcast() { + let (sender, listener) = mpsc::channel(); + let data: [u8; 4] = [0x43, 0x55, 0x54, 0x45]; + sender.send(data).unwrap(); + let received = listener.recv().unwrap(); + assert_eq!(received, data); + + } + +} \ No newline at end of file From 33c7aa911cb19a3958a6110048500b8c1b2bbc4f Mon Sep 17 00:00:00 2001 From: Unchainablemobb Date: Wed, 7 Jan 2026 11:43:17 +0900 Subject: [PATCH 4/8] change security hashing library --- Cargo.lock | 54 +----------------------------------------------------- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e8a115..5c3a3e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,17 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -40,12 +29,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bytes" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" - [[package]] name = "cfg-if" version = "1.0.4" @@ -166,12 +149,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hybrid-array" version = "0.4.5" @@ -211,12 +188,6 @@ dependencies = [ "base64ct", ] -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - [[package]] name = "pkcs1" version = "0.8.0-rc.4" @@ -251,7 +222,7 @@ name = "pyroxene" version = "0.1.0" dependencies = [ "rsa", - "sha256", + "sha2", ] [[package]] @@ -337,19 +308,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha256" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" -dependencies = [ - "async-trait", - "bytes", - "hex", - "sha2", - "tokio", -] - [[package]] name = "signature" version = "3.0.0-rc.6" @@ -381,16 +339,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tokio" -version = "1.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "pin-project-lite", -] - [[package]] name = "typenum" version = "1.19.0" diff --git a/Cargo.toml b/Cargo.toml index cb00155..35e113e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ edition = "2024" [dependencies] rsa = "0.10.0-rc.11" -sha256 = "1.6.0" \ No newline at end of file +sha2 = "0.10.9" \ No newline at end of file From 1bc3b15f8f87ad58a4ef0246c1e0198011e2f6fa Mon Sep 17 00:00:00 2001 From: tmvkrpxl0 Date: Wed, 7 Jan 2026 21:42:32 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network.rs | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/network.rs b/src/network.rs index 5fdb27e..09c0e3e 100644 --- a/src/network.rs +++ b/src/network.rs @@ -5,25 +5,21 @@ use std::net::{SocketAddr, UdpSocket}; pub struct UdpBroadcast { socket: UdpSocket, target: SocketAddr, - local: SocketAddr, } impl UdpBroadcast { pub fn new(port: u16) -> Result { let socket = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; - socket.set_reuse_address(true)?; socket.set_broadcast(true)?; let addr: SocketAddr = ([0, 0, 0, 0], port).into(); // 0.0.0.0 != 192.168.x.x.. 미래의 나, 해결해라! socket.bind(&addr.into())?; let socket: UdpSocket = socket.into(); - let local = socket.local_addr()?; Ok(Self { socket, target: ([255, 255, 255, 255], port).into(), // 브로드캐스트 주소 바꿀 것 - local, }) } @@ -35,25 +31,39 @@ impl UdpBroadcast { self.socket.recv_from(buf) } - pub fn local_addr(&self) -> SocketAddr { - self.local - } - pub fn is_self(&self, addr: SocketAddr) -> bool { - addr == self.local + addr == self.target } } #[cfg(test)] mod tests { - use std::sync::mpsc; + use std::thread; + use std::time::Duration; + use crate::network::UdpBroadcast; + #[test] fn test_broadcast() { - let (sender, listener) = mpsc::channel(); + let node1 = UdpBroadcast::new(8823).unwrap(); + let node2 = UdpBroadcast::new(9265).unwrap(); let data: [u8; 4] = [0x43, 0x55, 0x54, 0x45]; - sender.send(data).unwrap(); - let received = listener.recv().unwrap(); - assert_eq!(received, data); + let mut receive_buffer = [0u8; 4]; + + let receiver = thread::scope(|scope| { + let result = scope.spawn(|| { + thread::sleep(Duration::from_secs(1)); + node2.recv(&mut receive_buffer).unwrap() + }); + scope.spawn(|| { + node1.send(&data).unwrap(); + }); + result.join().unwrap() + }); + let (receive_count, sender_address) = receiver; + + assert_eq!(receive_count, data.len()); + assert_eq!(node1.target, sender_address); + assert_eq!(receive_buffer, data); } From 645e0aad334fc0416f4effdcfd74546743eab3ac Mon Sep 17 00:00:00 2001 From: tmvkrpxl0 Date: Wed, 7 Jan 2026 22:03:00 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/network.rs b/src/network.rs index 09c0e3e..b9be674 100644 --- a/src/network.rs +++ b/src/network.rs @@ -1,6 +1,8 @@ use socket2::{Domain, Protocol, Socket, Type}; use std::io::Result; -use std::net::{SocketAddr, UdpSocket}; +use std::net::{SocketAddr, SocketAddrV4, UdpSocket}; + +pub const PORT: u16 = 1200; pub struct UdpBroadcast { socket: UdpSocket, @@ -8,18 +10,23 @@ pub struct UdpBroadcast { } impl UdpBroadcast { - pub fn new(port: u16) -> Result { + pub fn new() -> Result { + Self::with_port(PORT, PORT) + } + + pub fn with_port(send: u16, receive: u16) -> Result { let socket = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; socket.set_broadcast(true)?; + socket.set_reuse_address(true)?; - let addr: SocketAddr = ([0, 0, 0, 0], port).into(); // 0.0.0.0 != 192.168.x.x.. 미래의 나, 해결해라! + let addr: SocketAddr = ([0, 0, 0, 0], receive).into(); // 0.0.0.0 != 192.168.x.x.. 미래의 나, 해결해라! socket.bind(&addr.into())?; let socket: UdpSocket = socket.into(); Ok(Self { socket, - target: ([255, 255, 255, 255], port).into(), // 브로드캐스트 주소 바꿀 것 + target: ([255, 255, 255, 255], send).into(), // 브로드캐스트 주소 바꿀 것 }) } @@ -44,8 +51,8 @@ mod tests { #[test] fn test_broadcast() { - let node1 = UdpBroadcast::new(8823).unwrap(); - let node2 = UdpBroadcast::new(9265).unwrap(); + let node1 = UdpBroadcast::new().unwrap(); + let node2 = UdpBroadcast::new().unwrap(); let data: [u8; 4] = [0x43, 0x55, 0x54, 0x45]; let mut receive_buffer = [0u8; 4]; @@ -62,7 +69,6 @@ mod tests { let (receive_count, sender_address) = receiver; assert_eq!(receive_count, data.len()); - assert_eq!(node1.target, sender_address); assert_eq!(receive_buffer, data); } From b91ff700d1a17c26cd3d8cbf8385ba04c07b5e18 Mon Sep 17 00:00:00 2001 From: pnyani Date: Wed, 7 Jan 2026 22:39:03 +0900 Subject: [PATCH 7/8] chore: Update dependencies in Cargo.toml --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index b5be23f..07d4f4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,5 @@ edition = "2024" [dependencies] rsa = "0.10.0-rc.11" sha256 = "1.6.0" -socket2 = "0.5" \ No newline at end of file +socket2 = "0.5" +rkyv = "0.8.13" \ No newline at end of file From 4676123b53341b5428e3920720d040fd52ed2557 Mon Sep 17 00:00:00 2001 From: pnyani Date: Wed, 7 Jan 2026 22:45:16 +0900 Subject: [PATCH 8/8] feat: Implement UdpBroadcast and Packet for networking functionality --- Cargo.lock | 238 +++++++++++++++++++++++++++++ src/{network.rs => network/mod.rs} | 2 + src/network/protocol.rs | 87 +++++++++++ 3 files changed, 327 insertions(+) rename src/{network.rs => network/mod.rs} (99%) create mode 100644 src/network/protocol.rs diff --git a/Cargo.lock b/Cargo.lock index 9167868..8063ceb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,6 +40,35 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytecheck" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "bytes" version = "1.11.0" @@ -156,6 +185,12 @@ dependencies = [ "crypto-common 0.2.0-rc.9", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "generic-array" version = "0.14.7" @@ -166,6 +201,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hex" version = "0.4.3" @@ -181,6 +222,26 @@ dependencies = [ "typenum", ] +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.179" @@ -193,6 +254,26 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -202,6 +283,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "pem-rfc7468" version = "1.0.0" @@ -246,10 +333,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pyroxene" version = "0.1.0" dependencies = [ + "rkyv", "rsa", "sha256", "socket2", @@ -264,12 +372,60 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rancor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +dependencies = [ + "ptr_meta", +] + [[package]] name = "rand_core" version = "0.10.0-rc-3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f66ee92bc15280519ef199a274fe0cafff4245d31bc39aaa31c011ad56cb1f05" +[[package]] +name = "rend" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2e88acca7157d83d789836a3987dafc12bc3d88a050e54b8fe9ea4aaa29d20" +dependencies = [ + "bytecheck", + "bytes", + "hashbrown", + "indexmap", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6dffea3c91fa91a3c0fc8a061b0e27fef25c6304728038a6d6bcb1c58ba9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rsa" version = "0.10.0-rc.11" @@ -288,6 +444,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -361,6 +523,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "socket2" version = "0.5.10" @@ -392,6 +560,21 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.49.0" @@ -414,12 +597,67 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/src/network.rs b/src/network/mod.rs similarity index 99% rename from src/network.rs rename to src/network/mod.rs index b9be674..a8f5fec 100644 --- a/src/network.rs +++ b/src/network/mod.rs @@ -2,6 +2,8 @@ use socket2::{Domain, Protocol, Socket, Type}; use std::io::Result; use std::net::{SocketAddr, SocketAddrV4, UdpSocket}; +mod protocol; + pub const PORT: u16 = 1200; pub struct UdpBroadcast { diff --git a/src/network/protocol.rs b/src/network/protocol.rs new file mode 100644 index 0000000..d092c38 --- /dev/null +++ b/src/network/protocol.rs @@ -0,0 +1,87 @@ + +use rkyv::{Archive, Deserialize, Serialize}; +use std::net::Ipv4Addr; + +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq, Clone)] +#[rkyv( + compare(PartialEq), + derive(Debug), +)] +pub struct Packet { + pub sender_ip: [u8; 4], +} + +impl Packet { + pub fn new(sender: Ipv4Addr) -> Self { + Self { + sender_ip: sender.octets(), + } + } + + pub fn sender(&self) -> Ipv4Addr { + Ipv4Addr::from(self.sender_ip) + } +} + +impl ArchivedPacket { + pub fn sender(&self) -> Ipv4Addr { + Ipv4Addr::new( + self.sender_ip[0], + self.sender_ip[1], + self.sender_ip[2], + self.sender_ip[3], + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::network::UdpBroadcast; + use std::net::Ipv4Addr; + use std::thread; + use std::time::Duration; + + #[test] + fn test_packet_broadcast() { + let node1 = UdpBroadcast::with_port(1201, 1201).unwrap(); + let node2 = UdpBroadcast::with_port(1201, 1201).unwrap(); + + // 보낼 패킷 + let packet = Packet::new(Ipv4Addr::new(192, 168, 0, 100)); + + let serialized = rkyv::to_bytes::(&packet).unwrap(); + + let mut receive_buffer = [0u8; 1024]; // 1KB 버퍼 재사용 + + let receiver = thread::scope(|scope| { + let result = scope.spawn(|| { + thread::sleep(Duration::from_millis(100)); + let (size, addr) = node2.recv(&mut receive_buffer).unwrap(); + (size, addr) + }); + + scope.spawn(|| { + thread::sleep(Duration::from_millis(50)); + node1.send(&serialized).unwrap(); + }); + + result.join().unwrap() + }); + + let (received_size, _sender_addr) = receiver; + + + let valid_data = &receive_buffer[..received_size]; + + + let archived = rkyv::access::(valid_data).unwrap(); + + assert_eq!(archived.sender(), packet.sender()); + assert_eq!(archived.sender(), Ipv4Addr::new(192, 168, 0, 100)); + + // 역직렬화 + let deserialized: Packet = rkyv::deserialize::(archived).unwrap(); + assert_eq!(deserialized, packet); + } +} \ No newline at end of file