shadowsocks_service/net/
mon_socket.rs1use std::{io, net::SocketAddr, sync::Arc};
4
5use shadowsocks::{
6 ProxySocket,
7 relay::{
8 socks5::Address,
9 udprelay::{DatagramReceive, DatagramSend, options::UdpSocketControlData},
10 },
11};
12
13use super::flow::FlowStat;
14
15pub struct MonProxySocket<S> {
17 socket: ProxySocket<S>,
18 flow_stat: Arc<FlowStat>,
19}
20
21impl<S> MonProxySocket<S> {
22 pub fn from_socket(socket: ProxySocket<S>, flow_stat: Arc<FlowStat>) -> Self {
24 Self { socket, flow_stat }
25 }
26
27 #[inline]
29 pub fn get_ref(&self) -> &ProxySocket<S> {
30 &self.socket
31 }
32
33 #[inline]
35 pub fn flow_stat(&self) -> &FlowStat {
36 &self.flow_stat
37 }
38}
39
40impl<S> MonProxySocket<S>
41where
42 S: DatagramSend,
43{
44 #[inline]
46 pub async fn send(&self, addr: &Address, payload: &[u8]) -> io::Result<()> {
47 let n = self.socket.send(addr, payload).await?;
48 self.flow_stat.incr_tx(n as u64);
49
50 Ok(())
51 }
52
53 #[inline]
55 pub async fn send_with_ctrl(
56 &self,
57 addr: &Address,
58 control: &UdpSocketControlData,
59 payload: &[u8],
60 ) -> io::Result<()> {
61 let n = self.socket.send_with_ctrl(addr, control, payload).await?;
62 self.flow_stat.incr_tx(n as u64);
63
64 Ok(())
65 }
66
67 #[inline]
69 pub async fn send_to(&self, target: SocketAddr, addr: &Address, payload: &[u8]) -> io::Result<()> {
70 let n = self.socket.send_to(target, addr, payload).await?;
71 self.flow_stat.incr_tx(n as u64);
72
73 Ok(())
74 }
75
76 #[inline]
78 pub async fn send_to_with_ctrl(
79 &self,
80 target: SocketAddr,
81 addr: &Address,
82 control: &UdpSocketControlData,
83 payload: &[u8],
84 ) -> io::Result<()> {
85 let n = self.socket.send_to_with_ctrl(target, addr, control, payload).await?;
86 self.flow_stat.incr_tx(n as u64);
87
88 Ok(())
89 }
90}
91
92impl<S> MonProxySocket<S>
93where
94 S: DatagramReceive,
95{
96 #[inline]
102 pub async fn recv(&self, recv_buf: &mut [u8]) -> io::Result<(usize, Address)> {
103 let (n, addr, recv_n) = self.socket.recv(recv_buf).await?;
104 self.flow_stat.incr_rx(recv_n as u64);
105
106 Ok((n, addr))
107 }
108
109 #[inline]
115 pub async fn recv_with_ctrl(
116 &self,
117 recv_buf: &mut [u8],
118 ) -> io::Result<(usize, Address, Option<UdpSocketControlData>)> {
119 let (n, addr, recv_n, control) = self.socket.recv_with_ctrl(recv_buf).await?;
120 self.flow_stat.incr_rx(recv_n as u64);
121
122 Ok((n, addr, control))
123 }
124
125 #[inline]
131 pub async fn recv_from(&self, recv_buf: &mut [u8]) -> io::Result<(usize, SocketAddr, Address)> {
132 let (n, peer_addr, addr, recv_n) = self.socket.recv_from(recv_buf).await?;
133 self.flow_stat.incr_rx(recv_n as u64);
134
135 Ok((n, peer_addr, addr))
136 }
137
138 #[inline]
144 pub async fn recv_from_with_ctrl(
145 &self,
146 recv_buf: &mut [u8],
147 ) -> io::Result<(usize, SocketAddr, Address, Option<UdpSocketControlData>)> {
148 let (n, peer_addr, addr, recv_n, control) = self.socket.recv_from_with_ctrl(recv_buf).await?;
149 self.flow_stat.incr_rx(recv_n as u64);
150
151 Ok((n, peer_addr, addr, control))
152 }
153}