use std::ops::Add;
use std::sync::Arc;
use tokio::io::AsyncReadExt;
use tokio::sync::RwLock;
use tokio::net::{TcpListener, TcpStream};
use crate::helper::filter::extract_protocol_info;
pub async fn client_run(config:Config) {
let addr = "127.0.0.1".to_string();
let local_add = addr.add(":").add(&*config.local_port);
let listener = TcpListener::bind(&local_add).await.unwrap();
log::info!("client start at {} listening package coming from application",&local_add);
loop {
match listener.accept().await {
Ok((socket, socket_add)) => {
let socket = Arc::new(RwLock::new(socket));
let task = tokio::spawn(async move {
log::info!("new application connected at : {}", socket_add);
select_protocal(Arc::clone(&socket)).await;
});
task.await.expect("TODO: panic message");
}
Err(err) => {
log::error!("Error accepting connection: {:?}", err);
}
}
}
}
async fn select_protocal (stream: Arc<RwLock<TcpStream>>) {
println!("{:?}",stream);
let mut buffer :Vec<u8>= Vec::new();
let mut read_lock = stream.read().await;
let read = read_lock.read_to_end(&mut buffer);
println!("{:?}",read);
println!("{:?}",buffer);
}
this line caused error
let read = read_lock.read_to_end(&mut buffer);
got this error
error[E0596]: cannot borrow data in dereference of `tokio::sync::RwLockReadGuard<'_, tokio::net::TcpStream>` as mutable
--> src\runner\client_run.rs:57:16
|
57 | let read = read_lock.read_to_end(&mut buffer);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `tokio::sync::RwLockReadGuard<'_, tokio::net::TcpStream>`