diff --git a/src/io/mod.rs b/src/io/mod.rs index 5bc18fc..7cd3c75 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -4,4 +4,9 @@ mod windows; mod servers_context; pub type Address = windows::WindowsAddressKnown; -use allocator::Allocator; \ No newline at end of file +use allocator::Allocator; +use crate::io::windows::winsocks_scope; + +pub(crate) fn network_scope(scope: impl FnOnce() -> R) -> R { + return winsocks_scope(scope); +} \ No newline at end of file diff --git a/src/io/windows/mod.rs b/src/io/windows/mod.rs index 14cb5cd..2ccf570 100644 --- a/src/io/windows/mod.rs +++ b/src/io/windows/mod.rs @@ -2,5 +2,7 @@ mod address; mod errors; mod eventloop; mod task; +mod winsocks_scope; -pub use address::{WindowsAddressAny, WindowsAddressKnown}; \ No newline at end of file +pub use address::{WindowsAddressAny, WindowsAddressKnown}; +pub(super) use winsocks_scope::winsocks_scope; \ No newline at end of file diff --git a/src/io/windows/winsocks_scope.rs b/src/io/windows/winsocks_scope.rs new file mode 100644 index 0000000..f2d2017 --- /dev/null +++ b/src/io/windows/winsocks_scope.rs @@ -0,0 +1,21 @@ +use super::errors::throw_from_windows_err_code; +use std::mem::uninitialized; +use windows::Win32::Networking::WinSock::{WSACleanup, WSAStartup}; + +pub(in super::super) fn winsocks_scope(scope: impl FnOnce() -> R) -> R { + unsafe { + match WSAStartup(0x0202, &mut uninitialized()) { + 0 => {} + errcode => throw_from_windows_err_code(errcode), + } + + let result = scope(); + + match WSACleanup() { + 0 => {} + errcode => throw_from_windows_err_code(errcode), + } + + return result; + } +} diff --git a/src/main.rs b/src/main.rs index a7907da..7472c61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,10 @@ +use crate::io::network_scope; + mod data; mod io; fn main() { - println!("Hello, world!"); + network_scope(|| { + println!("Hello, world!"); + }); }