|
|
@@ -59,18 +59,30 @@ impl RendezvousServer {
|
|
59
|
59
|
let tcp_punch = rs.tcp_punch.clone();
|
|
60
|
60
|
tcp_punch.lock().unwrap().insert(addr, a);
|
|
61
|
61
|
let tx = tx.clone();
|
|
|
62
|
+ let mut rs = Self {
|
|
|
63
|
+ peer_map: PeerMap::new(),
|
|
|
64
|
+ tcp_punch: tcp_punch,
|
|
|
65
|
+ };
|
|
62
|
66
|
tokio::spawn(async move {
|
|
63
|
67
|
while let Some(Ok(bytes)) = b.next().await {
|
|
64
|
68
|
if let Ok(msg_in) = parse_from_bytes::<RendezvousMessage>(&bytes) {
|
|
65
|
69
|
match msg_in.union {
|
|
66
|
70
|
Some(rendezvous_message::Union::punch_hole_request(ph)) => {
|
|
67
|
|
- tx.send((addr, ph.id)).ok();
|
|
|
71
|
+ allow_err!(tx.send((addr, ph.id)));
|
|
|
72
|
+ }
|
|
|
73
|
+ Some(rendezvous_message::Union::punch_hole_sent(phs)) => {
|
|
|
74
|
+ allow_err!(rs.handle_hole_sent(&phs, addr, None).await);
|
|
|
75
|
+ break;
|
|
|
76
|
+ }
|
|
|
77
|
+ Some(rendezvous_message::Union::local_addr(la)) => {
|
|
|
78
|
+ allow_err!(rs.handle_local_addr(&la, addr, None).await);
|
|
|
79
|
+ break;
|
|
68
|
80
|
}
|
|
69
|
81
|
_ => {}
|
|
70
|
82
|
}
|
|
71
|
83
|
}
|
|
72
|
84
|
}
|
|
73
|
|
- tcp_punch.lock().unwrap().remove(&addr);
|
|
|
85
|
+ rs.tcp_punch.lock().unwrap().remove(&addr);
|
|
74
|
86
|
log::debug!("Tcp connection from {:?} closed", addr);
|
|
75
|
87
|
});
|
|
76
|
88
|
}
|
|
|
@@ -106,28 +118,10 @@ impl RendezvousServer {
|
|
106
|
118
|
self.handle_punch_hole_request(addr, &ph.id, socket).await?;
|
|
107
|
119
|
}
|
|
108
|
120
|
Some(rendezvous_message::Union::punch_hole_sent(phs)) => {
|
|
109
|
|
- // punch hole sent from B, tell A that B is ready to be connected
|
|
110
|
|
- let addr_a = AddrMangle::decode(&phs.socket_addr);
|
|
111
|
|
- log::debug!("Punch hole response to {:?} from {:?}", &addr_a, &addr);
|
|
112
|
|
- let mut msg_out = RendezvousMessage::new();
|
|
113
|
|
- msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
114
|
|
- socket_addr: AddrMangle::encode(addr),
|
|
115
|
|
- ..Default::default()
|
|
116
|
|
- });
|
|
117
|
|
- socket.send(&msg_out, addr_a).await?;
|
|
118
|
|
- self.send_to_tcp(&msg_out, addr_a).await?;
|
|
|
121
|
+ self.handle_hole_sent(&phs, addr, Some(socket)).await?;
|
|
119
|
122
|
}
|
|
120
|
123
|
Some(rendezvous_message::Union::local_addr(la)) => {
|
|
121
|
|
- // forward local addrs of B to A
|
|
122
|
|
- let addr_a = AddrMangle::decode(&la.socket_addr);
|
|
123
|
|
- log::debug!("Local addrs response to {:?} from {:?}", &addr_a, &addr);
|
|
124
|
|
- let mut msg_out = RendezvousMessage::new();
|
|
125
|
|
- msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
126
|
|
- socket_addr: la.local_addr,
|
|
127
|
|
- ..Default::default()
|
|
128
|
|
- });
|
|
129
|
|
- socket.send(&msg_out, addr_a).await?;
|
|
130
|
|
- self.send_to_tcp(&msg_out, addr_a).await?;
|
|
|
124
|
+ self.handle_local_addr(&la, addr, Some(socket)).await?;
|
|
131
|
125
|
}
|
|
132
|
126
|
_ => {}
|
|
133
|
127
|
}
|
|
|
@@ -135,6 +129,60 @@ impl RendezvousServer {
|
|
135
|
129
|
Ok(())
|
|
136
|
130
|
}
|
|
137
|
131
|
|
|
|
132
|
+ async fn handle_hole_sent<'a>(
|
|
|
133
|
+ &mut self,
|
|
|
134
|
+ phs: &PunchHoleSent,
|
|
|
135
|
+ addr: SocketAddr,
|
|
|
136
|
+ socket: Option<&'a mut FramedSocket>,
|
|
|
137
|
+ ) -> ResultType<()> {
|
|
|
138
|
+ // punch hole sent from B, tell A that B is ready to be connected
|
|
|
139
|
+ let addr_a = AddrMangle::decode(&phs.socket_addr);
|
|
|
140
|
+ log::debug!(
|
|
|
141
|
+ "{} punch hole response to {:?} from {:?}",
|
|
|
142
|
+ if socket.is_none() { "TCP" } else { "UDP" },
|
|
|
143
|
+ &addr_a,
|
|
|
144
|
+ &addr
|
|
|
145
|
+ );
|
|
|
146
|
+ let mut msg_out = RendezvousMessage::new();
|
|
|
147
|
+ msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
|
148
|
+ socket_addr: AddrMangle::encode(addr),
|
|
|
149
|
+ ..Default::default()
|
|
|
150
|
+ });
|
|
|
151
|
+ if let Some(socket) = socket {
|
|
|
152
|
+ socket.send(&msg_out, addr_a).await?;
|
|
|
153
|
+ } else {
|
|
|
154
|
+ self.send_to_tcp(&msg_out, addr_a).await?;
|
|
|
155
|
+ }
|
|
|
156
|
+ Ok(())
|
|
|
157
|
+ }
|
|
|
158
|
+
|
|
|
159
|
+ async fn handle_local_addr<'a>(
|
|
|
160
|
+ &mut self,
|
|
|
161
|
+ la: &LocalAddr,
|
|
|
162
|
+ addr: SocketAddr,
|
|
|
163
|
+ socket: Option<&'a mut FramedSocket>,
|
|
|
164
|
+ ) -> ResultType<()> {
|
|
|
165
|
+ // forward local addrs of B to A
|
|
|
166
|
+ let addr_a = AddrMangle::decode(&la.socket_addr);
|
|
|
167
|
+ log::debug!(
|
|
|
168
|
+ "{} local addrs response to {:?} from {:?}",
|
|
|
169
|
+ if socket.is_none() { "TCP" } else { "UDP" },
|
|
|
170
|
+ &addr_a,
|
|
|
171
|
+ &addr
|
|
|
172
|
+ );
|
|
|
173
|
+ let mut msg_out = RendezvousMessage::new();
|
|
|
174
|
+ msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
|
175
|
+ socket_addr: la.local_addr.clone(),
|
|
|
176
|
+ ..Default::default()
|
|
|
177
|
+ });
|
|
|
178
|
+ if let Some(socket) = socket {
|
|
|
179
|
+ socket.send(&msg_out, addr_a).await?;
|
|
|
180
|
+ } else {
|
|
|
181
|
+ self.send_to_tcp(&msg_out, addr_a).await?;
|
|
|
182
|
+ }
|
|
|
183
|
+ Ok(())
|
|
|
184
|
+ }
|
|
|
185
|
+
|
|
138
|
186
|
async fn handle_punch_hole_request(
|
|
139
|
187
|
&mut self,
|
|
140
|
188
|
addr: SocketAddr,
|