mirror of
https://github.com/Noratrieb/survey.git
synced 2026-01-14 16:35:09 +01:00
things
This commit is contained in:
parent
69f9a54164
commit
398a2dc2d6
2 changed files with 34 additions and 16 deletions
13
src/main.rs
13
src/main.rs
|
|
@ -1,6 +1,7 @@
|
||||||
use std::{
|
use std::{
|
||||||
io,
|
io,
|
||||||
io::{Read, Write},
|
io::{Read, Write},
|
||||||
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
use survey::sync_tcp::{SyncTcpListener, SyncTcpStream};
|
use survey::sync_tcp::{SyncTcpListener, SyncTcpStream};
|
||||||
|
|
@ -20,11 +21,12 @@ pub fn main() {
|
||||||
pub fn listener() -> io::Result<()> {
|
pub fn listener() -> io::Result<()> {
|
||||||
let mut threads = Vec::new();
|
let mut threads = Vec::new();
|
||||||
|
|
||||||
let mut listener = SyncTcpListener::bind_any(PORT)?;
|
let listener = SyncTcpListener::bind_any(PORT)?;
|
||||||
|
|
||||||
println!("Bound listener on port {PORT}");
|
println!("Bound listener on port {PORT}");
|
||||||
|
|
||||||
for stream in listener.accept() {
|
for stream in listener.incoming() {
|
||||||
|
let stream = stream?;
|
||||||
let handle = std::thread::spawn(move || handler_thread(stream));
|
let handle = std::thread::spawn(move || handler_thread(stream));
|
||||||
threads.push(handle);
|
threads.push(handle);
|
||||||
}
|
}
|
||||||
|
|
@ -53,11 +55,6 @@ fn handler(mut stream: SyncTcpStream) -> io::Result<()> {
|
||||||
stream.write_all(b"\nAh, it's: '")?;
|
stream.write_all(b"\nAh, it's: '")?;
|
||||||
stream.write_all(&buf)?;
|
stream.write_all(&buf)?;
|
||||||
stream.write_all(b"'. I like them too owo")?;
|
stream.write_all(b"'. I like them too owo")?;
|
||||||
println!("written stuff");
|
std::thread::sleep(Duration::from_millis(100));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn format_addr(addr: libc::in_addr) -> String {
|
|
||||||
let bytes = addr.s_addr.to_be_bytes();
|
|
||||||
format!("{}.{}.{}.{}", bytes[0], bytes[1], bytes[2], bytes[3])
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -49,14 +49,15 @@ impl SyncTcpListener {
|
||||||
Ok(Self { fd: socket, addr })
|
Ok(Self { fd: socket, addr })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn accept(&mut self) -> impl Iterator<Item = SyncTcpStream> + '_ {
|
pub fn incoming(self) -> impl Iterator<Item = io::Result<SyncTcpStream>> {
|
||||||
std::iter::from_fn(|| {
|
std::iter::from_fn(move || {
|
||||||
|
let _ = &self; // capture self
|
||||||
let mut peer_sockaddr = MaybeUninit::uninit();
|
let mut peer_sockaddr = MaybeUninit::uninit();
|
||||||
let mut sockaddr_size = 0;
|
let mut sockaddr_size = 0;
|
||||||
let fd =
|
let fd =
|
||||||
unsafe { libc::accept(self.fd, peer_sockaddr.as_mut_ptr(), &mut sockaddr_size) };
|
unsafe { libc::accept(self.fd, peer_sockaddr.as_mut_ptr(), &mut sockaddr_size) };
|
||||||
if fd == -1 {
|
if fd == -1 {
|
||||||
return None;
|
return Some(Err(io::Error::last_os_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let peer_sockaddr = unsafe {
|
let peer_sockaddr = unsafe {
|
||||||
|
|
@ -66,7 +67,7 @@ impl SyncTcpListener {
|
||||||
.read()
|
.read()
|
||||||
};
|
};
|
||||||
|
|
||||||
Some(SyncTcpStream { fd, peer_sockaddr })
|
Some(Ok(SyncTcpStream { fd, peer_sockaddr }))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -77,6 +78,15 @@ impl Drop for SyncTcpListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Debug for SyncTcpListener {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.debug_struct("SyncTcpListener")
|
||||||
|
.field("fd", &self.fd)
|
||||||
|
.field("peer_addr", &format_addr(self.addr))
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct SyncTcpStream {
|
pub struct SyncTcpStream {
|
||||||
fd: unix::io::RawFd,
|
fd: unix::io::RawFd,
|
||||||
peer_sockaddr: libc::sockaddr_in,
|
peer_sockaddr: libc::sockaddr_in,
|
||||||
|
|
@ -94,7 +104,7 @@ impl Read for SyncTcpStream {
|
||||||
|
|
||||||
impl Write for SyncTcpStream {
|
impl Write for SyncTcpStream {
|
||||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||||
let size = unsafe { libc::write(self.fd, buf.as_ptr().cast(), buf.len()) };
|
let size = unsafe { libc::send(self.fd, buf.as_ptr().cast(), buf.len(), 0) };
|
||||||
if size == -1 {
|
if size == -1 {
|
||||||
return Err(io::Error::last_os_error());
|
return Err(io::Error::last_os_error());
|
||||||
}
|
}
|
||||||
|
|
@ -102,13 +112,16 @@ impl Write for SyncTcpStream {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flush(&mut self) -> io::Result<()> {
|
fn flush(&mut self) -> io::Result<()> {
|
||||||
todo!()
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for SyncTcpStream {
|
impl Drop for SyncTcpStream {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe { libc::close(self.fd) };
|
unsafe {
|
||||||
|
libc::shutdown(self.fd, libc::SHUT_RDWR);
|
||||||
|
libc::close(self.fd);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,7 +129,15 @@ impl Debug for SyncTcpStream {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
f.debug_struct("SyncTcpStream")
|
f.debug_struct("SyncTcpStream")
|
||||||
.field("fd", &self.fd)
|
.field("fd", &self.fd)
|
||||||
.field("peer_addr", &format_addr(self.peer_sockaddr.sin_addr))
|
.field("peer_addr", &format_addr(self.peer_sockaddr))
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn format_addr(addr: libc::sockaddr_in) -> String {
|
||||||
|
let bytes = addr.sin_addr.s_addr.to_be_bytes();
|
||||||
|
format!(
|
||||||
|
"{}.{}.{}.{}:{}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3], addr.sin_port
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue