@@ -59,6 +59,9 @@ pub(crate) const SOCK_SEQPACKET: c_int =
5959pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: {
6060 IPPROTO_ICMP , IPPROTO_ICMPV6 , IPPROTO_TCP , IPPROTO_UDP ,
6161} ;
62+
63+ #[ cfg( feature = "all" ) ]
64+ pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: TCP_KEEPCNT ;
6265// Used in `SockAddr`.
6366pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: {
6467 SOCKADDR as sockaddr, SOCKADDR_IN as sockaddr_in, SOCKADDR_IN6 as sockaddr_in6,
@@ -737,17 +740,18 @@ fn into_ms(duration: Option<Duration>) -> u32 {
737740}
738741
739742pub ( crate ) fn set_tcp_keepalive ( socket : Socket , keepalive : & TcpKeepalive ) -> io:: Result < ( ) > {
740- let mut keepalive = tcp_keepalive {
743+ let mut tcp_keepalive = tcp_keepalive {
741744 onoff : 1 ,
742745 keepalivetime : into_ms ( keepalive. time ) ,
743746 keepaliveinterval : into_ms ( keepalive. interval ) ,
744747 } ;
748+
745749 let mut out = 0 ;
746750 syscall ! (
747751 WSAIoctl (
748752 socket,
749753 SIO_KEEPALIVE_VALS ,
750- & mut keepalive as * mut _ as * mut _,
754+ & mut tcp_keepalive as * mut _ as * mut _,
751755 size_of:: <tcp_keepalive>( ) as _,
752756 ptr:: null_mut( ) ,
753757 0 ,
@@ -757,8 +761,18 @@ pub(crate) fn set_tcp_keepalive(socket: Socket, keepalive: &TcpKeepalive) -> io:
757761 ) ,
758762 PartialEq :: eq,
759763 SOCKET_ERROR
760- )
761- . map ( |_| ( ) )
764+ ) ?;
765+ if let Some ( retries) = keepalive. retries {
766+ unsafe {
767+ setsockopt (
768+ socket,
769+ WinSock :: IPPROTO_TCP ,
770+ WinSock :: TCP_KEEPCNT ,
771+ retries as c_int ,
772+ ) ?
773+ }
774+ }
775+ Ok ( ( ) )
762776}
763777
764778/// Caller must ensure `T` is the correct type for `level` and `optname`.
0 commit comments