1
+ use std:: future:: Future ;
1
2
use std:: io:: Cursor ;
2
3
use std:: net:: { SocketAddr } ;
3
4
use std:: sync:: Arc ;
4
5
use aquatic_udp_protocol:: { Response } ;
5
- use log:: debug;
6
+ use log:: { debug, info } ;
6
7
use tokio:: net:: UdpSocket ;
7
- use crate :: { TorrentTracker , UdpTrackerConfig } ;
8
+ use crate :: { TorrentTracker } ;
8
9
use crate :: torrust_udp_tracker:: { handle_packet, MAX_PACKET_SIZE } ;
9
10
10
11
pub struct UdpServer {
11
- socket : UdpSocket ,
12
+ socket : Arc < UdpSocket > ,
12
13
tracker : Arc < TorrentTracker > ,
13
14
}
14
15
15
16
impl UdpServer {
16
- pub async fn new ( tracker : Arc < TorrentTracker > , config : & UdpTrackerConfig ) -> Result < UdpServer , std :: io:: Error > {
17
- let srv = UdpSocket :: bind ( & config . bind_address ) . await ?;
17
+ pub async fn new ( tracker : Arc < TorrentTracker > , bind_address : & str ) -> tokio :: io:: Result < UdpServer > {
18
+ let socket = UdpSocket :: bind ( bind_address) . await ?;
18
19
19
20
Ok ( UdpServer {
20
- socket : srv ,
21
+ socket : Arc :: new ( socket ) ,
21
22
tracker,
22
23
} )
23
24
}
24
25
25
- pub async fn start ( & self ) {
26
+ pub async fn start ( & self , rx : tokio :: sync :: watch :: Receiver < bool > ) {
26
27
loop {
28
+ let mut rx = rx. clone ( ) ;
27
29
let mut data = [ 0 ; MAX_PACKET_SIZE ] ;
28
- if let Ok ( ( valid_bytes, remote_addr) ) = self . socket . recv_from ( & mut data) . await {
29
- let data = & data[ ..valid_bytes] ;
30
- debug ! ( "Received {} bytes from {}" , data. len( ) , remote_addr) ;
31
- debug ! ( "{:?}" , data) ;
32
- let response = handle_packet ( remote_addr, data, self . tracker . clone ( ) ) . await ;
33
- self . send_response ( remote_addr, response) . await ;
30
+ let socket = self . socket . clone ( ) ;
31
+ let tracker = self . tracker . clone ( ) ;
32
+
33
+ tokio:: select! {
34
+ _ = rx. changed( ) => {
35
+ info!( "Stopping UDP server: {}..." , socket. local_addr( ) . unwrap( ) ) ;
36
+ break ;
37
+ }
38
+ Ok ( ( valid_bytes, remote_addr) ) = socket. recv_from( & mut data) => {
39
+ let payload = data[ ..valid_bytes] . to_vec( ) ;
40
+
41
+ debug!( "Received {} bytes from {}" , payload. len( ) , remote_addr) ;
42
+ debug!( "{:?}" , payload) ;
43
+
44
+ let response = handle_packet( remote_addr, payload, tracker) . await ;
45
+ UdpServer :: send_response( socket, remote_addr, response) . await ;
46
+ }
34
47
}
35
48
}
36
49
}
37
50
38
- async fn send_response ( & self , remote_addr : SocketAddr , response : Response ) {
51
+ async fn send_response ( socket : Arc < UdpSocket > , remote_addr : SocketAddr , response : Response ) {
39
52
debug ! ( "sending response to: {:?}" , & remote_addr) ;
40
53
41
54
let buffer = vec ! [ 0u8 ; MAX_PACKET_SIZE ] ;
@@ -47,14 +60,14 @@ impl UdpServer {
47
60
let inner = cursor. get_ref ( ) ;
48
61
49
62
debug ! ( "{:?}" , & inner[ ..position] ) ;
50
- self . send_packet ( & remote_addr, & inner[ ..position] ) . await ;
63
+ UdpServer :: send_packet ( socket , & remote_addr, & inner[ ..position] ) . await ;
51
64
}
52
65
Err ( _) => { debug ! ( "could not write response to bytes." ) ; }
53
66
}
54
67
}
55
68
56
- async fn send_packet ( & self , remote_addr : & SocketAddr , payload : & [ u8 ] ) {
69
+ async fn send_packet ( socket : Arc < UdpSocket > , remote_addr : & SocketAddr , payload : & [ u8 ] ) {
57
70
// doesn't matter if it reaches or not
58
- let _ = self . socket . send_to ( payload, remote_addr) . await ;
71
+ let _ = socket. send_to ( payload, remote_addr) . await ;
59
72
}
60
73
}
0 commit comments