use std::{collections::VecDeque, net::SocketAddr};
use anyhow::anyhow;
use rusty_cotp::{CotpConnection, CotpConnectionParameters, CotpProtocolInformation, CotpReader, CotpResponder, CotpWriter, RustyCotpResponder, RustyCotpConnection};
use rusty_tpkt::{TcpTpktConnection, TcpTpktReader, TcpTpktServer, TcpTpktWriter};
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let test_address = "127.0.0.1:12345".parse()?;
let server_connect_task = tokio::task::spawn(example_server(test_address));
let client_connect_task = tokio::task::spawn(example_client(test_address));
client_connect_task.await??;
server_connect_task.await??;
Ok(())
}
async fn example_server(address: SocketAddr) -> Result<(), anyhow::Error> {
let server = TcpTpktServer::listen(address.clone()).await?;
let tpkt_connection = server.accept().await?;
let (cotp_acceptor, incoming_propertites) = RustyCotpResponder::<TcpTpktReader, TcpTpktWriter>::new(tpkt_connection, Default::default()).await?;
let cotp_connection = cotp_acceptor.accept(incoming_propertites.responder()).await?;
let (mut reader, mut writer) = cotp_connection.split().await?;
let data = reader.recv().await?.ok_or_else(|| anyhow!("Connection Closed"))?;
assert_eq!(data, "Hello from the client!".as_bytes().to_vec());
let mut data = VecDeque::new();
data.push_back("Hello from the server!".as_bytes().to_vec());
while data.len() > 0 {
writer.send(&mut data).await?;
}
Ok(())
}
async fn example_client(address: SocketAddr) -> Result<(), anyhow::Error> {
let tpkt_connection = TcpTpktConnection::connect(address).await?;
let cotp_connection = RustyCotpConnection::<TcpTpktReader, TcpTpktWriter>::initiate(tpkt_connection, CotpProtocolInformation::initiator(Some(vec![1]), Some(vec![2])), CotpConnectionParameters { ..Default::default() }).await?;
let (mut reader, mut writer) = cotp_connection.split().await?;
let mut data = VecDeque::new();
data.push_back("Hello from the client!".as_bytes().to_vec());
while data.len() > 0 {
writer.send(&mut data).await?;
}
let data = reader.recv().await?.ok_or_else(|| anyhow!("Connection Closed"))?;
assert_eq!(data, "Hello from the server!".as_bytes().to_vec());
Ok(())
}