Skip to content

Commit 8919990

Browse files
author
e1732a364fed
committed
minor improve
1 parent 2db9f88 commit 8919990

File tree

5 files changed

+63
-37
lines changed

5 files changed

+63
-37
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ o2node-.->collector
172172
- [x] tcp, udp, unix domain socket, ip (tun)([tun example](rucimp/examples/README.md#tun))
173173
- [x] 流量记录 (两种实现, 分别用于记录原始流量(GlobalTrafficRecorder)与实际流量(Counter)) 与实时单连接流量监控 (trace feature)
174174
- [x] Direct, Blackhole, Listener, BindDialer, Stdio, Fileio
175+
- [x] fixed_target_addr
175176
- [x] Tls, Socks5(+ UDP ASSOCIATE,USERPASS), Http proxy, Socks5http, Trojan
176177
- [x] Adder (按字节加法器), Counter, Echo
177178
- [x] 路由 (tag_route)

doc/notes.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ BindDialer = {
124124
}
125125
```
126126

127-
### udp fixed_target_addr 转发 问题
127+
### BindDialer 的 udp fixed_target_addr 转发 问题
128128

129129
fixed_target_addr (dokodemo) 对于 udp BindDialer 有一个问题
130130

@@ -156,14 +156,15 @@ www.1.com 的答 是回复给 client1 还是 client2 呢?
156156
不完美方案:
157157

158158
1. 记录连接的顺序,然后按回答顺序回复给源。(如,记录交作业的顺序,按出成绩的顺序 回复)。问题:出成绩的顺序与交作业的顺序不一定一致
159-
2. 探查 udp 内容,按答案中的内容匹配后回复给源。问题:这样属于侵犯源的隐私
159+
2. 探查 udp 内容,按答案中的内容匹配后回复给源。问题:这样属于侵犯源的隐私, 且若不为已知协议则做不到
160160
3. 将回复 广播给所有 源。问题:这样属于侵犯源的隐私
161+
4. 独占性: 让用户自行确保同一段时间内只有唯一的客户端连接 ruci的 BindDialer
161162

162163

163-
都不完美. 唯一的方案是: 不用 BindDialer 做 udp 转发, 而是 使用 Listener
164+
都不完美. 绕过的方案是: 不用 BindDialer 做 udp 转发, 而是 使用 Listener
164165

165166
Listener 在 监听 udp, 且 有 udp 的 fixed_target_addr 时, 会对每一个 inbound
166-
连接新建一个 udp , 建立了一对一的转发, 而不是 一对多的转发, 就没问题了
167+
连接新建一个 udp 连接 , 建立了一对一的转发, 而不是 一对多的转发, 就没问题了
167168

168169

169170
### 报错示例: socks5 client only support tcplike stream, got NoStream

src/net/listen.rs

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ use std::{fs::remove_file, path::PathBuf};
22

33
use anyhow::{bail, Context};
44
use tokio::net::TcpListener;
5-
use tracing::warn;
5+
use tracing::{info, warn};
66

77
#[cfg(unix)]
88
use tokio::net::UnixListener;
99

1010
use crate::net::{self, Stream};
1111

12-
use super::{udp_listen::FixedTargetAddrUDPListener, Addr};
12+
use super::{udp_fixed_listen::FixedTargetAddrUDPListener, Addr};
1313

1414
#[derive(Debug)]
1515
pub enum Listener {
@@ -27,37 +27,53 @@ pub async fn listen(
2727
) -> anyhow::Result<Listener> {
2828
match laddr.network {
2929
net::Network::TCP => {
30-
let r = TcpListener::bind(laddr.get_socket_addr().expect("a has socket addr"))
31-
.await
32-
.context("tcp listen failed")?;
30+
let r = TcpListener::bind(
31+
laddr
32+
.get_socket_addr()
33+
.context("listen tcp but has no socket addr")?,
34+
)
35+
.await
36+
.context("tcp listen failed")?;
3337
Ok(Listener::TCP(r))
3438
}
35-
net::Network::UDP => Ok(Listener::UDP(
36-
FixedTargetAddrUDPListener::new(laddr.clone(), opt_fixed_target_addr.unwrap()).await?,
37-
)),
39+
net::Network::UDP => {
40+
let ft = match opt_fixed_target_addr {
41+
Some(ft) => ft,
42+
None => bail!("listen udp requires a fixed_target_addr"),
43+
};
44+
Ok(Listener::UDP(
45+
FixedTargetAddrUDPListener::new(laddr.clone(), ft).await?,
46+
))
47+
}
3848

3949
#[cfg(unix)]
4050
net::Network::Unix => {
41-
let file_n = laddr.get_name().expect("a has a name");
51+
let file_n = laddr.get_name().context("listen unix but has no name")?;
4252
let p = PathBuf::from(file_n.clone());
4353

44-
// is_file returns false for unix domain socket
45-
46-
if p.exists() && !p.is_dir() {
47-
warn!(
48-
"unix listen: previous {:?} exists, will delete it for new listening.",
49-
p
50-
);
51-
remove_file(p.clone()).context("unix listen try remove previous file failed")?;
52-
}
53-
let r = UnixListener::bind(p).context("unix listen failed")?;
54+
remove_unix(&p, true)?;
55+
let r = UnixListener::bind(p).context("listen unix failed")?;
5456

5557
Ok(Listener::UNIX((r, file_n)))
5658
}
5759
_ => bail!("listen not implemented for this network: {}", laddr.network),
5860
}
5961
}
6062

63+
fn remove_unix(p: &PathBuf, warn: bool) -> anyhow::Result<()> {
64+
// is_file returns false for unix domain socket
65+
66+
if p.exists() && !p.is_dir() && !p.is_file() {
67+
if warn {
68+
warn!("unix: previous {:?} exists, will remove it!", p);
69+
} else {
70+
info!("removing unix: {:?}", p);
71+
}
72+
remove_file(p.clone()).context("unix try remove previous file failed")?;
73+
}
74+
Ok(())
75+
}
76+
6177
impl Drop for Listener {
6278
fn drop(&mut self) {
6379
self.clean_up()
@@ -84,7 +100,7 @@ impl Listener {
84100
Err(e) => format!("no laddr, e:{e}"),
85101
}
86102
}
87-
Listener::UDP(u) => format!("{}", u.laddr),
103+
Listener::UDP(u) => format!("{}", u.laddr()),
88104

89105
#[cfg(unix)]
90106
Listener::UNIX(u) => {
@@ -102,17 +118,12 @@ impl Listener {
102118
#[cfg(unix)]
103119
Listener::UNIX((_, file_n)) => {
104120
let p = PathBuf::from(file_n.clone());
105-
if p.exists() && !p.is_dir() {
106-
warn!("unix clean up: will delete {:?}", p);
107-
let r = remove_file(p.clone()).context("unix clean up delete file failed");
108-
if let Err(e) = r {
109-
warn!("{}", e)
110-
}
121+
let r = remove_unix(&p, false);
122+
if let Err(e) = r {
123+
warn!("{}", e)
111124
}
112125
}
113-
Listener::UDP(ul) => {
114-
ul.shutdown();
115-
}
126+
116127
_ => {}
117128
}
118129
}

src/net/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub mod helpers;
1212
pub mod http;
1313
pub mod listen;
1414
pub mod udp;
15-
mod udp_listen;
15+
mod udp_fixed_listen;
1616

1717
pub mod cp;
1818

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use super::{
2929
/// 只支持 预定义 target_addr
3030
#[derive(Debug)]
3131
pub struct FixedTargetAddrUDPListener {
32-
pub laddr: Addr,
33-
pub dst: Addr,
32+
laddr: Addr,
33+
fixed_target: Addr,
3434
rx: mpsc::Receiver<(AddrConn, Addr)>,
3535
shutdown_tx: Option<oneshot::Sender<()>>,
3636
}
@@ -116,7 +116,7 @@ impl FixedTargetAddrUDPListener {
116116
shutdown_tx: Some(shutdown_tx),
117117
laddr,
118118
rx,
119-
dst,
119+
fixed_target: dst,
120120
})
121121
}
122122

@@ -136,6 +136,19 @@ impl FixedTargetAddrUDPListener {
136136
let _ = tx.send(());
137137
}
138138
}
139+
140+
pub fn laddr(&self) -> &Addr {
141+
&self.laddr
142+
}
143+
pub fn raddr(&self) -> &Addr {
144+
&self.fixed_target
145+
}
146+
}
147+
148+
impl Drop for FixedTargetAddrUDPListener {
149+
fn drop(&mut self) {
150+
self.shutdown()
151+
}
139152
}
140153

141154
/// init a AddrConn from a UdpSocket

0 commit comments

Comments
 (0)