@@ -241,41 +241,69 @@ impl From<TcpListener> for TokioTcpListener {
241241}
242242
243243#[ cfg( unix) ]
244- fn setsockopt_with_opt < F : AsRawFd > ( f : & F , opts : & AcceptOpts ) -> io:: Result < ( ) > {
244+ fn setsockopt_with_opt ( f : & tokio :: net :: TcpStream , opts : & AcceptOpts ) -> io:: Result < ( ) > {
245245 let socket = unsafe { Socket :: from_raw_fd ( f. as_raw_fd ( ) ) } ;
246246
247+ macro_rules! try_sockopt {
248+ ( $socket: ident . $func: ident ( $( $arg: expr) ,* ) ) => {
249+ match $socket . $func ( $( $arg) ,* ) {
250+ Ok ( e) => e,
251+ Err ( err) => {
252+ let _ = socket. into_raw_fd( ) ;
253+ return Err ( err) ;
254+ }
255+ }
256+ } ;
257+ }
258+
247259 if let Some ( buf_size) = opts. tcp . send_buffer_size {
248- socket. set_send_buffer_size ( buf_size as usize ) ? ;
260+ try_sockopt ! ( socket. set_send_buffer_size( buf_size as usize ) ) ;
249261 }
250262
251263 if let Some ( buf_size) = opts. tcp . recv_buffer_size {
252- socket. set_recv_buffer_size ( buf_size as usize ) ? ;
264+ try_sockopt ! ( socket. set_recv_buffer_size( buf_size as usize ) ) ;
253265 }
254266
255- if opts. tcp . nodelay {
256- socket. set_nodelay ( true ) ?;
257- }
267+ try_sockopt ! ( socket. set_nodelay( opts. tcp. nodelay) ) ;
268+ try_sockopt ! ( socket. set_keepalive( opts. tcp. keepalive) ) ;
258269
259270 let _ = socket. into_raw_fd ( ) ;
260271 Ok ( ( ) )
261272}
262273
263274#[ cfg( windows) ]
264- fn setsockopt_with_opt < F : AsRawSocket > ( f : & F , opts : & AcceptOpts ) -> io:: Result < ( ) > {
275+ fn setsockopt_with_opt ( f : & tokio :: net :: TcpStream , opts : & AcceptOpts ) -> io:: Result < ( ) > {
265276 let socket = unsafe { Socket :: from_raw_socket ( f. as_raw_socket ( ) ) } ;
266277
278+ macro_rules! try_sockopt {
279+ ( $socket: ident . $func: ident ( $( $arg: expr) ,* ) ) => {
280+ match $socket . $func ( $( $arg) ,* ) {
281+ Ok ( e) => e,
282+ Err ( err) => {
283+ let _ = socket. into_raw_socket( ) ;
284+ return Err ( err) ;
285+ }
286+ }
287+ } ;
288+ }
289+
267290 if let Some ( buf_size) = opts. tcp . send_buffer_size {
268- socket. set_send_buffer_size ( buf_size as usize ) ? ;
291+ try_sockopt ! ( socket. set_send_buffer_size( buf_size as usize ) ) ;
269292 }
270293
271294 if let Some ( buf_size) = opts. tcp . recv_buffer_size {
272- socket. set_recv_buffer_size ( buf_size as usize ) ? ;
295+ try_sockopt ! ( socket. set_recv_buffer_size( buf_size as usize ) ) ;
273296 }
274297
275- if opts. tcp . nodelay {
276- socket. set_nodelay ( true ) ?;
277- }
298+ try_sockopt ! ( socket. set_nodelay( opts. tcp. nodelay) ) ;
299+ try_sockopt ! ( socket. set_keepalive( opts. tcp. keepalive) ) ;
278300
279301 let _ = socket. into_raw_socket ( ) ;
280302 Ok ( ( ) )
281303}
304+
305+ #[ cfg( all( not( windows) , not( unix) ) ) ]
306+ fn setsockopt_with_opt ( f : & tokio:: net:: TcpStream , opts : & AcceptOpts ) -> io:: Result < ( ) > {
307+ f. set_nodelay ( opts. tcp . nodelay ) ?;
308+ Ok ( ( ) )
309+ }
0 commit comments