@@ -2,6 +2,7 @@ use std::io;
22use std:: mem:: size_of;
33use std:: net:: { self , SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
44use std:: time:: Duration ;
5+ use std:: convert:: TryInto ;
56use std:: os:: windows:: io:: FromRawSocket ;
67use std:: os:: windows:: raw:: SOCKET as StdSocket ; // winapi uses usize, stdlib uses u32/u64.
78
@@ -12,7 +13,7 @@ use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH;
1213use winapi:: shared:: minwindef:: { BOOL , TRUE , FALSE } ;
1314use winapi:: um:: winsock2:: {
1415 self , closesocket, linger, setsockopt, getsockopt, getsockname, PF_INET , PF_INET6 , SOCKET , SOCKET_ERROR ,
15- SOCK_STREAM , SOL_SOCKET , SO_LINGER , SO_REUSEADDR ,
16+ SOCK_STREAM , SOL_SOCKET , SO_LINGER , SO_REUSEADDR , SO_RCVBUF , SO_SNDBUF ,
1617} ;
1718
1819use crate :: sys:: windows:: net:: { init, new_socket, socket_addr} ;
@@ -149,6 +150,66 @@ pub(crate) fn set_linger(socket: TcpSocket, dur: Option<Duration>) -> io::Result
149150 }
150151}
151152
153+
154+ pub ( crate ) fn set_recv_buffer_size ( socket : TcpSocket , size : u32 ) -> io:: Result < ( ) > {
155+ let size = size. try_into ( ) . ok ( ) . unwrap_or_else ( i32:: max_value) ;
156+ match unsafe { setsockopt (
157+ socket,
158+ SOL_SOCKET ,
159+ SO_RCVBUF ,
160+ & size as * const _ as * const c_char ,
161+ size_of :: < c_int > ( ) as c_int
162+ ) } {
163+ SOCKET_ERROR => Err ( io:: Error :: last_os_error ( ) ) ,
164+ _ => Ok ( ( ) ) ,
165+ }
166+ }
167+
168+ pub ( crate ) fn get_recv_buffer_size ( socket : TcpSocket ) -> io:: Result < u32 > {
169+ let mut optval: c_int = 0 ;
170+ let mut optlen = size_of :: < c_int > ( ) as c_int ;
171+ match unsafe { getsockopt (
172+ socket,
173+ SOL_SOCKET ,
174+ SO_RCVBUF ,
175+ & mut optval as * mut _ as * mut _ ,
176+ & mut optlen as * mut _ ,
177+ ) } {
178+ SOCKET_ERROR => Err ( io:: Error :: last_os_error ( ) ) ,
179+ _ => Ok ( optval as u32 ) ,
180+ }
181+ }
182+
183+ pub ( crate ) fn set_send_buffer_size ( socket : TcpSocket , size : u32 ) -> io:: Result < ( ) > {
184+ let size = size. try_into ( ) . ok ( ) . unwrap_or_else ( i32:: max_value) ;
185+ match unsafe { setsockopt (
186+ socket,
187+ SOL_SOCKET ,
188+ SO_SNDBUF ,
189+ & size as * const _ as * const c_char ,
190+ size_of :: < c_int > ( ) as c_int
191+ ) } {
192+ SOCKET_ERROR => Err ( io:: Error :: last_os_error ( ) ) ,
193+ _ => Ok ( ( ) ) ,
194+ }
195+ }
196+
197+ pub ( crate ) fn get_send_buffer_size ( socket : TcpSocket ) -> io:: Result < u32 > {
198+ let mut optval: c_int = 0 ;
199+ let mut optlen = size_of :: < c_int > ( ) as c_int ;
200+ match unsafe { getsockopt (
201+ socket,
202+ SOL_SOCKET ,
203+ SO_SNDBUF ,
204+ & mut optval as * mut _ as * mut _ ,
205+ & mut optlen as * mut _ ,
206+ ) } {
207+ SOCKET_ERROR => Err ( io:: Error :: last_os_error ( ) ) ,
208+ _ => Ok ( optval as u32 ) ,
209+ }
210+ }
211+
212+
152213pub ( crate ) fn accept ( listener : & net:: TcpListener ) -> io:: Result < ( net:: TcpStream , SocketAddr ) > {
153214 // The non-blocking state of `listener` is inherited. See
154215 // https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept#remarks.
0 commit comments