@@ -59,6 +59,9 @@ pub(crate) const SOCK_SEQPACKET: c_int =
59
59
pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: {
60
60
IPPROTO_ICMP , IPPROTO_ICMPV6 , IPPROTO_TCP , IPPROTO_UDP ,
61
61
} ;
62
+
63
+ #[ cfg( feature = "all" ) ]
64
+ pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: TCP_KEEPCNT ;
62
65
// Used in `SockAddr`.
63
66
pub ( crate ) use windows_sys:: Win32 :: Networking :: WinSock :: {
64
67
SOCKADDR as sockaddr, SOCKADDR_IN as sockaddr_in, SOCKADDR_IN6 as sockaddr_in6,
@@ -737,17 +740,18 @@ fn into_ms(duration: Option<Duration>) -> u32 {
737
740
}
738
741
739
742
pub ( crate ) fn set_tcp_keepalive ( socket : Socket , keepalive : & TcpKeepalive ) -> io:: Result < ( ) > {
740
- let mut keepalive = tcp_keepalive {
743
+ let mut tcp_keepalive = tcp_keepalive {
741
744
onoff : 1 ,
742
745
keepalivetime : into_ms ( keepalive. time ) ,
743
746
keepaliveinterval : into_ms ( keepalive. interval ) ,
744
747
} ;
748
+
745
749
let mut out = 0 ;
746
750
syscall ! (
747
751
WSAIoctl (
748
752
socket,
749
753
SIO_KEEPALIVE_VALS ,
750
- & mut keepalive as * mut _ as * mut _,
754
+ & mut tcp_keepalive as * mut _ as * mut _,
751
755
size_of:: <tcp_keepalive>( ) as _,
752
756
ptr:: null_mut( ) ,
753
757
0 ,
@@ -757,8 +761,18 @@ pub(crate) fn set_tcp_keepalive(socket: Socket, keepalive: &TcpKeepalive) -> io:
757
761
) ,
758
762
PartialEq :: eq,
759
763
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 ( ( ) )
762
776
}
763
777
764
778
/// Caller must ensure `T` is the correct type for `level` and `optname`.
0 commit comments