@@ -7,14 +7,10 @@ use std::{
7
7
use dashmap:: DashMap ;
8
8
use qbase:: {
9
9
cid:: ConnectionId ,
10
- packet:: {
11
- header:: { GetDcid , GetScid } ,
12
- long, DataHeader , DataPacket , InitialHeader , RetryHeader ,
13
- } ,
10
+ packet:: { header:: GetScid , long, DataHeader , DataPacket , InitialHeader , RetryHeader } ,
14
11
param:: { Parameters , ServerParameters } ,
15
12
sid:: { handy:: ConsistentConcurrency , ControlConcurrency } ,
16
13
token:: { ArcTokenRegistry , TokenProvider } ,
17
- util:: ArcAsyncDeque ,
18
14
} ;
19
15
use qconnection:: { conn:: ArcConnection , path:: Pathway , router:: Router , usc:: ArcUsc } ;
20
16
use rustls:: {
@@ -26,7 +22,7 @@ use rustls::{
26
22
use crate :: { get_or_create_usc, util, ConnKey , QuicConnection , CONNECTIONS } ;
27
23
28
24
type TlsServerConfigBuilder < T > = ConfigBuilder < TlsServerConfig , T > ;
29
- type QuicListner = ArcAsyncDeque < ( Arc < QuicConnection > , Pathway ) > ;
25
+ type QuicListner = Arc < util :: Channel < ( Arc < QuicConnection > , Pathway ) > > ;
30
26
31
27
/// 理应全局只有一个server
32
28
static SERVER : LazyLock < RwLock < Weak < QuicServer > > > = LazyLock :: new ( RwLock :: default) ;
@@ -132,20 +128,18 @@ impl QuicServer {
132
128
///
133
129
/// If all listening udp sockets are closed, this method will return an error.
134
130
pub async fn accept ( & self ) -> io:: Result < ( Arc < QuicConnection > , Pathway ) > {
135
- // TODO: 错误
136
- let error = || {
137
- // let msg = "All listening udp sockets are closed";
138
- // io::Error::new(io::ErrorKind::AddrNotAvailable, msg)
139
- unreachable ! ( )
131
+ let no_address_listening = || {
132
+ let error = "all listening udp sockets are closed" ;
133
+ io:: Error :: new ( io:: ErrorKind :: AddrNotAvailable , error)
140
134
} ;
141
- // 这个VecDeque永远不会被close,所以这里不会是None
142
- self . listener . pop ( ) . await . ok_or_else ( error)
135
+ self . listener . recv ( ) . await . ok_or_else ( no_address_listening)
143
136
}
144
137
}
145
138
146
139
// internal methods
147
140
impl QuicServer {
148
141
pub ( crate ) fn try_to_accept_conn_from ( mut packet : DataPacket , pathway : Pathway , usc : & ArcUsc ) {
142
+ log:: info!( "try to accept connection from {}" , pathway. dst_addr( ) ) ;
149
143
let Some ( server) = SERVER . read ( ) . unwrap ( ) . upgrade ( ) else {
150
144
return ;
151
145
} ;
@@ -161,13 +155,11 @@ impl QuicServer {
161
155
. unwrap ( ) ;
162
156
let ( initial_dcid, client_initial_dcid) = match & mut packet. header {
163
157
DataHeader :: Long ( long:: DataHeader :: Initial ( hdr) ) => {
164
- let client_dcid = * hdr. get_dcid ( ) ;
165
- hdr. dcid = initial_scid;
158
+ let client_dcid = core:: mem:: replace ( & mut hdr. dcid , initial_scid) ;
166
159
( * hdr. get_scid ( ) , client_dcid)
167
160
}
168
161
DataHeader :: Long ( long:: DataHeader :: ZeroRtt ( hdr) ) => {
169
- let client_dcid = * hdr. get_dcid ( ) ;
170
- hdr. dcid = initial_scid;
162
+ let client_dcid = core:: mem:: replace ( & mut hdr. dcid , initial_scid) ;
171
163
( * hdr. get_scid ( ) , client_dcid)
172
164
}
173
165
_ => return ,
@@ -195,25 +187,25 @@ impl QuicServer {
195
187
token_registry,
196
188
) ;
197
189
inner. add_initial_path ( pathway, usc. clone ( ) ) ;
198
- let conn = QuicConnection {
190
+ let conn = Arc :: new ( QuicConnection {
199
191
key : ConnKey :: Server ( initial_scid) ,
200
192
inner : inner. clone ( ) , // emm...
201
- } ;
202
- log:: info!( "incoming connection established" ) ;
203
- server. listener . push_back ( ( Arc :: new ( conn) , pathway. filp ( ) ) ) ;
204
- CONNECTIONS . insert ( ConnKey :: Server ( initial_scid) , inner) ;
205
- _ = Router :: try_to_route_packet_from ( packet, pathway, usc) ;
193
+ } ) ;
194
+
195
+ if server. listener . send ( ( conn, pathway. filp ( ) ) ) . is_ok ( ) {
196
+ CONNECTIONS . insert ( ConnKey :: Server ( initial_scid) , inner) ;
197
+ _ = Router :: try_to_route_packet_from ( packet, pathway, usc) ;
198
+ }
206
199
}
207
200
208
201
pub ( crate ) fn on_socket_close ( addr : SocketAddr ) {
209
202
if let Some ( server) = SERVER . read ( ) . unwrap ( ) . upgrade ( ) {
210
203
let bind_address_removed = server. sockets . remove ( & addr) . is_some ( ) ;
211
- // 所有已经绑定的地址都被关闭了,并且被动监听没有开启,那么就关闭server的监听...
212
- // THINK: 不可能再接收新连接的情况下,Listener应该被立刻关闭?否
213
- // if bind_address_removed && !server.passive_listening && server.sockets.is_empty() {
214
- // server.listener.close();
215
- // }
216
- _ = bind_address_removed;
204
+ // when: add listening sockets are removed, and passive listening is not enabled, it's not possiable
205
+ // to accept new connections anymore, so close the server's listener...
206
+ if bind_address_removed && !server. passive_listening && server. sockets . is_empty ( ) {
207
+ server. listener . close ( ) ;
208
+ }
217
209
}
218
210
}
219
211
0 commit comments