@@ -3,6 +3,7 @@ use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
33use std:: sync:: Arc ;
44use std:: time:: SystemTime ;
55use log:: { debug, info} ;
6+ use socket2:: { Socket , Domain , Type , Protocol } ;
67use tokio:: net:: UdpSocket ;
78use crate :: stats:: enums:: stats_event:: StatsEvent ;
89use crate :: tracker:: enums:: torrent_peers_type:: TorrentPeersType ;
@@ -34,12 +35,23 @@ use crate::udp::udp::{MAX_PACKET_SIZE, MAX_SCRAPE_TORRENTS};
3435
3536impl UdpServer {
3637 #[ tracing:: instrument( level = "debug" ) ]
37- pub async fn new ( tracker : Arc < TorrentTracker > , bind_address : SocketAddr , threads : u64 ) -> tokio:: io:: Result < UdpServer >
38+ pub async fn new ( tracker : Arc < TorrentTracker > , bind_address : SocketAddr , threads : u64 , recv_buffer_size : usize , send_buffer_size : usize , reuse_address : bool ) -> tokio:: io:: Result < UdpServer >
3839 {
39- let socket = UdpSocket :: bind ( bind_address) . await ?;
40+ let domain = if bind_address. is_ipv4 ( ) { Domain :: IPV4 } else { Domain :: IPV6 } ;
41+ let socket = Socket :: new ( domain, Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
42+
43+ socket. set_recv_buffer_size ( recv_buffer_size) . map_err ( |e| tokio:: io:: Error :: new ( tokio:: io:: ErrorKind :: Other , e) ) ?;
44+ socket. set_send_buffer_size ( send_buffer_size) . map_err ( |e| tokio:: io:: Error :: new ( tokio:: io:: ErrorKind :: Other , e) ) ?;
45+ socket. set_reuse_address ( reuse_address) . map_err ( |e| tokio:: io:: Error :: new ( tokio:: io:: ErrorKind :: Other , e) ) ?;
46+ socket. bind ( & bind_address. into ( ) ) . map_err ( |e| tokio:: io:: Error :: new ( tokio:: io:: ErrorKind :: Other , e) ) ?;
47+ socket. set_nonblocking ( true ) . map_err ( |e| tokio:: io:: Error :: new ( tokio:: io:: ErrorKind :: Other , e) ) ?;
48+
49+ // Convert to std::net::UdpSocket, then to tokio::net::UdpSocket
50+ let std_socket: std:: net:: UdpSocket = socket. into ( ) ;
51+ let tokio_socket = UdpSocket :: from_std ( std_socket) ?;
4052
4153 Ok ( UdpServer {
42- socket : Arc :: new ( socket ) ,
54+ socket : Arc :: new ( tokio_socket ) ,
4355 threads,
4456 tracker,
4557 } )
0 commit comments