@@ -108,46 +108,11 @@ impl AddrIncoming {
108
108
match ready ! ( self . listener. poll_accept( cx) ) {
109
109
Ok ( ( socket, addr) ) => {
110
110
if let Some ( dur) = self . tcp_keepalive_timeout {
111
- // Convert the Tokio `TcpStream` into a `socket2` socket
112
- // so we can call `set_keepalive`.
113
- // TODO(eliza): if Tokio's `TcpSocket` API grows a few
114
- // more methods in the future, hopefully we shouldn't
115
- // have to do the `from_raw_fd` dance any longer...
116
- #[ cfg( unix) ]
117
- let socket = unsafe {
118
- // Safety: `socket2`'s socket will try to close the
119
- // underlying fd when it's dropped. However, we
120
- // can't take ownership of the fd from the tokio
121
- // TcpStream, so instead we will call `into_raw_fd`
122
- // on the socket2 socket before dropping it. This
123
- // prevents it from trying to close the fd.
124
- use std:: os:: unix:: io:: { AsRawFd , FromRawFd } ;
125
- socket2:: Socket :: from_raw_fd ( socket. as_raw_fd ( ) )
126
- } ;
127
- #[ cfg( windows) ]
128
- let socket = unsafe {
129
- // Safety: `socket2`'s socket will try to close the
130
- // underlying SOCKET when it's dropped. However, we
131
- // can't take ownership of the SOCKET from the tokio
132
- // TcpStream, so instead we will call `into_raw_socket`
133
- // on the socket2 socket before dropping it. This
134
- // prevents it from trying to close the SOCKET.
135
- use std:: os:: windows:: io:: { AsRawSocket , FromRawSocket } ;
136
- socket2:: Socket :: from_raw_socket ( socket. as_raw_socket ( ) )
137
- } ;
138
-
139
- // Actually set the TCP keepalive timeout.
140
- if let Err ( e) = socket. set_keepalive ( Some ( dur) ) {
111
+ let socket = socket2:: SockRef :: from ( & socket) ;
112
+ let conf = socket2:: TcpKeepalive :: new ( ) . with_time ( dur) ;
113
+ if let Err ( e) = socket. set_tcp_keepalive ( & conf) {
141
114
trace ! ( "error trying to set TCP keepalive: {}" , e) ;
142
115
}
143
-
144
- // Take ownershop of the fd/socket back from the socket2
145
- // `Socket`, so that socket2 doesn't try to close it
146
- // when it's dropped.
147
- #[ cfg( unix) ]
148
- drop ( std:: os:: unix:: io:: IntoRawFd :: into_raw_fd ( socket) ) ;
149
- #[ cfg( windows) ]
150
- drop ( std:: os:: windows:: io:: IntoRawSocket :: into_raw_socket ( socket) ) ;
151
116
}
152
117
if let Err ( e) = socket. set_nodelay ( self . tcp_nodelay ) {
153
118
trace ! ( "error trying to set TCP nodelay: {}" , e) ;
0 commit comments