1
1
use crate :: config:: Host ;
2
2
use crate :: { Error , Socket } ;
3
- use socket2:: { Domain , Protocol , Type } ;
3
+ use socket2:: { SockRef , TcpKeepalive } ;
4
4
use std:: future:: Future ;
5
5
use std:: io;
6
- use std:: net:: SocketAddr ;
7
- #[ cfg( unix) ]
8
- use std:: os:: unix:: io:: { FromRawFd , IntoRawFd } ;
9
- #[ cfg( windows) ]
10
- use std:: os:: windows:: io:: { FromRawSocket , IntoRawSocket } ;
11
6
use std:: time:: Duration ;
12
7
#[ cfg( unix) ]
13
8
use tokio:: net:: UnixStream ;
14
- use tokio:: net:: { self , TcpSocket } ;
9
+ use tokio:: net:: { self , TcpStream } ;
15
10
use tokio:: time;
16
11
17
12
pub ( crate ) async fn connect_socket (
@@ -30,30 +25,23 @@ pub(crate) async fn connect_socket(
30
25
let mut last_err = None ;
31
26
32
27
for addr in addrs {
33
- let domain = match addr {
34
- SocketAddr :: V4 ( _) => Domain :: ipv4 ( ) ,
35
- SocketAddr :: V6 ( _) => Domain :: ipv6 ( ) ,
36
- } ;
28
+ let stream =
29
+ match connect_with_timeout ( TcpStream :: connect ( addr) , connect_timeout) . await {
30
+ Ok ( stream) => stream,
31
+ Err ( e) => {
32
+ last_err = Some ( e) ;
33
+ continue ;
34
+ }
35
+ } ;
37
36
38
- let socket = socket2:: Socket :: new ( domain, Type :: stream ( ) , Some ( Protocol :: tcp ( ) ) )
39
- . map_err ( Error :: connect) ?;
40
- socket. set_nonblocking ( true ) . map_err ( Error :: connect) ?;
41
- socket. set_nodelay ( true ) . map_err ( Error :: connect) ?;
37
+ stream. set_nodelay ( true ) . map_err ( Error :: connect) ?;
42
38
if keepalives {
43
- socket
44
- . set_keepalive ( Some ( keepalives_idle) )
39
+ SockRef :: from ( & stream )
40
+ . set_tcp_keepalive ( & TcpKeepalive :: new ( ) . with_time ( keepalives_idle) )
45
41
. map_err ( Error :: connect) ?;
46
42
}
47
43
48
- #[ cfg( unix) ]
49
- let socket = unsafe { TcpSocket :: from_raw_fd ( socket. into_raw_fd ( ) ) } ;
50
- #[ cfg( windows) ]
51
- let socket = unsafe { TcpSocket :: from_raw_socket ( socket. into_raw_socket ( ) ) } ;
52
-
53
- match connect_with_timeout ( socket. connect ( addr) , connect_timeout) . await {
54
- Ok ( socket) => return Ok ( Socket :: new_tcp ( socket) ) ,
55
- Err ( e) => last_err = Some ( e) ,
56
- }
44
+ return Ok ( Socket :: new_tcp ( stream) ) ;
57
45
}
58
46
59
47
Err ( last_err. unwrap_or_else ( || {
0 commit comments