1use std::sync::Arc;
2
3use kcp_sys::{endpoint::*, packet_def::BytesMut, stream::KcpStream};
4use tokio::{
5 io::{AsyncReadExt, AsyncWriteExt},
6 net::UdpSocket,
7};
8
9#[tokio::main]
10async fn main() {
11 let mut endpoint = KcpEndpoint::new();
12 endpoint.run().await;
13
14 let (input, mut output) = (endpoint.input_sender(), endpoint.output_receiver().unwrap());
15
16 let udp_socket = Arc::new(UdpSocket::bind("0.0.0.0:54321").await.unwrap());
17 udp_socket.connect("127.0.0.1:54320").await.unwrap();
18
19 let udp = udp_socket.clone();
20 tokio::spawn(async move {
21 while let Some(data) = output.recv().await {
22 udp.send(&data.inner()).await.unwrap();
23 }
24 });
25
26 let udp = udp_socket.clone();
27 tokio::spawn(async move {
28 loop {
29 let mut buf = vec![0; 1024];
30 let (size, _) = udp.recv_from(&mut buf).await.unwrap();
31 input
32 .send(BytesMut::from(&buf[..size]).into())
33 .await
34 .unwrap();
35 }
36 });
37
38 loop {
39 let conn_id = endpoint.accept().await.unwrap();
40 let mut kcp_stream = KcpStream::new(&endpoint, conn_id).unwrap();
41
42 let mut buf = vec![0; 64 * 1024];
43 let size = kcp_stream.read(&mut buf).await.unwrap();
44 println!("server recv {}", String::from_utf8_lossy(&buf[..size]));
45
46 kcp_stream.write_all(&buf[..size]).await.unwrap();
47 kcp_stream.flush().await.unwrap();
48 }
49}