@@ -25,7 +25,7 @@ use windows_sys::Win32::Networking::WinSock::{
25
25
self , tcp_keepalive, FIONBIO , IN6_ADDR , IN6_ADDR_0 , INVALID_SOCKET , IN_ADDR , IN_ADDR_0 ,
26
26
POLLERR , POLLHUP , POLLRDNORM , POLLWRNORM , SD_BOTH , SD_RECEIVE , SD_SEND , SIO_KEEPALIVE_VALS ,
27
27
SOCKET_ERROR , WSABUF , WSAEMSGSIZE , WSAESHUTDOWN , WSAPOLLFD , WSAPROTOCOL_INFOW ,
28
- WSA_FLAG_NO_HANDLE_INHERIT , WSA_FLAG_OVERLAPPED ,
28
+ WSA_FLAG_NO_HANDLE_INHERIT , WSA_FLAG_OVERLAPPED , WSA_FLAG_REGISTERED_IO ,
29
29
} ;
30
30
#[ cfg( feature = "all" ) ]
31
31
use windows_sys:: Win32 :: Networking :: WinSock :: {
@@ -136,6 +136,19 @@ impl Type {
136
136
pub ( crate ) const fn _no_inherit ( self ) -> Type {
137
137
Type ( self . 0 | Type :: NO_INHERIT )
138
138
}
139
+
140
+ /// Our custom flag to set `WSA_FLAG_REGISTERED_IO` on socket creation.
141
+ const REGISTERED_IO : c_int = 1 << ( ( size_of :: < c_int > ( ) * 8 ) - 2 ) ; // Second last bit.
142
+
143
+ /// Set `WSA_FLAG_REGISTERED_IO` on the socket.
144
+ #[ cfg( feature = "registered-io" ) ]
145
+ pub const fn registered_io ( self ) -> Type {
146
+ self . _registered_io ( )
147
+ }
148
+
149
+ pub ( crate ) const fn _registered_io ( self ) -> Type {
150
+ Type ( self . 0 | Type :: REGISTERED_IO )
151
+ }
139
152
}
140
153
141
154
impl_debug ! (
@@ -253,13 +266,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
253
266
pub ( crate ) fn socket ( family : c_int , mut ty : c_int , protocol : c_int ) -> io:: Result < RawSocket > {
254
267
init ( ) ;
255
268
256
- // Check if we set our custom flag .
269
+ // Check if we set our custom flags .
257
270
let flags = if ty & Type :: NO_INHERIT != 0 {
258
271
ty = ty & !Type :: NO_INHERIT ;
259
272
WSA_FLAG_NO_HANDLE_INHERIT
260
273
} else {
261
274
0
262
275
} ;
276
+ let flags = if ty & Type :: REGISTERED_IO != 0 {
277
+ ty = ty & !Type :: REGISTERED_IO ;
278
+ flags | WSA_FLAG_REGISTERED_IO
279
+ } else {
280
+ flags
281
+ } ;
263
282
264
283
syscall ! (
265
284
WSASocketW (
0 commit comments