1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
use std::{env, net::SocketAddr};
use async_tungstenite::{gio::accept_async, tungstenite::Result};
use futures::prelude::*;
use gio::{
prelude::*, InetSocketAddress, SocketConnection, SocketListener, SocketProtocol, SocketType,
};
async fn accept_connection(stream: SocketConnection) -> Result<()> {
let addr = stream
.socket()
.remote_address()
.expect("SocketConnection should have a remote address");
println!("Peer address: {}", addr.to_string());
let mut ws_stream = accept_async(stream)
.await
.expect("Error during the websocket handshake occurred");
while let Some(msg) = ws_stream.next().await {
let msg = msg?;
if msg.is_text() || msg.is_binary() {
ws_stream.send(msg).await?;
}
}
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let _ = env_logger::try_init();
let addr = env::args()
.nth(1)
.unwrap_or_else(|| "127.0.0.1:8080".to_string());
let sockaddr: SocketAddr = addr.parse()?;
let inetaddr: InetSocketAddress = sockaddr.into();
let listener = SocketListener::new();
listener.add_address(
&inetaddr,
SocketType::Stream,
SocketProtocol::Tcp,
glib::Object::NONE,
)?;
println!("Listening on: {}", inetaddr.to_string());
let main_loop = glib::MainLoop::new(None, false);
main_loop.context().block_on(async move {
while let Ok((stream, _)) = listener.accept_future().await {
glib::MainContext::default().spawn_local(async move {
accept_connection(stream).await.unwrap();
});
}
});
Ok(())
}
|