2 * Unit test suite for winsock functions
4 * Copyright 2002 Martin Wilck
5 * Copyright 2005 Thomas Kho
6 * Copyright 2008 Jeff Zaroyko
7 * Copyright 2017 Dmitry Timoshkov
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #define WIN32_NO_STATUS
36 #include "wine/test.h"
38 #define MAX_CLIENTS 4 /* Max number of clients */
39 #define FIRST_CHAR 'A' /* First character in transferred pattern */
40 #define BIND_SLEEP 10 /* seconds to wait between attempts to bind() */
41 #define BIND_TRIES 6 /* Number of bind() attempts */
42 #define TEST_TIMEOUT 30 /* seconds to wait before killing child threads
43 after server initialization, if something hangs */
45 #define NUM_UDP_PEERS 3 /* Number of UDP sockets to create and test > 1 */
47 #define SERVERIP "127.0.0.1" /* IP to bind to */
48 #define SERVERPORT 9374 /* Port number to bind to */
50 #define wsa_ok(op, cond, msg) \
54 if ( !(cond tmp) ) err = WSAGetLastError(); \
55 ok ( cond tmp, msg, GetCurrentThreadId(), err); \
58 #define make_keepalive(k, enable, time, interval) \
60 k.keepalivetime = time; \
61 k.keepaliveinterval = interval;
63 /* Function pointers */
64 static int (WINAPI
*pWSAPoll
)(WSAPOLLFD
*,ULONG
,INT
);
66 /* Function pointers from ntdll */
67 static DWORD (WINAPI
*pNtClose
)(HANDLE
);
69 /**************** Structs and typedefs ***************/
71 typedef struct thread_info
77 /* Information in the server about open client connections */
78 typedef struct sock_info
81 struct sockaddr_in addr
;
82 struct sockaddr_in peer
;
88 /* Test parameters for both server & client */
89 typedef struct test_params
93 const char *inet_addr
;
100 /* server-specific test parameters */
101 typedef struct server_params
103 test_params
*general
;
108 /* client-specific test parameters */
109 typedef struct client_params
111 test_params
*general
;
116 /* This type combines all information for setting up a test scenario */
117 typedef struct test_setup
121 server_params srv_params
;
123 client_params clt_params
;
126 /* Thread local storage for server */
127 typedef struct server_memory
130 struct sockaddr_in addr
;
131 sock_info sock
[MAX_CLIENTS
];
134 /* Thread local storage for client */
135 typedef struct client_memory
138 struct sockaddr_in addr
;
143 /* SelectReadThread thread parameters */
144 typedef struct select_thread_params
148 } select_thread_params
;
150 /**************** Static variables ***************/
152 static DWORD tls
; /* Thread local storage index */
153 static HANDLE thread
[1+MAX_CLIENTS
];
154 static DWORD thread_id
[1+MAX_CLIENTS
];
155 static HANDLE server_ready
;
156 static HANDLE client_ready
[MAX_CLIENTS
];
157 static int client_id
;
158 static GUID WSARecvMsg_GUID
= WSAID_WSARECVMSG
;
160 /**************** General utility functions ***************/
162 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
);
163 static SOCKET
setup_connector_socket(const struct sockaddr_in
*addr
, int len
, BOOL nonblock
);
165 static void tcp_socketpair_flags(SOCKET
*src
, SOCKET
*dst
, DWORD flags
)
167 SOCKET server
= INVALID_SOCKET
;
168 struct sockaddr_in addr
;
171 *src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, flags
);
172 ok(*src
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
174 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, flags
);
175 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
177 memset(&addr
, 0, sizeof(addr
));
178 addr
.sin_family
= AF_INET
;
179 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
180 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
181 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
184 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
185 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
187 ret
= listen(server
, 1);
188 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
190 ret
= connect(*src
, (struct sockaddr
*)&addr
, sizeof(addr
));
191 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
194 *dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
195 ok(*dst
!= INVALID_SOCKET
, "failed to accept socket, error %u\n", WSAGetLastError());
200 static void tcp_socketpair(SOCKET
*src
, SOCKET
*dst
)
202 tcp_socketpair_flags(src
, dst
, WSA_FLAG_OVERLAPPED
);
205 #define check_poll(a, b) check_poll_(__LINE__, a, POLLRDNORM | POLLRDBAND | POLLWRNORM, b, FALSE)
206 #define check_poll_todo(a, b) check_poll_(__LINE__, a, POLLRDNORM | POLLRDBAND | POLLWRNORM, b, TRUE)
207 #define check_poll_mask(a, b, c) check_poll_(__LINE__, a, b, c, FALSE)
208 #define check_poll_mask_todo(a, b, c) check_poll_(__LINE__, a, b, c, TRUE)
209 static void check_poll_(int line
, SOCKET s
, short mask
, short expect
, BOOL todo
)
215 pollfd
.events
= mask
;
216 pollfd
.revents
= 0xdead;
217 ret
= pWSAPoll(&pollfd
, 1, 1000);
218 ok_(__FILE__
, line
)(ret
== (pollfd
.revents
? 1 : 0), "WSAPoll() returned %d\n", ret
);
219 todo_wine_if (todo
) ok_(__FILE__
, line
)(pollfd
.revents
== expect
, "got wrong events %#x\n", pollfd
.revents
);
222 static void set_so_opentype ( BOOL overlapped
)
224 int optval
= !overlapped
, newval
, len
= sizeof (int);
226 ok ( setsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
227 (LPVOID
) &optval
, sizeof (optval
) ) == 0,
228 "setting SO_OPENTYPE failed\n" );
229 ok ( getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
230 (LPVOID
) &newval
, &len
) == 0,
231 "getting SO_OPENTYPE failed\n" );
232 ok ( optval
== newval
, "failed to set SO_OPENTYPE\n" );
235 static int set_blocking ( SOCKET s
, BOOL blocking
)
237 u_long val
= !blocking
;
238 return ioctlsocket ( s
, FIONBIO
, &val
);
241 static void fill_buffer ( char *buf
, int chunk_size
, int n_chunks
)
244 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
245 memset ( p
, c
, chunk_size
);
248 static int test_buffer ( char *buf
, int chunk_size
, int n_chunks
)
252 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
254 for ( i
= 0; i
< chunk_size
; i
++ )
255 if ( p
[i
] != c
) return i
;
261 * This routine is called when a client / server does not expect any more data,
262 * but needs to acknowledge the closing of the connection (by reading 0 bytes).
264 static void read_zero_bytes ( SOCKET s
)
268 while ( ( tmp
= recv ( s
, buf
, 256, 0 ) ) > 0 )
270 ok ( n
<= 0, "garbage data received: %d bytes\n", n
);
273 static int do_synchronous_send ( SOCKET s
, char *buf
, int buflen
, int flags
, int sendlen
)
275 char* last
= buf
+ buflen
, *p
;
277 for ( p
= buf
; n
> 0 && p
< last
; )
279 n
= send ( s
, p
, min ( sendlen
, last
- p
), flags
);
282 wsa_ok ( n
, 0 <=, "do_synchronous_send (%x): error %d\n" );
286 static int do_synchronous_recv ( SOCKET s
, char *buf
, int buflen
, int flags
, int recvlen
)
288 char* last
= buf
+ buflen
, *p
;
290 for ( p
= buf
; n
> 0 && p
< last
; )
292 n
= recv ( s
, p
, min ( recvlen
, last
- p
), flags
);
295 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
299 static int do_synchronous_recvfrom ( SOCKET s
, char *buf
, int buflen
, int flags
, struct sockaddr
*from
, int *fromlen
, int recvlen
)
301 char* last
= buf
+ buflen
, *p
;
303 for ( p
= buf
; n
> 0 && p
< last
; )
305 n
= recvfrom ( s
, p
, min ( recvlen
, last
- p
), flags
, from
, fromlen
);
308 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
313 * Call this routine right after thread startup.
314 * SO_OPENTYPE must by 0, regardless what the server did.
316 static void check_so_opentype (void)
320 getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
, (LPVOID
) &tmp
, &len
);
321 ok ( tmp
== 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp
);
324 /**************** Server utility functions ***************/
327 * Even if we have closed our server socket cleanly,
328 * the OS may mark the address "in use" for some time -
329 * this happens with native Linux apps, too.
331 static void do_bind ( SOCKET s
, struct sockaddr
* addr
, int addrlen
)
333 int err
, wsaerr
= 0, n_try
= BIND_TRIES
;
335 while ( ( err
= bind ( s
, addr
, addrlen
) ) != 0 &&
336 ( wsaerr
= WSAGetLastError () ) == WSAEADDRINUSE
&&
339 trace ( "address in use, waiting ...\n" );
340 Sleep ( 1000 * BIND_SLEEP
);
342 ok ( err
== 0, "failed to bind: %d\n", wsaerr
);
345 static void server_start ( server_params
*par
)
348 test_params
*gen
= par
->general
;
349 server_memory
*mem
= LocalAlloc ( LPTR
, sizeof ( server_memory
) );
351 TlsSetValue ( tls
, mem
);
352 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
353 NULL
, 0, par
->sock_flags
);
354 ok ( mem
->s
!= INVALID_SOCKET
, "Server: WSASocket failed\n" );
356 mem
->addr
.sin_family
= AF_INET
;
357 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
358 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
360 for (i
= 0; i
< MAX_CLIENTS
; i
++)
362 mem
->sock
[i
].s
= INVALID_SOCKET
;
363 mem
->sock
[i
].buf
= LocalAlloc ( LPTR
, gen
->n_chunks
* gen
->chunk_size
);
364 mem
->sock
[i
].n_recvd
= 0;
365 mem
->sock
[i
].n_sent
= 0;
368 if ( gen
->sock_type
== SOCK_STREAM
)
369 do_bind ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof (mem
->addr
) );
372 static void server_stop (void)
375 server_memory
*mem
= TlsGetValue ( tls
);
377 for (i
= 0; i
< MAX_CLIENTS
; i
++ )
379 LocalFree ( mem
->sock
[i
].buf
);
380 if ( mem
->sock
[i
].s
!= INVALID_SOCKET
)
381 closesocket ( mem
->sock
[i
].s
);
383 ok ( closesocket ( mem
->s
) == 0, "closesocket failed\n" );
385 ExitThread ( GetCurrentThreadId () );
388 /**************** Client utilitiy functions ***************/
390 static void client_start ( client_params
*par
)
392 test_params
*gen
= par
->general
;
393 client_memory
*mem
= LocalAlloc (LPTR
, sizeof (client_memory
));
395 TlsSetValue ( tls
, mem
);
397 WaitForSingleObject ( server_ready
, INFINITE
);
399 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
400 NULL
, 0, par
->sock_flags
);
402 mem
->addr
.sin_family
= AF_INET
;
403 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
404 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
406 ok ( mem
->s
!= INVALID_SOCKET
, "Client: WSASocket failed\n" );
408 mem
->send_buf
= LocalAlloc ( LPTR
, 2 * gen
->n_chunks
* gen
->chunk_size
);
409 mem
->recv_buf
= mem
->send_buf
+ gen
->n_chunks
* gen
->chunk_size
;
410 fill_buffer ( mem
->send_buf
, gen
->chunk_size
, gen
->n_chunks
);
412 SetEvent ( client_ready
[client_id
] );
413 /* Wait for the other clients to come up */
414 WaitForMultipleObjects ( min ( gen
->n_clients
, MAX_CLIENTS
), client_ready
, TRUE
, INFINITE
);
417 static void client_stop (void)
419 client_memory
*mem
= TlsGetValue ( tls
);
420 wsa_ok ( closesocket ( mem
->s
), 0 ==, "closesocket error (%x): %d\n" );
421 LocalFree ( mem
->send_buf
);
426 /**************** Servers ***************/
429 * simple_server: A very basic server doing synchronous IO.
431 static VOID WINAPI
simple_server ( server_params
*par
)
433 test_params
*gen
= par
->general
;
435 int pos
, n_recvd
, n_sent
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
436 id
= GetCurrentThreadId();
438 set_so_opentype ( FALSE
); /* non-overlapped */
439 server_start ( par
);
440 mem
= TlsGetValue ( tls
);
442 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
443 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "simple_server (%x): listen failed: %d\n");
445 SetEvent ( server_ready
); /* notify clients */
447 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
449 /* accept a single connection */
450 tmp
= sizeof ( mem
->sock
[0].peer
);
451 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
452 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "simple_server (%x): accept failed: %d\n" );
454 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
455 "simple_server (%x): strange peer address\n", id
);
457 /* Receive data & check it */
458 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
459 ok ( n_recvd
== n_expected
,
460 "simple_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
461 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
462 ok ( pos
== -1, "simple_server (%x): test pattern error: %d\n", id
, pos
);
465 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
466 ok ( n_sent
== n_expected
,
467 "simple_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
470 read_zero_bytes ( mem
->sock
[0].s
);
471 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "simple_server (%x): closesocket error: %d\n" );
472 mem
->sock
[0].s
= INVALID_SOCKET
;
479 * oob_server: A very basic server receiving out-of-band data.
481 static VOID WINAPI
oob_server ( server_params
*par
)
483 test_params
*gen
= par
->general
;
486 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
,
487 id
= GetCurrentThreadId();
489 set_so_opentype ( FALSE
); /* non-overlapped */
490 server_start ( par
);
491 mem
= TlsGetValue ( tls
);
493 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n");
494 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "oob_server (%x): listen failed: %d\n");
496 SetEvent ( server_ready
); /* notify clients */
498 /* accept a single connection */
499 tmp
= sizeof ( mem
->sock
[0].peer
);
500 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
501 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "oob_server (%x): accept failed: %d\n" );
503 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
504 "oob_server (%x): strange peer address\n", id
);
506 /* check initial atmark state */
507 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
508 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
510 /* Receive normal data */
511 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
512 ok ( n_recvd
== n_expected
,
513 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
514 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
515 ok ( pos
== -1, "oob_server (%x): test pattern error: %d\n", id
, pos
);
517 /* check atmark state */
518 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
519 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
522 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
523 ok ( n_sent
== n_expected
,
524 "oob_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
526 /* Receive a part of the out-of-band data and print atmark state */
527 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, 8, 0, par
->buflen
);
529 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, 8 );
532 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
534 /* Receive the rest of the out-of-band data and check atmark state */
535 do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
537 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
538 todo_wine
ok ( atmark
== 0, "oob_server (%x): not at the OOB mark: %i\n", id
, atmark
);
541 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "oob_server (%x): closesocket error: %d\n" );
542 mem
->sock
[0].s
= INVALID_SOCKET
;
548 * select_server: A non-blocking server.
550 static VOID WINAPI
select_server ( server_params
*par
)
552 test_params
*gen
= par
->general
;
554 int n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
555 id
= GetCurrentThreadId(), n_connections
= 0, n_sent
, n_recvd
,
556 n_set
, delta
, n_ready
;
557 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
558 fd_set fds_recv
, fds_send
, fds_openrecv
, fds_opensend
;
560 set_so_opentype ( FALSE
); /* non-overlapped */
561 server_start ( par
);
562 mem
= TlsGetValue ( tls
);
564 wsa_ok ( set_blocking ( mem
->s
, FALSE
), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
565 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "select_server (%x): listen failed: %d\n");
567 SetEvent ( server_ready
); /* notify clients */
569 FD_ZERO ( &fds_openrecv
);
570 FD_ZERO ( &fds_recv
);
571 FD_ZERO ( &fds_send
);
572 FD_ZERO ( &fds_opensend
);
574 FD_SET ( mem
->s
, &fds_openrecv
);
578 fds_recv
= fds_openrecv
;
579 fds_send
= fds_opensend
;
583 wsa_ok ( ( n_ready
= select ( 0, &fds_recv
, &fds_send
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
584 "select_server (%x): select() failed: %d\n" );
586 /* check for incoming requests */
587 if ( FD_ISSET ( mem
->s
, &fds_recv
) ) {
590 /* accept a single connection */
591 tmp
= sizeof ( mem
->sock
[n_connections
].peer
);
592 mem
->sock
[n_connections
].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[n_connections
].peer
, &tmp
);
593 wsa_ok ( mem
->sock
[n_connections
].s
, INVALID_SOCKET
!=, "select_server (%x): accept() failed: %d\n" );
595 ok ( mem
->sock
[n_connections
].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
596 "select_server (%x): strange peer address\n", id
);
598 /* add to list of open connections */
599 FD_SET ( mem
->sock
[n_connections
].s
, &fds_openrecv
);
600 FD_SET ( mem
->sock
[n_connections
].s
, &fds_opensend
);
605 /* handle open requests */
607 for ( i
= 0; i
< n_connections
; i
++ )
609 if ( FD_ISSET( mem
->sock
[i
].s
, &fds_recv
) ) {
612 if ( mem
->sock
[i
].n_recvd
< n_expected
) {
613 /* Receive data & check it */
614 n_recvd
= recv ( mem
->sock
[i
].s
, mem
->sock
[i
].buf
+ mem
->sock
[i
].n_recvd
, min ( n_expected
- mem
->sock
[i
].n_recvd
, par
->buflen
), 0 );
615 ok ( n_recvd
!= SOCKET_ERROR
, "select_server (%x): error in recv(): %d\n", id
, WSAGetLastError() );
616 mem
->sock
[i
].n_recvd
+= n_recvd
;
618 if ( mem
->sock
[i
].n_recvd
== n_expected
) {
619 int pos
= test_buffer ( mem
->sock
[i
].buf
, gen
->chunk_size
, gen
->n_chunks
);
620 ok ( pos
== -1, "select_server (%x): test pattern error: %d\n", id
, pos
);
621 FD_CLR ( mem
->sock
[i
].s
, &fds_openrecv
);
624 ok ( mem
->sock
[i
].n_recvd
<= n_expected
, "select_server (%x): received too many bytes: %d\n", id
, mem
->sock
[i
].n_recvd
);
628 /* only echo back what we've received */
629 delta
= mem
->sock
[i
].n_recvd
- mem
->sock
[i
].n_sent
;
631 if ( FD_ISSET ( mem
->sock
[i
].s
, &fds_send
) ) {
634 if ( ( delta
> 0 ) && ( mem
->sock
[i
].n_sent
< n_expected
) ) {
636 n_sent
= send ( mem
->sock
[i
].s
, mem
->sock
[i
].buf
+ mem
->sock
[i
].n_sent
, min ( delta
, par
->buflen
), 0 );
637 ok ( n_sent
!= SOCKET_ERROR
, "select_server (%x): error in send(): %d\n", id
, WSAGetLastError() );
638 mem
->sock
[i
].n_sent
+= n_sent
;
640 if ( mem
->sock
[i
].n_sent
== n_expected
) {
641 FD_CLR ( mem
->sock
[i
].s
, &fds_opensend
);
644 ok ( mem
->sock
[i
].n_sent
<= n_expected
, "select_server (%x): sent too many bytes: %d\n", id
, mem
->sock
[i
].n_sent
);
649 /* check that select returned the correct number of ready sockets */
650 ok ( ( n_set
== n_ready
), "select_server (%x): select() returns wrong number of ready sockets\n", id
);
652 /* check if all clients are done */
653 if ( ( fds_opensend
.fd_count
== 0 )
654 && ( fds_openrecv
.fd_count
== 1 ) /* initial socket that accepts clients */
655 && ( n_connections
== min ( gen
->n_clients
, MAX_CLIENTS
) ) ) {
660 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
663 read_zero_bytes ( mem
->sock
[i
].s
);
664 wsa_ok ( closesocket ( mem
->sock
[i
].s
), 0 ==, "select_server (%x): closesocket error: %d\n" );
665 mem
->sock
[i
].s
= INVALID_SOCKET
;
671 /**************** Clients ***************/
674 * simple_client: A very basic client doing synchronous IO.
676 static VOID WINAPI
simple_client ( client_params
*par
)
678 test_params
*gen
= par
->general
;
680 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
682 id
= GetCurrentThreadId();
683 /* wait here because we want to call set_so_opentype before creating a socket */
684 WaitForSingleObject ( server_ready
, INFINITE
);
686 check_so_opentype ();
687 set_so_opentype ( FALSE
); /* non-overlapped */
688 client_start ( par
);
689 mem
= TlsGetValue ( tls
);
692 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
693 0 ==, "simple_client (%x): connect error: %d\n" );
694 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
695 "simple_client (%x): failed to set blocking mode\n", id
);
697 /* send data to server */
698 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
699 ok ( n_sent
== n_expected
,
700 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
702 /* shutdown send direction */
703 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
705 /* Receive data echoed back & check it */
706 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
707 ok ( n_recvd
== n_expected
,
708 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
711 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
712 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
715 read_zero_bytes ( mem
->s
);
720 * oob_client: A very basic client sending out-of-band data.
722 static VOID WINAPI
oob_client ( client_params
*par
)
724 test_params
*gen
= par
->general
;
726 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
728 id
= GetCurrentThreadId();
729 /* wait here because we want to call set_so_opentype before creating a socket */
730 WaitForSingleObject ( server_ready
, INFINITE
);
732 check_so_opentype ();
733 set_so_opentype ( FALSE
); /* non-overlapped */
734 client_start ( par
);
735 mem
= TlsGetValue ( tls
);
738 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
739 0 ==, "oob_client (%x): connect error: %d\n" );
740 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
741 "oob_client (%x): failed to set blocking mode\n", id
);
743 /* send data to server */
744 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
745 ok ( n_sent
== n_expected
,
746 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
748 /* Receive data echoed back & check it */
749 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
750 ok ( n_recvd
== n_expected
,
751 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
752 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
753 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
755 /* send out-of-band data to server */
756 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, MSG_OOB
, par
->buflen
);
757 ok ( n_sent
== n_expected
,
758 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
760 /* shutdown send direction */
761 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
764 read_zero_bytes ( mem
->s
);
769 * simple_mixed_client: mixing send and recvfrom
771 static VOID WINAPI
simple_mixed_client ( client_params
*par
)
773 test_params
*gen
= par
->general
;
775 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
776 int fromLen
= sizeof(mem
->addr
);
777 struct sockaddr test
;
779 id
= GetCurrentThreadId();
780 /* wait here because we want to call set_so_opentype before creating a socket */
781 WaitForSingleObject ( server_ready
, INFINITE
);
783 check_so_opentype ();
784 set_so_opentype ( FALSE
); /* non-overlapped */
785 client_start ( par
);
786 mem
= TlsGetValue ( tls
);
789 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
790 0 ==, "simple_client (%x): connect error: %d\n" );
791 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
792 "simple_client (%x): failed to set blocking mode\n", id
);
794 /* send data to server */
795 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
796 ok ( n_sent
== n_expected
,
797 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
799 /* shutdown send direction */
800 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
802 /* this shouldn't change, since lpFrom, is not updated on
803 connection oriented sockets - exposed by bug 11640
805 ((struct sockaddr_in
*)&test
)->sin_addr
.s_addr
= inet_addr("0.0.0.0");
807 /* Receive data echoed back & check it */
808 n_recvd
= do_synchronous_recvfrom ( mem
->s
,
812 (struct sockaddr
*)&test
,
815 ok ( n_recvd
== n_expected
,
816 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
818 /* check that lpFrom was not updated */
821 inet_ntoa(((struct sockaddr_in
*)&test
)->sin_addr
),
822 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
825 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
826 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
829 read_zero_bytes ( mem
->s
);
834 * event_client: An event-driven client
836 static void WINAPI
event_client ( client_params
*par
)
838 test_params
*gen
= par
->general
;
840 int id
= GetCurrentThreadId(), n_expected
= gen
->n_chunks
* gen
->chunk_size
,
843 WSANETWORKEVENTS wsa_events
;
844 char *send_last
, *recv_last
, *send_p
, *recv_p
;
845 LONG mask
= FD_READ
| FD_WRITE
| FD_CLOSE
;
847 client_start ( par
);
849 mem
= TlsGetValue ( tls
);
851 /* Prepare event notification for connect, makes socket nonblocking */
852 event
= WSACreateEvent ();
853 WSAEventSelect ( mem
->s
, event
, FD_CONNECT
);
854 tmp
= connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) );
856 err
= WSAGetLastError ();
857 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): connect error: %d\n", id
, err
);
858 tmp
= WaitForSingleObject ( event
, INFINITE
);
859 ok ( tmp
== WAIT_OBJECT_0
, "event_client (%x): wait for connect event failed: %d\n", id
, tmp
);
860 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
861 ok ( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
862 err
= wsa_events
.iErrorCode
[ FD_CONNECT_BIT
];
863 ok ( err
== 0, "event_client (%x): connect error: %d\n", id
, err
);
867 WSAEventSelect ( mem
->s
, event
, mask
);
869 recv_p
= mem
->recv_buf
;
870 recv_last
= mem
->recv_buf
+ n_expected
;
871 send_p
= mem
->send_buf
;
872 send_last
= mem
->send_buf
+ n_expected
;
876 err
= WaitForSingleObject ( event
, INFINITE
);
877 ok ( err
== WAIT_OBJECT_0
, "event_client (%x): wait failed\n", id
);
879 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
880 ok( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
882 if ( wsa_events
.lNetworkEvents
& FD_WRITE
)
884 err
= wsa_events
.iErrorCode
[ FD_WRITE_BIT
];
885 ok ( err
== 0, "event_client (%x): FD_WRITE error code: %d\n", id
, err
);
890 n
= send ( mem
->s
, send_p
, min ( send_last
- send_p
, par
->buflen
), 0 );
893 err
= WSAGetLastError ();
894 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): send error: %d\n", id
, err
);
899 while ( n
>= 0 && send_p
< send_last
);
901 if ( send_p
== send_last
)
903 shutdown ( mem
->s
, SD_SEND
);
905 WSAEventSelect ( mem
->s
, event
, mask
);
908 if ( wsa_events
.lNetworkEvents
& FD_READ
)
910 err
= wsa_events
.iErrorCode
[ FD_READ_BIT
];
911 ok ( err
== 0, "event_client (%x): FD_READ error code: %d\n", id
, err
);
912 if ( err
!= 0 ) break;
914 /* First read must succeed */
915 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
916 wsa_ok ( n
, 0 <=, "event_client (%x): recv error: %d\n" );
920 if ( recv_p
== recv_last
)
923 WSAEventSelect ( mem
->s
, event
, mask
);
926 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
927 ok(n
>= 0 || WSAGetLastError() == WSAEWOULDBLOCK
,
928 "event_client (%x): got error %u\n", id
, WSAGetLastError());
932 if ( wsa_events
.lNetworkEvents
& FD_CLOSE
)
934 err
= wsa_events
.iErrorCode
[ FD_CLOSE_BIT
];
935 ok ( err
== 0, "event_client (%x): FD_CLOSE error code: %d\n", id
, err
);
940 n
= send_p
- mem
->send_buf
;
941 ok ( send_p
== send_last
,
942 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n
, n_expected
);
943 n
= recv_p
- mem
->recv_buf
;
944 ok ( recv_p
== recv_last
,
945 "simple_client (%x): received less data than expected: %d of %d\n", id
, n
, n_expected
);
946 n
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
947 ok ( n
== -1, "event_client (%x): test pattern error: %d\n", id
, n
);
950 WSACloseEvent ( event
);
954 /* Tests for WSAStartup */
955 static void test_WithoutWSAStartup(void)
959 WSASetLastError(0xdeadbeef);
960 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
, "WSASocketA should have failed\n");
961 err
= WSAGetLastError();
962 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
964 WSASetLastError(0xdeadbeef);
965 ok(gethostbyname("localhost") == NULL
, "gethostbyname() succeeded unexpectedly\n");
966 err
= WSAGetLastError();
967 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
970 static void test_WithWSAStartup(void)
973 WORD version
= MAKEWORD( 2, 2 );
974 INT res
, socks
, i
, j
;
979 SOCKET src
, dst
, dup_src
, dup_dst
;
983 res
= WSAStartup( version
, &data
);
984 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
986 ptr
= gethostbyname("localhost");
987 ok(ptr
!= NULL
, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
989 /* Alloc some sockets to check if they are destroyed on WSACleanup */
990 for (socks
= 0; socks
< ARRAY_SIZE(pairs
); socks
++)
992 WSAPROTOCOL_INFOA info
;
993 tcp_socketpair(&pairs
[socks
].src
, &pairs
[socks
].dst
);
995 memset(&info
, 0, sizeof(info
));
996 ok(!WSADuplicateSocketA(pairs
[socks
].src
, GetCurrentProcessId(), &info
),
997 "WSADuplicateSocketA should have worked\n");
998 pairs
[socks
].dup_src
= WSASocketA(0, 0, 0, &info
, 0, 0);
999 ok(pairs
[socks
].dup_src
!= SOCKET_ERROR
, "expected != -1\n");
1001 memset(&info
, 0, sizeof(info
));
1002 ok(!WSADuplicateSocketA(pairs
[socks
].dst
, GetCurrentProcessId(), &info
),
1003 "WSADuplicateSocketA should have worked\n");
1004 pairs
[socks
].dup_dst
= WSASocketA(0, 0, 0, &info
, 0, 0);
1005 ok(pairs
[socks
].dup_dst
!= SOCKET_ERROR
, "expected != -1\n");
1008 res
= send(pairs
[0].src
, "TEST", 4, 0);
1009 ok(res
== 4, "send failed with error %d\n", WSAGetLastError());
1013 res
= WSAStartup( version
, &data
);
1014 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1016 /* show that sockets are destroyed automatically after WSACleanup */
1017 SetLastError(0xdeadbeef);
1018 res
= send(pairs
[0].src
, "TEST", 4, 0);
1019 error
= WSAGetLastError();
1020 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1021 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1023 SetLastError(0xdeadbeef);
1024 res
= send(pairs
[0].dst
, "TEST", 4, 0);
1025 error
= WSAGetLastError();
1026 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1027 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1029 /* Check that all sockets were destroyed */
1030 for (i
= 0; i
< socks
; i
++)
1032 for (j
= 0; j
< 4; j
++)
1034 struct sockaddr_in saddr
;
1035 int size
= sizeof(saddr
);
1038 case 0: sock
= pairs
[i
].src
; break;
1039 case 1: sock
= pairs
[i
].dup_src
; break;
1040 case 2: sock
= pairs
[i
].dst
; break;
1041 case 3: sock
= pairs
[i
].dup_dst
; break;
1044 SetLastError(0xdeadbeef);
1045 res
= getsockname(sock
, (struct sockaddr
*)&saddr
, &size
);
1046 error
= WSAGetLastError();
1047 ok(res
== SOCKET_ERROR
, "Test[%d]: getsockname should have failed\n", i
);
1048 if (res
== SOCKET_ERROR
)
1049 ok(error
== WSAENOTSOCK
, "Test[%d]: expected 10038, got %d\n", i
, error
);
1053 /* While wine is not fixed, close all sockets manually */
1054 for (i
= 0; i
< socks
; i
++)
1056 closesocket(pairs
[i
].src
);
1057 closesocket(pairs
[i
].dst
);
1058 closesocket(pairs
[i
].dup_src
);
1059 closesocket(pairs
[i
].dup_dst
);
1063 ok(res
== 0, "expected 0, got %d\n", res
);
1064 WSASetLastError(0xdeadbeef);
1066 error
= WSAGetLastError();
1067 ok ( res
== SOCKET_ERROR
&& error
== WSANOTINITIALISED
,
1068 "WSACleanup returned %d WSAGetLastError is %d\n", res
, error
);
1071 /**************** Main program utility functions ***************/
1073 static void Init (void)
1075 WORD ver
= MAKEWORD (2, 2);
1077 HMODULE hws2_32
= GetModuleHandleA("ws2_32.dll"), ntdll
;
1079 pWSAPoll
= (void *)GetProcAddress(hws2_32
, "WSAPoll");
1081 ntdll
= LoadLibraryA("ntdll.dll");
1083 pNtClose
= (void *)GetProcAddress(ntdll
, "NtClose");
1085 ok ( WSAStartup ( ver
, &data
) == 0, "WSAStartup failed\n" );
1089 static void Exit (void)
1094 err
= WSAGetLastError();
1095 ok ( ret
== 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret
, err
);
1098 static void StartServer (LPTHREAD_START_ROUTINE routine
,
1099 test_params
*general
, server_params
*par
)
1101 par
->general
= general
;
1102 thread
[0] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[0] );
1103 ok ( thread
[0] != NULL
, "Failed to create server thread\n" );
1106 static void StartClients (LPTHREAD_START_ROUTINE routine
,
1107 test_params
*general
, client_params
*par
)
1110 par
->general
= general
;
1111 for ( i
= 1; i
<= min ( general
->n_clients
, MAX_CLIENTS
); i
++ )
1114 thread
[i
] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[i
] );
1115 ok ( thread
[i
] != NULL
, "Failed to create client thread\n" );
1116 /* Make sure the client is up and running */
1117 WaitForSingleObject ( client_ready
[client_id
], INFINITE
);
1121 static void do_test( test_setup
*test
)
1123 DWORD i
, n
= min (test
->general
.n_clients
, MAX_CLIENTS
);
1126 server_ready
= CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1127 for (i
= 0; i
<= n
; i
++)
1128 client_ready
[i
] = CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1130 StartServer ( test
->srv
, &test
->general
, &test
->srv_params
);
1131 StartClients ( test
->clt
, &test
->general
, &test
->clt_params
);
1132 WaitForSingleObject ( server_ready
, INFINITE
);
1134 wait
= WaitForMultipleObjects ( 1 + n
, thread
, TRUE
, 1000 * TEST_TIMEOUT
);
1135 ok(!wait
, "wait failed, error %u\n", wait
);
1137 CloseHandle ( server_ready
);
1138 for (i
= 0; i
<= n
; i
++)
1139 CloseHandle ( client_ready
[i
] );
1142 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1143 /* optname = SO_LINGER */
1144 static const LINGER linger_testvals
[] = {
1151 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1152 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1153 bug in the linux kernel (fixed in 2.6.8) */
1154 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1156 static void test_set_getsockopt(void)
1159 int i
, err
, lasterr
;
1163 WSAPROTOCOL_INFOA infoA
;
1164 WSAPROTOCOL_INFOW infoW
;
1165 char providername
[WSAPROTOCOL_LEN
+ 1];
1169 int family
, type
, proto
;
1171 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
1172 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
1173 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
1174 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
}
1182 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1183 ok(s
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1184 if( s
== INVALID_SOCKET
) return;
1186 timeout
= SOCKTIMEOUT1
;
1187 size
= sizeof(timeout
);
1188 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1190 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1191 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1192 ok( timeout
== SOCKTIMEOUT1
, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1195 size
= sizeof(timeout
);
1196 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1198 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1199 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1200 ok( timeout
== 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1203 timeout
= SOCKTIMEOUT2
; /* 997 seconds. See remark above */
1204 size
= sizeof(timeout
);
1205 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, size
);
1207 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, &size
);
1208 ok( !err
, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1209 ok( timeout
== SOCKTIMEOUT2
, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout
);
1213 size
= sizeof(value
);
1214 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, size
);
1215 ok( !err
, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1217 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, &size
);
1218 ok( !err
, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1219 ok( value
== 4096, "expected 4096, got %u\n", value
);
1223 size
= sizeof(value
);
1224 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, size
);
1225 ok( !err
, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1227 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1228 ok( !err
, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1229 ok( value
== 4096, "expected 4096, got %u\n", value
);
1232 for( i
= 0; i
< ARRAY_SIZE(linger_testvals
);i
++) {
1233 size
= sizeof(lingval
);
1234 lingval
= linger_testvals
[i
];
1235 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *)&lingval
, size
);
1236 ok(!err
, "Test %u: failed to set SO_LINGER, error %u\n", i
, WSAGetLastError());
1237 err
= getsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *)&lingval
, &size
);
1238 ok(!err
, "Test %u: failed to get SO_LINGER, error %u\n", i
, WSAGetLastError());
1239 ok(!lingval
.l_onoff
== !linger_testvals
[i
].l_onoff
, "Test %u: expected %d, got %d\n",
1240 i
, linger_testvals
[i
].l_onoff
, lingval
.l_onoff
);
1241 if (lingval
.l_onoff
)
1242 ok(lingval
.l_linger
== linger_testvals
[i
].l_linger
, "Test %u: expected %d, got %d\n",
1243 i
, linger_testvals
[i
].l_linger
, lingval
.l_linger
);
1246 size
= sizeof(lingval
);
1247 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, size
);
1248 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1249 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1250 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, 0);
1251 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1252 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1254 size
= sizeof(BOOL
);
1255 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, size
);
1256 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1257 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1258 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, 0);
1259 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1260 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1262 /* Test for erroneously passing a value instead of a pointer as optval */
1263 size
= sizeof(char);
1264 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTROUTE
, (char *)1, size
);
1265 ok(err
== SOCKET_ERROR
, "setsockopt with optval being a value passed "
1266 "instead of failing.\n");
1267 lasterr
= WSAGetLastError();
1268 ok(lasterr
== WSAEFAULT
, "setsockopt with optval being a value "
1269 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1270 lasterr
, WSAEFAULT
);
1272 /* SO_RCVTIMEO with invalid values for level */
1273 size
= sizeof(timeout
);
1274 timeout
= SOCKTIMEOUT1
;
1275 SetLastError(0xdeadbeef);
1276 err
= setsockopt(s
, 0xffffffff, SO_RCVTIMEO
, (char *) &timeout
, size
);
1277 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1278 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1279 err
, WSAGetLastError());
1281 timeout
= SOCKTIMEOUT1
;
1282 SetLastError(0xdeadbeef);
1283 err
= setsockopt(s
, 0x00008000, SO_RCVTIMEO
, (char *) &timeout
, size
);
1284 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1285 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1286 err
, WSAGetLastError());
1288 /* Test SO_ERROR set/get */
1289 SetLastError(0xdeadbeef);
1291 err
= setsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, size
);
1293 ok( !err
&& !WSAGetLastError(),
1294 "got %d with %d (expected 0 with 0)\n",
1295 err
, WSAGetLastError());
1297 SetLastError(0xdeadbeef);
1299 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1300 ok( !err
&& !WSAGetLastError(),
1301 "got %d with %d (expected 0 with 0)\n",
1302 err
, WSAGetLastError());
1304 ok (i
== 1234, "got %d (expected 1234)\n", i
);
1306 /* Test invalid optlen */
1307 SetLastError(0xdeadbeef);
1309 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1310 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEFAULT
),
1311 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1312 err
, WSAGetLastError());
1315 /* Test with the closed socket */
1316 SetLastError(0xdeadbeef);
1319 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1320 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOTSOCK
),
1321 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1322 err
, WSAGetLastError());
1323 ok (i
== 1234, "expected 1234, got %d\n", i
);
1325 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1326 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
1327 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1330 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &i
, size
);
1333 for (i
= 0; i
< 4; i
++)
1336 const int tests
[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1337 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &tests
[i
], i
+ 1);
1338 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1339 err
= getsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &k
, &size
);
1340 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1341 j
= i
!= 3 ? tests
[i
] & ((1 << (i
+ 1) * 8) - 1) : tests
[i
];
1342 ok(k
== j
, "Test [%d] Expected 0x%x, got 0x%x\n", i
, j
, k
);
1346 win_skip("IP_MULTICAST_TTL is unsupported\n");
1349 /* test SO_PROTOCOL_INFOA invalid parameters */
1350 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1351 "getsockopt should have failed\n");
1352 err
= WSAGetLastError();
1353 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1354 size
= sizeof(WSAPROTOCOL_INFOA
);
1355 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1356 "getsockopt should have failed\n");
1357 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1358 err
= WSAGetLastError();
1359 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1360 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1361 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1362 "getsockopt should have failed\n");
1363 err
= WSAGetLastError();
1364 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1365 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, NULL
),
1366 "getsockopt should have failed\n");
1367 err
= WSAGetLastError();
1368 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1369 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, &size
),
1370 "getsockopt should have failed\n");
1371 err
= WSAGetLastError();
1372 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1373 size
= sizeof(WSAPROTOCOL_INFOA
) / 2;
1374 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1375 "getsockopt should have failed\n");
1376 err
= WSAGetLastError();
1377 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1378 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1379 size
= sizeof(WSAPROTOCOL_INFOA
) * 2;
1380 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1381 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1382 ok(size
== sizeof(WSAPROTOCOL_INFOA
) * 2, "got size %d\n", size
);
1386 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1387 for (i
= 0; i
< ARRAY_SIZE(prottest
); i
++)
1391 s
= socket(prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1392 if (s
== INVALID_SOCKET
&& prottest
[i
].family
== AF_INET6
) continue;
1394 ok(s
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
1397 /* compare both A and W version */
1398 infoA
.szProtocol
[0] = 0;
1399 size
= sizeof(WSAPROTOCOL_INFOA
);
1400 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1401 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1402 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1404 infoW
.szProtocol
[0] = 0;
1405 size
= sizeof(WSAPROTOCOL_INFOW
);
1406 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOW
, (char *) &infoW
, &size
);
1407 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1408 ok(size
== sizeof(WSAPROTOCOL_INFOW
), "got size %d\n", size
);
1410 ok(infoA
.szProtocol
[0], "WSAPROTOCOL_INFOA was not filled\n");
1411 ok(infoW
.szProtocol
[0], "WSAPROTOCOL_INFOW was not filled\n");
1413 WideCharToMultiByte(CP_ACP
, 0, infoW
.szProtocol
, -1,
1414 providername
, sizeof(providername
), NULL
, NULL
);
1415 ok(!strcmp(infoA
.szProtocol
,providername
),
1416 "different provider names '%s' != '%s'\n", infoA
.szProtocol
, providername
);
1418 ok(!memcmp(&infoA
, &infoW
, FIELD_OFFSET(WSAPROTOCOL_INFOA
, szProtocol
)),
1419 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1421 /* Remove IF when WSAEnumProtocols support IPV6 data */
1422 ok(infoA
.iAddressFamily
== prottest
[i
].family
, "socket family invalid, expected %d received %d\n",
1423 prottest
[i
].family
, infoA
.iAddressFamily
);
1424 ok(infoA
.iSocketType
== prottest
[i
].type
, "socket type invalid, expected %d received %d\n",
1425 prottest
[i
].type
, infoA
.iSocketType
);
1426 ok(infoA
.iProtocol
== prottest
[i
].proto
, "socket protocol invalid, expected %d received %d\n",
1427 prottest
[i
].proto
, infoA
.iProtocol
);
1429 /* IP_HDRINCL is supported only on SOCK_RAW but passed to SOCK_DGRAM by Impossible Creatures */
1432 SetLastError(0xdeadbeef);
1433 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1434 if (err
== -1) /* >= Vista */
1436 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %d\n", GetLastError());
1438 SetLastError(0xdeadbeef);
1439 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1440 ok(err
== -1, "Expected -1, got %d\n", err
);
1441 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %d\n", GetLastError());
1442 ok(k
== 99, "Expected 99, got %d\n", k
);
1446 SetLastError(0xdeadbeef);
1447 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1448 ok(err
== -1, "Expected -1, got %d\n", err
);
1449 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %d\n", GetLastError());
1451 SetLastError(0xdeadbeef);
1452 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1453 ok(err
== -1, "Expected -1, got %d\n", err
);
1454 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %d\n", GetLastError());
1455 ok(k
== 99, "Expected 99, got %d\n", k
);
1457 else /* <= 2003 the tests differ between TCP and UDP, UDP silently accepts */
1459 SetLastError(0xdeadbeef);
1461 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1462 if (prottest
[i
].type
== SOCK_DGRAM
)
1464 ok(err
== 0, "Expected 0, got %d\n", err
);
1465 ok(k
== 1, "Expected 1, got %d\n", k
);
1469 /* contratry to what we could expect the function returns error but k is changed */
1470 ok(err
== -1, "Expected -1, got %d\n", err
);
1471 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %d\n", GetLastError());
1472 ok(k
== 0, "Expected 0, got %d\n", k
);
1476 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1477 ok(err
== 0, "Expected 0, got %d\n", err
);
1480 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1481 if (prottest
[i
].type
== SOCK_DGRAM
)
1483 ok(err
== 0, "Expected 0, got %d\n", err
);
1484 ok(k
== 0, "Expected 0, got %d\n", k
);
1488 /* contratry to what we could expect the function returns error but k is changed */
1489 ok(err
== -1, "Expected -1, got %d\n", err
);
1490 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %d\n", GetLastError());
1491 ok(k
== 0, "Expected 0, got %d\n", k
);
1498 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1499 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1500 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1501 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1502 ok(s2
!= INVALID_SOCKET
, "Failed to create socket\n");
1504 SetLastError(0xdeadbeef);
1505 size
= sizeof(csinfoA
);
1506 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1509 struct sockaddr_in saddr
;
1510 memset(&saddr
, 0, sizeof(saddr
));
1511 saddr
.sin_family
= AF_INET
;
1512 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1514 /* Socket is not bound, no information provided */
1515 ok(!csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1516 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1517 /* Socket is not connected, no information provided */
1518 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1519 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.RemoteAddr
.lpSockaddr
);
1521 err
= bind(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1522 ok(!err
, "Expected 0, got %d\n", err
);
1523 size
= sizeof(csinfoA
);
1524 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1525 ok(!err
, "Expected 0, got %d\n", err
);
1527 /* Socket is bound */
1528 ok(csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected non-zero\n");
1529 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
!= NULL
, "Expected non-null\n");
1530 /* Socket is not connected, no information provided */
1531 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1532 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.RemoteAddr
.lpSockaddr
);
1534 err
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1535 ok(!err
, "Expected 0, got %d\n", err
);
1536 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1537 ok(!err
, "Expected 0, got %d\n", err
);
1538 err
= listen(s2
, 1);
1539 ok(!err
, "Expected 0, got %d\n", err
);
1540 err
= connect(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1541 ok(!err
, "Expected 0, got %d\n", err
);
1542 size
= sizeof(saddr
);
1543 err
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1544 ok(err
!= INVALID_SOCKET
, "Failed to accept socket\n");
1548 size
= sizeof(csinfoA
);
1549 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1550 ok(!err
, "Expected 0, got %d\n", err
);
1551 err
= getsockopt(s2
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoB
, &size
);
1552 ok(!err
, "Expected 0, got %d\n", err
);
1553 ok(size
== sizeof(csinfoA
), "Got %d\n", size
);
1554 size
= sizeof(saddr
);
1555 ok(size
== csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1556 csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1557 ok(size
== csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1558 csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1559 ok(!memcmp(csinfoA
.cs
.LocalAddr
.lpSockaddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
),
1560 "Expected matching addresses\n");
1561 ok(!memcmp(csinfoB
.cs
.LocalAddr
.lpSockaddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
),
1562 "Expected matching addresses\n");
1563 ok(csinfoA
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1564 ok(csinfoB
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1565 ok(csinfoA
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1566 ok(csinfoB
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1568 err
= getpeername(s
, (struct sockaddr
*)&saddr
, &size
);
1569 ok(!err
, "Expected 0, got %d\n", err
);
1570 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1571 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1572 err
= getpeername(s2
, (struct sockaddr
*)&saddr
, &size
);
1573 ok(!err
, "Expected 0, got %d\n", err
);
1574 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1575 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1576 err
= getsockname(s
, (struct sockaddr
*)&saddr
, &size
);
1577 ok(!err
, "Expected 0, got %d\n", err
);
1578 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1579 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1580 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1581 ok(!err
, "Expected 0, got %d\n", err
);
1582 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1583 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1585 SetLastError(0xdeadbeef);
1586 size
= sizeof(CSADDR_INFO
);
1587 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1588 ok(err
, "Expected non-zero\n");
1589 ok(size
== sizeof(CSADDR_INFO
), "Got %d\n", size
);
1590 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1592 /* At least for IPv4 the size is exactly 56 bytes */
1593 size
= sizeof(*csinfoA
.cs
.LocalAddr
.lpSockaddr
) * 2 + sizeof(csinfoA
.cs
);
1594 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1595 ok(!err
, "Expected 0, got %d\n", err
);
1597 SetLastError(0xdeadbeef);
1598 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1599 ok(err
, "Expected non-zero\n");
1600 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1603 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %d\n", GetLastError());
1608 for (i
= 0; i
< 2; i
++)
1615 level
= IPPROTO_IPV6
;
1623 s
= socket(family
, SOCK_DGRAM
, 0);
1624 if (s
== INVALID_SOCKET
&& i
)
1626 skip("IPv6 is not supported\n");
1629 ok(s
!= INVALID_SOCKET
, "socket failed with error %d\n", GetLastError());
1631 size
= sizeof(value
);
1633 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1634 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1635 ok(value
== 0, "Expected 0, got %d\n", value
);
1637 size
= sizeof(value
);
1639 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
1640 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1643 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1644 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1645 ok(value
== 1, "Expected 1, got %d\n", value
);
1647 size
= sizeof(value
);
1649 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
1650 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1652 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1653 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1654 ok(value
== 1, "Expected 1, got %d\n", value
);
1658 s
= socket(family
, SOCK_STREAM
, 0);
1659 ok(s
!= INVALID_SOCKET
, "socket failed with error %d\n", GetLastError());
1661 size
= sizeof(value
);
1663 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1664 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1665 ok(value
== 1 || broken(value
== 0) /* < vista */, "Expected 1, got %d\n", value
);
1667 size
= sizeof(value
);
1669 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
1670 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1673 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1674 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1675 ok(value
== 0, "Expected 0, got %d\n", value
);
1679 s
= socket(family
, SOCK_RAW
, 0);
1680 if (s
== INVALID_SOCKET
)
1682 if (WSAGetLastError() == WSAEACCES
) skip("SOCK_RAW is not available\n");
1683 else if (i
) skip("IPv6 is not supported\n");
1686 ok(s
!= INVALID_SOCKET
, "socket failed with error %d\n", GetLastError());
1688 size
= sizeof(value
);
1690 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1691 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1692 ok(value
== 0, "Expected 0, got %d\n", value
);
1694 size
= sizeof(value
);
1696 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
1697 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1700 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1701 ok(!err
, "Expected 0, got %d with error %d\n", err
, GetLastError());
1702 ok(value
== 1, "Expected 1, got %d\n", value
);
1708 static void test_so_reuseaddr(void)
1710 struct sockaddr_in saddr
;
1712 unsigned int rc
,reuse
;
1716 saddr
.sin_family
= AF_INET
;
1717 saddr
.sin_port
= htons(SERVERPORT
+1);
1718 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1720 s1
=socket(AF_INET
, SOCK_STREAM
, 0);
1721 ok(s1
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1722 rc
= bind(s1
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1723 ok(rc
!=SOCKET_ERROR
, "bind(s1) failed error: %d\n", WSAGetLastError());
1725 s2
=socket(AF_INET
, SOCK_STREAM
, 0);
1726 ok(s2
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1730 rc
=getsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, &size
);
1731 ok(rc
==0 && reuse
==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc
,reuse
);
1733 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1734 ok(rc
==SOCKET_ERROR
, "bind() succeeded\n");
1737 rc
= setsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
1738 ok(rc
==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1740 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1741 * a port immediately after closing another socket on that port, so
1742 * basically following the BSD socket semantics here. */
1743 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1746 int s3
=socket(AF_INET
, SOCK_STREAM
, 0), s4
;
1748 /* If we could bind again in the same port this is Windows version <= XP.
1749 * Lets test if we can really connect to one of them. */
1750 set_blocking(s1
, FALSE
);
1751 set_blocking(s2
, FALSE
);
1753 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1755 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1756 rc
= connect(s3
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1757 ok(!rc
, "connecting to accepting socket failed %d\n", WSAGetLastError());
1759 /* the delivery of the connection is random so we need to try on both sockets */
1760 size
= sizeof(saddr
);
1761 s4
= accept(s1
, (struct sockaddr
*)&saddr
, &size
);
1762 if(s4
== INVALID_SOCKET
)
1763 s4
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1764 ok(s4
!= INVALID_SOCKET
, "none of the listening sockets could get the connection\n");
1772 err
= WSAGetLastError();
1773 ok(err
==WSAEACCES
, "expected 10013, got %d\n", err
);
1776 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1777 ok(rc
==0, "bind() failed error: %d\n", WSAGetLastError());
1783 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
1785 static unsigned int got_ip_pktinfo_apc
;
1787 static void WINAPI
ip_pktinfo_apc(DWORD error
, DWORD size
, OVERLAPPED
*overlapped
, DWORD flags
)
1789 ok(error
== WSAEMSGSIZE
, "got error %u\n", error
);
1790 ok(size
== 6, "got size %u\n", size
);
1791 ok(!flags
, "got flags %#x\n", flags
);
1792 ++got_ip_pktinfo_apc
;
1795 static void test_ip_pktinfo(void)
1797 ULONG addresses
[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY
)};
1798 char recvbuf
[10], pktbuf
[512], msg
[] = "HELLO";
1799 struct sockaddr_in s1addr
, s2addr
, s3addr
;
1800 LPFN_WSARECVMSG pWSARecvMsg
= NULL
;
1801 unsigned int rc
, yes
= 1;
1803 DWORD dwBytes
, dwSize
, dwFlags
;
1812 memset(&ov
, 0, sizeof(ov
));
1813 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
1815 memset(&hdr
, 0x00, sizeof(hdr
));
1816 s1addr
.sin_family
= AF_INET
;
1817 s1addr
.sin_port
= htons(0);
1818 /* Note: s1addr.sin_addr is set below */
1819 iovec
[0].buf
= recvbuf
;
1820 iovec
[0].len
= sizeof(recvbuf
);
1821 hdr
.name
= (struct sockaddr
*)&s3addr
;
1822 hdr
.namelen
= sizeof(s3addr
);
1823 hdr
.lpBuffers
= &iovec
[0];
1824 hdr
.dwBufferCount
= 1;
1825 hdr
.Control
.buf
= pktbuf
;
1826 /* Note: hdr.Control.len is set below */
1829 for (i
=0;i
<ARRAY_SIZE(addresses
);i
++)
1831 s1addr
.sin_addr
.s_addr
= addresses
[i
];
1833 /* Build "server" side socket */
1834 s1
=socket(AF_INET
, SOCK_DGRAM
, 0);
1835 ok(s1
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
1837 /* Obtain the WSARecvMsg function */
1838 rc
= WSAIoctl(s1
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
1839 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &dwBytes
, NULL
, NULL
);
1840 ok(!rc
, "failed to get WSARecvMsg, error %u\n", WSAGetLastError());
1842 /* Setup the server side socket */
1843 rc
=bind(s1
, (struct sockaddr
*)&s1addr
, sizeof(s1addr
));
1844 ok(rc
!= SOCKET_ERROR
, "bind() failed error: %d\n", WSAGetLastError());
1846 /* Build "client" side socket */
1847 addrlen
= sizeof(s2addr
);
1848 rc
= getsockname(s1
, (struct sockaddr
*) &s2addr
, &addrlen
);
1849 ok(!rc
, "failed to get address, error %u\n", WSAGetLastError());
1850 s2addr
.sin_addr
.s_addr
= addresses
[0]; /* Always target the local adapter address */
1851 s2
=socket(AF_INET
, SOCK_DGRAM
, 0);
1852 ok(s2
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
1854 /* Test an empty message header */
1855 rc
=pWSARecvMsg(s1
, NULL
, NULL
, NULL
, NULL
);
1856 err
=WSAGetLastError();
1857 ok(rc
== SOCKET_ERROR
&& err
== WSAEFAULT
, "WSARecvMsg() failed error: %d (ret = %d)\n", err
, rc
);
1859 /* Test that when no control data arrives, a 0-length NULL-valued control buffer should succeed */
1860 SetLastError(0xdeadbeef);
1861 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1862 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1863 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1864 hdr
.Control
.buf
= NULL
;
1865 hdr
.Control
.len
= 0;
1866 rc
=pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
1867 ok(rc
== 0, "WSARecvMsg() failed error: %d\n", WSAGetLastError());
1868 hdr
.Control
.buf
= pktbuf
;
1870 /* Now start IP_PKTINFO for future tests */
1871 rc
=setsockopt(s1
, IPPROTO_IP
, IP_PKTINFO
, (const char*)&yes
, sizeof(yes
));
1872 ok(rc
== 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
1875 * Send a packet from the client to the server and test for specifying
1876 * a short control header.
1878 SetLastError(0xdeadbeef);
1879 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1880 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1881 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1882 hdr
.Control
.len
= 1;
1883 dwSize
= 0xdeadbeef;
1884 rc
= pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
1885 ok(rc
== -1, "expected failure\n");
1886 ok(WSAGetLastError() == WSAEMSGSIZE
, "got error %u\n", WSAGetLastError());
1887 todo_wine
ok(dwSize
== sizeof(msg
), "got size %u\n", dwSize
);
1888 ok(hdr
.dwFlags
== MSG_CTRUNC
, "got flags %#x\n", hdr
.dwFlags
);
1889 hdr
.dwFlags
= 0; /* Reset flags */
1891 /* Perform another short control header test, this time with an overlapped receive */
1892 hdr
.Control
.len
= 1;
1893 ov
.Internal
= 0xdead1;
1894 ov
.InternalHigh
= 0xdead2;
1895 ov
.Offset
= 0xdead3;
1896 ov
.OffsetHigh
= 0xdead4;
1897 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1898 err
=WSAGetLastError();
1899 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1900 SetLastError(0xdeadbeef);
1901 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1902 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1903 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1904 ok(!WaitForSingleObject(ov
.hEvent
, 100), "wait failed\n");
1905 ok((NTSTATUS
)ov
.Internal
== STATUS_BUFFER_OVERFLOW
, "got status %#x\n", (NTSTATUS
)ov
.Internal
);
1906 ok(ov
.InternalHigh
== sizeof(msg
), "got size %Iu\n", ov
.InternalHigh
);
1907 ok(ov
.Offset
== 0xdead3, "got Offset %Iu\n", ov
.Offset
);
1908 ok(ov
.OffsetHigh
== 0xdead4, "got OffsetHigh %Iu\n", ov
.OffsetHigh
);
1909 dwFlags
= 0xdeadbeef;
1910 rc
= WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, &dwFlags
);
1911 ok(!rc
, "expected failure\n");
1912 ok(WSAGetLastError() == WSAEMSGSIZE
, "got error %u\n", WSAGetLastError());
1913 ok(dwSize
== sizeof(msg
), "got size %u\n", dwSize
);
1914 todo_wine
ok(dwFlags
== 0xdeadbeef, "got flags %#x\n", dwFlags
);
1915 ok(hdr
.dwFlags
== MSG_CTRUNC
,
1916 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr
.dwFlags
);
1917 hdr
.dwFlags
= 0; /* Reset flags */
1919 /* And with an APC. */
1921 SetLastError(0xdeadbeef);
1922 rc
= sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1923 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1924 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1925 hdr
.Control
.len
= 1;
1927 ov
.Internal
= 0xdead1;
1928 ov
.InternalHigh
= 0xdead2;
1929 ov
.Offset
= 0xdead3;
1930 ov
.OffsetHigh
= 0xdead4;
1931 dwSize
= 0xdeadbeef;
1932 rc
= pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, ip_pktinfo_apc
);
1933 ok(rc
== -1, "expected failure\n");
1934 todo_wine
ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
1936 rc
= SleepEx(1000, TRUE
);
1937 todo_wine
ok(rc
== WAIT_IO_COMPLETION
, "got %d\n", rc
);
1938 todo_wine
ok(got_ip_pktinfo_apc
== 1, "apc was called %u times\n", got_ip_pktinfo_apc
);
1939 ok(hdr
.dwFlags
== MSG_CTRUNC
, "got flags %#x\n", hdr
.dwFlags
);
1940 got_ip_pktinfo_apc
= 0;
1942 hdr
.dwFlags
= 0; /* Reset flags */
1945 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
1946 * on the server end and check that the returned packet matches what was sent.
1948 hdr
.Control
.len
= sizeof(pktbuf
);
1949 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1950 err
=WSAGetLastError();
1951 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1952 ok(hdr
.Control
.len
== sizeof(pktbuf
),
1953 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr
.Control
.len
);
1954 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1955 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1956 ok(!WaitForSingleObject(ov
.hEvent
, 100), "wait failed\n");
1958 WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, NULL
);
1959 ok(dwSize
== sizeof(msg
),
1960 "WSARecvMsg() buffer length does not match transmitted data!\n");
1961 ok(strncmp(iovec
[0].buf
, msg
, sizeof(msg
)) == 0,
1962 "WSARecvMsg() buffer does not match transmitted data!\n");
1963 ok(hdr
.Control
.len
== IP_PKTINFO_LEN
,
1964 "WSARecvMsg() control length mismatch (%d).\n", hdr
.Control
.len
);
1966 /* Test for the expected IP_PKTINFO return information. */
1968 for (cmsg
= WSA_CMSG_FIRSTHDR(&hdr
); cmsg
!= NULL
; cmsg
= WSA_CMSG_NXTHDR(&hdr
, cmsg
))
1970 if (cmsg
->cmsg_level
== IPPROTO_IP
&& cmsg
->cmsg_type
== IP_PKTINFO
)
1972 struct in_pktinfo
*pi
= (struct in_pktinfo
*)WSA_CMSG_DATA(cmsg
);
1974 ok(pi
->ipi_addr
.s_addr
== s2addr
.sin_addr
.s_addr
, "destination ip mismatch!\n");
1978 ok(foundhdr
, "IP_PKTINFO header information was not returned!\n");
1984 CloseHandle(ov
.hEvent
);
1987 static void test_ipv6_cmsg(void)
1989 static const DWORD off
= 0;
1990 static const DWORD on
= 1;
1991 SOCKADDR_IN6 localhost
= {0};
1992 SOCKET client
, server
;
1993 char payload
[] = "HELLO";
1995 WSABUF payload_buf
= {sizeof(payload
), payload
};
1996 WSAMSG msg
= {NULL
, 0, &payload_buf
, 1, {sizeof(control
), control
}, 0};
1997 WSACMSGHDR
*header
= (WSACMSGHDR
*)control
;
1998 LPFN_WSARECVMSG pWSARecvMsg
;
1999 INT
*int_data
= (INT
*)WSA_CMSG_DATA(header
);
2000 IN6_PKTINFO
*pkt_info
= (IN6_PKTINFO
*)WSA_CMSG_DATA(header
);
2004 localhost
.sin6_family
= AF_INET6
;
2005 localhost
.sin6_port
= htons(SERVERPORT
);
2006 inet_pton(AF_INET6
, "::1", &localhost
.sin6_addr
);
2008 client
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
2009 ok(client
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2010 server
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
2011 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2013 rc
= bind(server
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2014 ok(rc
!= SOCKET_ERROR
, "bind failed, error %u\n", WSAGetLastError());
2015 rc
= connect(client
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2016 ok(rc
!= SOCKET_ERROR
, "connect failed, error %u\n", WSAGetLastError());
2018 rc
= WSAIoctl(server
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
2019 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &count
, NULL
, NULL
);
2020 ok(!rc
, "failed to get WSARecvMsg, error %u\n", WSAGetLastError());
2022 memset(control
, 0, sizeof(control
));
2023 msg
.Control
.len
= sizeof(control
);
2024 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (const char *)&on
, sizeof(on
));
2025 ok(!rc
, "failed to set IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2027 count
= sizeof(state
);
2028 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (char *)&state
, (INT
*)&count
);
2029 ok(!rc
, "failed to get IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2030 ok(state
== 1, "expected 1, got %u\n", state
);
2031 rc
= send(client
, payload
, sizeof(payload
), 0);
2032 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2033 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2034 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2035 ok(count
== sizeof(payload
), "expected length %i, got %i\n", (INT
)sizeof(payload
), count
);
2036 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2037 ok(header
->cmsg_type
== IPV6_HOPLIMIT
, "expected IPV6_HOPLIMIT, got %i\n", header
->cmsg_type
);
2038 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2039 "expected length %i, got %i\n", (INT
)(sizeof(*header
) + sizeof(INT
)), (INT
)header
->cmsg_len
);
2040 ok(*int_data
>= 32, "expected at least 32, got %i\n", *int_data
);
2041 setsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (const char *)&off
, sizeof(off
));
2042 ok(!rc
, "failed to clear IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2044 memset(control
, 0, sizeof(control
));
2045 msg
.Control
.len
= sizeof(control
);
2046 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (const char *)&on
, sizeof(on
));
2047 ok(!rc
, "failed to set IPV6_PKTINFO, error %u\n", WSAGetLastError());
2049 count
= sizeof(state
);
2050 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (char *)&state
, (INT
*)&count
);
2051 ok(!rc
, "failed to get IPV6_PKTINFO, error %u\n", WSAGetLastError());
2052 ok(state
== 1, "expected 1, got %u\n", state
);
2053 rc
= send(client
, payload
, sizeof(payload
), 0);
2054 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2055 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2056 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2057 ok(count
== sizeof(payload
), "expected length %i, got %i\n", (INT
)sizeof(payload
), count
);
2058 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2059 ok(header
->cmsg_type
== IPV6_PKTINFO
, "expected IPV6_PKTINFO, got %i\n", header
->cmsg_type
);
2060 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(IN6_PKTINFO
),
2061 "expected length %i, got %i\n", (INT
)(sizeof(*header
) + sizeof(IN6_PKTINFO
)), (INT
)header
->cmsg_len
);
2062 ok(!memcmp(&pkt_info
->ipi6_addr
, &localhost
.sin6_addr
, sizeof(IN6_ADDR
)), "expected ::1\n");
2063 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (const char *)&off
, sizeof(off
));
2064 ok(!rc
, "failed to clear IPV6_PKTINFO, error %u\n", WSAGetLastError());
2066 memset(control
, 0, sizeof(control
));
2067 msg
.Control
.len
= sizeof(control
);
2068 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (const char *)&on
, sizeof(on
));
2069 ok(!rc
, "failed to set IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2071 count
= sizeof(state
);
2072 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (char *)&state
, (INT
*)&count
);
2073 ok(!rc
, "failed to get IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2074 ok(state
== 1, "expected 1, got %u\n", state
);
2075 rc
= send(client
, payload
, sizeof(payload
), 0);
2076 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2077 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2078 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2079 ok(count
== sizeof(payload
), "expected length %i, got %i\n", (INT
)sizeof(payload
), count
);
2080 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2081 ok(header
->cmsg_type
== IPV6_TCLASS
, "expected IPV6_TCLASS, got %i\n", header
->cmsg_type
);
2082 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2083 "expected length %i, got %i\n", (INT
)(sizeof(*header
) + sizeof(INT
)), (INT
)header
->cmsg_len
);
2084 ok(*int_data
== 0, "expected 0, got %i\n", *int_data
);
2085 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (const char *)&off
, sizeof(off
));
2086 ok(!rc
, "failed to clear IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2088 closesocket(server
);
2089 closesocket(client
);
2092 /************* Array containing the tests to run **********/
2094 #define STD_STREAM_SOCKET \
2100 static test_setup tests
[] =
2102 /* Test 0: synchronous client and server */
2123 /* Test 1: event-driven client, synchronous server */
2140 WSA_FLAG_OVERLAPPED
,
2144 /* Test 2: synchronous client, non-blocking server via select() */
2165 /* Test 3: OOB client, OOB server */
2186 /* Test 4: synchronous mixed client and server */
2200 simple_mixed_client
,
2209 static void test_UDP(void)
2211 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
2212 possible that this test fails due to dropped packets. */
2214 /* peer 0 receives data from all other peers */
2215 struct sock_info peer
[NUM_UDP_PEERS
];
2217 int ss
, i
, n_recv
, n_sent
;
2219 memset (buf
,0,sizeof(buf
));
2220 for ( i
= NUM_UDP_PEERS
- 1; i
>= 0; i
-- ) {
2221 ok ( ( peer
[i
].s
= socket ( AF_INET
, SOCK_DGRAM
, 0 ) ) != INVALID_SOCKET
, "UDP: socket failed\n" );
2223 peer
[i
].addr
.sin_family
= AF_INET
;
2224 peer
[i
].addr
.sin_addr
.s_addr
= inet_addr ( SERVERIP
);
2227 peer
[i
].addr
.sin_port
= htons ( SERVERPORT
);
2229 peer
[i
].addr
.sin_port
= htons ( 0 );
2232 do_bind ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, sizeof( peer
[i
].addr
) );
2234 /* test getsockname() to get peer's port */
2235 ss
= sizeof ( peer
[i
].addr
);
2236 ok ( getsockname ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, &ss
) != SOCKET_ERROR
, "UDP: could not getsockname()\n" );
2237 ok ( peer
[i
].addr
.sin_port
!= htons ( 0 ), "UDP: bind() did not associate port\n" );
2240 /* test getsockname() */
2241 ok ( peer
[0].addr
.sin_port
== htons ( SERVERPORT
), "UDP: getsockname returned incorrect peer port\n" );
2243 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2244 /* send client's ip */
2245 memcpy( buf
, &peer
[i
].addr
.sin_port
, sizeof(peer
[i
].addr
.sin_port
) );
2246 n_sent
= sendto ( peer
[i
].s
, buf
, sizeof(buf
), 0, (struct sockaddr
*) &peer
[0].addr
, sizeof(peer
[0].addr
) );
2247 ok ( n_sent
== sizeof(buf
), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent
);
2250 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2251 n_recv
= recvfrom ( peer
[0].s
, buf
, sizeof(buf
), 0,(struct sockaddr
*) &peer
[0].peer
, &ss
);
2252 ok ( n_recv
== sizeof(buf
), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv
);
2253 ok ( memcmp ( &peer
[0].peer
.sin_port
, buf
, sizeof(peer
[0].addr
.sin_port
) ) == 0, "UDP: port numbers do not match\n" );
2257 static void test_WSASocket(void)
2259 SOCKET sock
= INVALID_SOCKET
;
2260 WSAPROTOCOL_INFOA
*pi
;
2261 int wsaproviders
[] = {IPPROTO_TCP
, IPPROTO_IP
};
2262 int autoprotocols
[] = {IPPROTO_TCP
, IPPROTO_UDP
};
2263 int items
, err
, size
, socktype
, i
, j
;
2268 int family
, type
, protocol
;
2270 int ret_family
, ret_type
, ret_protocol
;
2275 {0xdead, SOCK_STREAM
, IPPROTO_TCP
, WSAEAFNOSUPPORT
},
2276 {-1, SOCK_STREAM
, IPPROTO_TCP
, WSAEAFNOSUPPORT
},
2277 {AF_INET
, 0xdead, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
2278 {AF_INET
, -1, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
2279 {AF_INET
, SOCK_STREAM
, 0xdead, WSAEPROTONOSUPPORT
},
2280 {AF_INET
, SOCK_STREAM
, -1, WSAEPROTONOSUPPORT
},
2281 {0xdead, 0xdead, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
2282 {0xdead, SOCK_STREAM
, 0xdead, WSAEAFNOSUPPORT
},
2283 {AF_INET
, 0xdead, 0xdead, WSAESOCKTNOSUPPORT
},
2284 {0xdead, SOCK_STREAM
, IPPROTO_UDP
, WSAEAFNOSUPPORT
},
2287 {AF_INET
, SOCK_STREAM
, 0, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
2288 {AF_INET
, SOCK_DGRAM
, 0, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
2289 {AF_INET
, 0xdead, 0, WSAESOCKTNOSUPPORT
},
2290 {AF_INET
, 0, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
2291 {AF_INET
, 0, IPPROTO_UDP
, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
2292 {AF_INET
, 0, 0xdead, WSAEPROTONOSUPPORT
},
2293 {AF_INET
, 0, 0, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
2294 {AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, WSAEPROTONOSUPPORT
},
2295 {AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, WSAEPROTONOSUPPORT
},
2298 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
2299 {AF_UNSPEC
, SOCK_STREAM
, 0xdead, WSAEPROTONOSUPPORT
},
2300 {AF_UNSPEC
, 0xdead, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
2301 {AF_UNSPEC
, SOCK_STREAM
, 0, WSAEINVAL
},
2302 {AF_UNSPEC
, SOCK_DGRAM
, 0, WSAEINVAL
},
2303 {AF_UNSPEC
, 0xdead, 0, WSAEINVAL
},
2304 {AF_UNSPEC
, 0, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
2305 {AF_UNSPEC
, 0, IPPROTO_UDP
, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
2306 {AF_UNSPEC
, 0, 0xdead, WSAEPROTONOSUPPORT
},
2307 {AF_UNSPEC
, 0, 0, WSAEINVAL
},
2310 for (i
= 0; i
< ARRAY_SIZE(tests
); ++i
)
2312 SetLastError( 0xdeadbeef );
2313 sock
= WSASocketA( tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
, NULL
, 0, 0 );
2314 todo_wine_if (!tests
[i
].error
|| i
== 7)
2315 ok(WSAGetLastError() == tests
[i
].error
, "Test %u: got wrong error %u\n", i
, WSAGetLastError());
2318 ok(sock
== INVALID_SOCKET
, "Test %u: expected failure\n", i
);
2322 WSAPROTOCOL_INFOA info
;
2324 ok(sock
!= INVALID_SOCKET
, "Text %u: expected success\n", i
);
2326 size
= sizeof(info
);
2327 err
= getsockopt( sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *)&info
, &size
);
2328 ok(!err
, "Test %u: getsockopt failed, error %u\n", i
, WSAGetLastError());
2329 ok(info
.iAddressFamily
== tests
[i
].ret_family
, "Test %u: got wrong family %d\n", i
, info
.iAddressFamily
);
2330 ok(info
.iSocketType
== tests
[i
].ret_type
, "Test %u: got wrong type %d\n", i
, info
.iSocketType
);
2331 ok(info
.iProtocol
== tests
[i
].ret_protocol
, "Test %u: got wrong protocol %d\n", i
, info
.iProtocol
);
2333 closesocket( sock
);
2337 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
2338 * to avoid a crash on win98.
2341 items
= WSAEnumProtocolsA(wsaproviders
, NULL
, &pi_size
);
2342 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
2344 err
= WSAGetLastError();
2345 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2348 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2349 ok(pi
!= NULL
, "Failed to allocate memory\n");
2351 items
= WSAEnumProtocolsA(wsaproviders
, pi
, &pi_size
);
2352 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2356 skip("No protocols enumerated.\n");
2357 HeapFree(GetProcessHeap(), 0, pi
);
2361 sock
= WSASocketA(FROM_PROTOCOL_INFO
, FROM_PROTOCOL_INFO
,
2362 FROM_PROTOCOL_INFO
, &pi
[0], 0, 0);
2363 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2367 /* find what parameters are used first: plain parameters or protocol info struct */
2368 pi
[0].iProtocol
= -1;
2369 pi
[0].iSocketType
= -1;
2370 pi
[0].iAddressFamily
= -1;
2371 ok(WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0) == INVALID_SOCKET
,
2372 "WSASocketA should have failed\n");
2373 err
= WSAGetLastError();
2374 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2376 pi
[0].iProtocol
= 0;
2377 pi
[0].iSocketType
= 0;
2378 pi
[0].iAddressFamily
= 0;
2379 sock
= WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0);
2380 if(sock
!= INVALID_SOCKET
)
2382 win_skip("must work only in OS <= 2003\n");
2387 err
= WSAGetLastError();
2388 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2391 pi
[0].iProtocol
= IPPROTO_UDP
;
2392 pi
[0].iSocketType
= SOCK_DGRAM
;
2393 pi
[0].iAddressFamily
= AF_INET
;
2394 sock
= WSASocketA(0, 0, 0, &pi
[0], 0, 0);
2395 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2398 size
= sizeof(socktype
);
2400 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2401 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2402 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2403 SOCK_DGRAM
, socktype
);
2405 socktype
= SOCK_STREAM
;
2406 WSASetLastError(0xdeadbeef);
2407 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
2408 ok(err
== -1, "expected failure\n");
2409 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
2411 socktype
= SOCK_DGRAM
;
2412 WSASetLastError(0xdeadbeef);
2413 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
2414 ok(err
== -1, "expected failure\n");
2415 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
2419 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, &pi
[0], 0, 0);
2420 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2423 size
= sizeof(socktype
);
2425 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2426 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2427 ok(socktype
== SOCK_STREAM
, "Wrong socket type, expected %d received %d\n",
2428 SOCK_STREAM
, socktype
);
2430 socktype
= SOCK_STREAM
;
2431 WSASetLastError(0xdeadbeef);
2432 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
2433 ok(err
== -1, "expected failure\n");
2434 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
2436 socktype
= SOCK_DGRAM
;
2437 WSASetLastError(0xdeadbeef);
2438 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
2439 ok(err
== -1, "expected failure\n");
2440 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
2444 HeapFree(GetProcessHeap(), 0, pi
);
2447 items
= WSAEnumProtocolsA(NULL
, NULL
, &pi_size
);
2448 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
2450 err
= WSAGetLastError();
2451 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2454 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2455 ok(pi
!= NULL
, "Failed to allocate memory\n");
2457 items
= WSAEnumProtocolsA(NULL
, pi
, &pi_size
);
2458 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2461 /* when no protocol and socket type are specified the first entry
2462 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
2464 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
2465 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2468 size
= sizeof(socktype
);
2470 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2471 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2472 for(i
= 0; i
< items
; i
++)
2474 if(pi
[i
].dwProviderFlags
& PFL_MATCHES_PROTOCOL_ZERO
)
2476 ok(socktype
== pi
[i
].iSocketType
, "Wrong socket type, expected %d received %d\n",
2477 pi
[i
].iSocketType
, socktype
);
2481 ok(i
!= items
, "Creating a socket without protocol and socket type didn't work\n");
2484 /* when no socket type is specified the first entry from WSAEnumProtocols
2485 * that matches the protocol is returned */
2486 for (i
= 0; i
< ARRAY_SIZE(autoprotocols
); i
++)
2488 sock
= WSASocketA(0, 0, autoprotocols
[i
], NULL
, 0, 0);
2489 ok(sock
!= INVALID_SOCKET
, "Failed to create socket for protocol %d, received %d\n",
2490 autoprotocols
[i
], WSAGetLastError());
2492 size
= sizeof(socktype
);
2494 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2495 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2497 for (err
= 1, j
= 0; j
< items
; j
++)
2499 if (pi
[j
].iProtocol
== autoprotocols
[i
])
2501 ok(pi
[j
].iSocketType
== socktype
, "expected %d, got %d\n", socktype
, pi
[j
].iSocketType
);
2506 ok(!err
, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols
[i
]);
2511 HeapFree(GetProcessHeap(), 0, pi
);
2513 SetLastError(0xdeadbeef);
2514 /* starting on vista the socket function returns error during the socket
2515 creation and no longer in the socket operations (sendto, readfrom) */
2516 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_ICMP
, NULL
, 0, 0);
2517 if (sock
== INVALID_SOCKET
)
2519 err
= WSAGetLastError();
2520 ok(err
== WSAEACCES
, "Expected 10013, received %d\n", err
);
2521 skip("SOCK_RAW is not supported\n");
2525 size
= sizeof(socktype
);
2527 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2528 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2529 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2530 SOCK_RAW
, socktype
);
2533 sock
= WSASocketA(0, 0, IPPROTO_RAW
, NULL
, 0, 0);
2534 if (sock
!= INVALID_SOCKET
)
2537 size
= sizeof(socktype
);
2539 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2540 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2541 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2542 SOCK_RAW
, socktype
);
2546 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_TCP
, NULL
, 0, 0);
2547 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2549 size
= sizeof(socktype
);
2551 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2552 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2553 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2554 SOCK_RAW
, socktype
);
2557 else if (WSAGetLastError() == WSAEACCES
)
2558 skip("SOCK_RAW is not available\n");
2560 ok(0, "Failed to create socket: %d\n", WSAGetLastError());
2564 /* IPX socket tests */
2566 SetLastError(0xdeadbeef);
2567 sock
= WSASocketA(AF_IPX
, SOCK_DGRAM
, NSPROTO_IPX
, NULL
, 0, 0);
2568 if (sock
== INVALID_SOCKET
)
2570 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
2571 skip("IPX is not supported\n");
2575 WSAPROTOCOL_INFOA info
;
2578 sock
= WSASocketA(0, 0, NSPROTO_IPX
, NULL
, 0, 0);
2579 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2582 size
= sizeof(socktype
);
2584 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2585 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2586 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2587 SOCK_DGRAM
, socktype
);
2589 /* check socket family, type and protocol */
2590 size
= sizeof(WSAPROTOCOL_INFOA
);
2591 err
= getsockopt(sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &info
, &size
);
2592 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2593 ok(info
.iProtocol
== NSPROTO_IPX
, "expected protocol %d, received %d\n",
2594 NSPROTO_IPX
, info
.iProtocol
);
2595 ok(info
.iAddressFamily
== AF_IPX
, "expected family %d, received %d\n",
2596 AF_IPX
, info
.iProtocol
);
2597 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2598 SOCK_DGRAM
, info
.iSocketType
);
2601 /* SOCK_STREAM does not support NSPROTO_IPX */
2602 SetLastError(0xdeadbeef);
2603 ok(WSASocketA(AF_IPX
, SOCK_STREAM
, NSPROTO_IPX
, NULL
, 0, 0) == INVALID_SOCKET
,
2604 "WSASocketA should have failed\n");
2605 err
= WSAGetLastError();
2606 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2608 /* test extended IPX support - that is adding any number between 0 and 255
2609 * to the IPX protocol value will make it be used as IPX packet type */
2610 for(i
= 0;i
<= 255;i
+= 17)
2612 SetLastError(0xdeadbeef);
2613 sock
= WSASocketA(0, 0, NSPROTO_IPX
+ i
, NULL
, 0, 0);
2614 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2619 err
= getsockopt(sock
, NSPROTO_IPX
, IPX_PTYPE
, (char *) &socktype
, &size
);
2620 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2621 ok(socktype
== i
, "Wrong IPX packet type, expected %d received %d\n",
2629 static void test_WSADuplicateSocket(void)
2631 SOCKET source
, dupsock
;
2632 WSAPROTOCOL_INFOA info
;
2634 struct sockaddr_in addr
;
2635 int socktype
, size
, addrsize
, ret
;
2636 char teststr
[] = "TEST", buffer
[16];
2638 source
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
2639 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2641 /* test invalid parameters */
2642 SetLastError(0xdeadbeef);
2643 ok(WSADuplicateSocketA(0, 0, NULL
), "WSADuplicateSocketA should have failed\n");
2644 err
= WSAGetLastError();
2645 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2647 SetLastError(0xdeadbeef);
2648 ok(WSADuplicateSocketA(source
, 0, NULL
),
2649 "WSADuplicateSocketA should have failed\n");
2650 err
= WSAGetLastError();
2651 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2653 SetLastError(0xdeadbeef);
2654 ok(WSADuplicateSocketA(source
, ~0, &info
),
2655 "WSADuplicateSocketA should have failed\n");
2656 err
= WSAGetLastError();
2657 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2659 SetLastError(0xdeadbeef);
2660 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info
),
2661 "WSADuplicateSocketA should have failed\n");
2662 err
= WSAGetLastError();
2663 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2665 SetLastError(0xdeadbeef);
2666 ok(WSADuplicateSocketA(source
, GetCurrentProcessId(), NULL
),
2667 "WSADuplicateSocketA should have failed\n");
2668 err
= WSAGetLastError();
2669 ok(err
== WSAEFAULT
, "expected 10014, received %d\n", err
);
2671 /* test returned structure */
2672 memset(&info
, 0, sizeof(info
));
2673 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2674 "WSADuplicateSocketA should have worked\n");
2676 ok(info
.iProtocol
== IPPROTO_TCP
, "expected protocol %d, received %d\n",
2677 IPPROTO_TCP
, info
.iProtocol
);
2678 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2679 AF_INET
, info
.iProtocol
);
2680 ok(info
.iSocketType
== SOCK_STREAM
, "expected type %d, received %d\n",
2681 SOCK_STREAM
, info
.iSocketType
);
2683 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2684 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2686 closesocket(dupsock
);
2687 closesocket(source
);
2689 /* create a socket, bind it, duplicate it then send data on source and
2690 * receive in the duplicated socket */
2691 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2692 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2694 memset(&info
, 0, sizeof(info
));
2695 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2696 "WSADuplicateSocketA should have worked\n");
2698 ok(info
.iProtocol
== IPPROTO_UDP
, "expected protocol %d, received %d\n",
2699 IPPROTO_UDP
, info
.iProtocol
);
2700 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2701 AF_INET
, info
.iProtocol
);
2702 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2703 SOCK_DGRAM
, info
.iSocketType
);
2705 memset(&addr
, 0, sizeof(addr
));
2706 addr
.sin_family
= AF_INET
;
2707 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2708 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2709 "bind should have worked\n");
2711 /* read address to find out the port number to be used in sendto */
2712 memset(&addr
, 0, sizeof(addr
));
2713 addrsize
= sizeof(addr
);
2714 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2715 "getsockname should have worked\n");
2716 ok(addr
.sin_port
, "socket port should be != 0\n");
2718 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2719 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2722 ret
= getsockopt(dupsock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2723 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
2724 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2725 SOCK_DGRAM
, socktype
);
2727 set_blocking(source
, TRUE
);
2729 /* send data on source socket */
2730 addrsize
= sizeof(addr
);
2731 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2732 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2734 /* receive on duplicated socket */
2735 addrsize
= sizeof(addr
);
2736 memset(buffer
, 0, sizeof(buffer
));
2737 size
= recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
);
2738 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2739 buffer
[sizeof(teststr
) - 1] = 0;
2740 ok(!strcmp(buffer
, teststr
), "expected '%s', received '%s'\n", teststr
, buffer
);
2742 closesocket(dupsock
);
2743 closesocket(source
);
2745 /* show that the source socket need to be bound before the duplicated
2746 * socket is created */
2747 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2748 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2750 memset(&info
, 0, sizeof(info
));
2751 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2752 "WSADuplicateSocketA should have worked\n");
2754 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2755 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2757 memset(&addr
, 0, sizeof(addr
));
2758 addr
.sin_family
= AF_INET
;
2759 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2760 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2761 "bind should have worked\n");
2763 /* read address to find out the port number to be used in sendto */
2764 memset(&addr
, 0, sizeof(addr
));
2765 addrsize
= sizeof(addr
);
2766 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2767 "getsockname should have worked\n");
2768 ok(addr
.sin_port
, "socket port should be != 0\n");
2770 set_blocking(source
, TRUE
);
2772 addrsize
= sizeof(addr
);
2773 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2774 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2776 SetLastError(0xdeadbeef);
2777 addrsize
= sizeof(addr
);
2778 memset(buffer
, 0, sizeof(buffer
));
2780 ok(recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
) == -1,
2781 "recvfrom should have failed\n");
2782 err
= WSAGetLastError();
2783 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2786 closesocket(dupsock
);
2787 closesocket(source
);
2790 static void test_WSAEnumNetworkEvents(void)
2793 int sock_type
[] = {SOCK_STREAM
, SOCK_DGRAM
, SOCK_STREAM
}, i
, j
, k
, l
;
2794 struct sockaddr_in address
;
2796 WSANETWORKEVENTS net_events
;
2798 memset(&address
, 0, sizeof(address
));
2799 address
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
2800 address
.sin_family
= AF_INET
;
2802 /* This test follows the steps from bugs 10204 and 24946 */
2803 for (l
= 0; l
< 2; l
++)
2805 for (i
= 0; i
< ARRAY_SIZE(sock_type
); i
++)
2808 tcp_socketpair(&s
, &s2
);
2811 s
= socket(AF_INET
, sock_type
[i
], 0);
2812 ok (s
!= SOCKET_ERROR
, "Test[%d]: failed to create socket\n", i
);
2813 ok (!bind(s
, (struct sockaddr
*) &address
, sizeof(address
)), "Test[%d]: bind failed\n", i
);
2815 event
= WSACreateEvent();
2816 ok (event
!= NULL
, "Test[%d]: failed to create event\n", i
);
2817 for (j
= 0; j
< 5; j
++) /* Repeat sometimes and the result must be the same */
2819 /* When the TCP socket is not connected NO events will be returned.
2820 * When connected and no data pending it will get the write event.
2821 * UDP sockets don't have connections so as soon as they are bound
2822 * they can read/write data. Since nobody is sendind us data only
2823 * the write event will be returned and ONLY once.
2825 ok (!WSAEventSelect(s
, event
, FD_READ
| FD_WRITE
), "Test[%d]: WSAEventSelect failed\n", i
);
2826 memset(&net_events
, 0xAB, sizeof(net_events
));
2827 ok (!WSAEnumNetworkEvents(s
, l
== 0 ? event
: NULL
, &net_events
),
2828 "Test[%d]: WSAEnumNetworkEvents failed\n", i
);
2829 if (i
>= 1 && j
== 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
2831 ok (net_events
.lNetworkEvents
== FD_WRITE
, "Test[%d]: expected 2, got %d\n",
2832 i
, net_events
.lNetworkEvents
);
2836 ok (net_events
.lNetworkEvents
== 0, "Test[%d]: expected 0, got %d\n",
2837 i
, net_events
.lNetworkEvents
);
2839 for (k
= 0; k
< FD_MAX_EVENTS
; k
++)
2841 if (net_events
.lNetworkEvents
& (1 << k
))
2843 ok (net_events
.iErrorCode
[k
] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
2844 i
, k
, net_events
.iErrorCode
[k
]);
2848 /* Bits that are not set in lNetworkEvents MUST not be changed */
2849 ok (net_events
.iErrorCode
[k
] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
2850 i
, k
, net_events
.iErrorCode
[k
]);
2855 WSACloseEvent(event
);
2856 if (i
== 2) closesocket(s2
);
2861 static DWORD WINAPI
SelectReadThread(void *param
)
2863 select_thread_params
*par
= param
;
2866 struct sockaddr_in addr
;
2867 struct timeval select_timeout
;
2870 FD_SET(par
->s
, &readfds
);
2871 select_timeout
.tv_sec
=5;
2872 select_timeout
.tv_usec
=0;
2873 addr
.sin_family
= AF_INET
;
2874 addr
.sin_addr
.s_addr
= inet_addr(SERVERIP
);
2875 addr
.sin_port
= htons(SERVERPORT
);
2877 do_bind(par
->s
, (struct sockaddr
*)&addr
, sizeof(addr
));
2878 wsa_ok(listen(par
->s
, SOMAXCONN
), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
2880 SetEvent(server_ready
);
2881 ret
= select(par
->s
+1, &readfds
, NULL
, NULL
, &select_timeout
);
2882 par
->ReadKilled
= (ret
== 1);
2887 static DWORD WINAPI
SelectCloseThread(void *param
)
2889 SOCKET s
= *(SOCKET
*)param
;
2895 static void test_errors(void)
2898 SOCKADDR_IN SockAddr
;
2901 WSASetLastError(NO_ERROR
);
2902 sock
= socket(PF_INET
, SOCK_STREAM
, 0);
2903 ok( (sock
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
2904 memset(&SockAddr
, 0, sizeof(SockAddr
));
2905 SockAddr
.sin_family
= AF_INET
;
2906 SockAddr
.sin_port
= htons(6924);
2907 SockAddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2909 ret
= connect(sock
, (PSOCKADDR
)&SockAddr
, sizeof(SockAddr
));
2910 ok( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got: %d\n", ret
);
2911 if (ret
== SOCKET_ERROR
)
2913 err
= WSAGetLastError();
2914 ok( (err
== WSAECONNREFUSED
), "expected WSAECONNREFUSED, got: %d\n", err
);
2919 fd_set set
= {1, {sock
}};
2922 timeval
.tv_usec
= 50000;
2924 ret
= select(1, NULL
, &set
, NULL
, &timeval
);
2925 ok( (ret
== 0), "expected 0 (timeout), got: %d\n", ret
);
2928 ret
= closesocket(sock
);
2929 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
2932 static void test_listen(void)
2935 int ret
, acceptc
, olen
= sizeof(acceptc
);
2936 struct sockaddr_in address
;
2938 memset(&address
, 0, sizeof(address
));
2939 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2940 address
.sin_family
= AF_INET
;
2941 address
.sin_port
= htons(SERVERPORT
);
2943 /* invalid socket tests */
2944 SetLastError(0xdeadbeef);
2945 ok ((listen(0, 0) == SOCKET_ERROR
), "listen did not fail\n");
2946 ret
= WSAGetLastError();
2947 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
2949 SetLastError(0xdeadbeef);
2950 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR
), "listen did not fail\n");
2951 ret
= WSAGetLastError();
2952 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
2955 fdA
= socket(AF_INET
, SOCK_STREAM
, 0);
2956 ok ((fdA
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
2958 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
2959 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
2961 SetLastError(0xdeadbeef);
2962 ok ((listen(fdA
, -2) == SOCKET_ERROR
), "listen did not fail\n");
2963 ret
= WSAGetLastError();
2964 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
2966 SetLastError(0xdeadbeef);
2967 ok ((listen(fdA
, 1) == SOCKET_ERROR
), "listen did not fail\n");
2968 ret
= WSAGetLastError();
2969 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
2971 SetLastError(0xdeadbeef);
2972 ok ((listen(fdA
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
2973 ret
= WSAGetLastError();
2974 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
2976 ok (!bind(fdA
, (struct sockaddr
*) &address
, sizeof(address
)), "bind failed\n");
2978 SetLastError(0xdeadbeef);
2979 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
2980 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
2983 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
2984 ok (!ret
, "getsockopt failed\n");
2985 ok (acceptc
== 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc
);
2988 WSASetLastError(0xdeadbeef);
2989 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
2990 ok(ret
== -1, "expected failure\n");
2991 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
2994 WSASetLastError(0xdeadbeef);
2995 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
2996 ok(ret
== -1, "expected failure\n");
2997 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
2999 ok (!listen(fdA
, 0), "listen failed\n");
3000 ok (!listen(fdA
, SOMAXCONN
), "double listen failed\n");
3003 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3004 ok (!ret
, "getsockopt failed\n");
3005 ok (acceptc
== 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc
);
3008 WSASetLastError(0xdeadbeef);
3009 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
3010 ok(ret
== -1, "expected failure\n");
3011 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3014 WSASetLastError(0xdeadbeef);
3015 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
3016 ok(ret
== -1, "expected failure\n");
3017 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3019 SetLastError(0xdeadbeef);
3020 ok ((listen(fdB
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3021 ret
= WSAGetLastError();
3022 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3024 ret
= closesocket(fdB
);
3025 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3027 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3028 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3030 SetLastError(0xdeadbeef);
3031 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3032 ret
= WSAGetLastError();
3033 ok (ret
== WSAEADDRINUSE
, "expected 10048, received %d\n", ret
);
3035 ret
= closesocket(fdA
);
3036 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3037 ret
= closesocket(fdB
);
3038 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3041 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
3042 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
3043 static void test_select(void)
3045 static char tmp_buf
[1024];
3047 SOCKET fdListen
, fdRead
, fdWrite
;
3048 fd_set readfds
, writefds
, exceptfds
;
3052 struct timeval select_timeout
;
3053 struct sockaddr_in address
;
3054 select_thread_params thread_params
;
3055 HANDLE thread_handle
;
3058 fdRead
= socket(AF_INET
, SOCK_STREAM
, 0);
3059 ok( (fdRead
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3060 fdWrite
= socket(AF_INET
, SOCK_STREAM
, 0);
3061 ok( (fdWrite
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3064 if (fdWrite
> maxfd
)
3069 FD_SET_ALL(fdWrite
);
3070 select_timeout
.tv_sec
=0;
3071 select_timeout
.tv_usec
=0;
3073 ticks
= GetTickCount();
3074 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3075 ticks
= GetTickCount() - ticks
;
3076 ok(ret
== 0, "select should not return any socket handles\n");
3077 ok(ticks
< 10, "select was blocking for %u ms, expected < 10 ms\n", ticks
);
3078 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3079 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
3080 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3081 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
3085 FD_SET_ALL(fdWrite
);
3086 select_timeout
.tv_sec
=0;
3087 select_timeout
.tv_usec
=500;
3089 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3090 ok(ret
== 0, "select should not return any socket handles\n");
3091 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3092 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
3093 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3094 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
3096 ok ((listen(fdWrite
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3097 ret
= closesocket(fdWrite
);
3098 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3100 thread_params
.s
= fdRead
;
3101 thread_params
.ReadKilled
= FALSE
;
3102 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
3103 thread_handle
= CreateThread (NULL
, 0, SelectReadThread
, &thread_params
, 0, &id
);
3104 ok ( (thread_handle
!= NULL
), "CreateThread failed unexpectedly: %d\n", GetLastError());
3106 WaitForSingleObject (server_ready
, INFINITE
);
3108 ret
= closesocket(fdRead
);
3109 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3111 WaitForSingleObject (thread_handle
, 1000);
3112 ok ( thread_params
.ReadKilled
, "closesocket did not wake up select\n");
3113 ret
= recv(fdRead
, &buffer
, 1, MSG_PEEK
);
3114 ok( (ret
== -1), "peek at closed socket expected -1 got %d\n", ret
);
3116 /* Test selecting invalid handles */
3120 ret
= select(maxfd
+1, 0, 0, 0, &select_timeout
);
3121 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3122 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3125 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3126 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3127 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3129 FD_SET(INVALID_SOCKET
, &readfds
);
3131 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3132 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3133 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3134 ok ( !FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3137 FD_SET(INVALID_SOCKET
, &writefds
);
3139 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3140 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3141 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3142 ok ( !FD_ISSET(fdRead
, &writefds
), "FD should not be set\n");
3145 FD_SET(INVALID_SOCKET
, &exceptfds
);
3147 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3148 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3149 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3150 ok ( !FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3152 tcp_socketpair(&fdRead
, &fdWrite
);
3154 if(fdWrite
> maxfd
) maxfd
= fdWrite
;
3157 FD_SET(fdRead
, &readfds
);
3158 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3159 ok(!ret
, "select returned %d\n", ret
);
3162 FD_SET(fdWrite
, &writefds
);
3163 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3164 ok(ret
== 1, "select returned %d\n", ret
);
3165 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3167 /* tests for overlapping fd_set pointers */
3169 FD_SET(fdWrite
, &readfds
);
3170 ret
= select(fdWrite
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3171 ok(ret
== 1, "select returned %d\n", ret
);
3172 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3175 FD_SET(fdWrite
, &readfds
);
3176 FD_SET(fdRead
, &readfds
);
3177 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3178 ok(ret
== 2, "select returned %d\n", ret
);
3179 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3180 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3182 ok(send(fdWrite
, "test", 4, 0) == 4, "failed to send data\n");
3184 FD_SET(fdRead
, &readfds
);
3185 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3186 ok(ret
== 1, "select returned %d\n", ret
);
3187 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3190 FD_SET(fdWrite
, &readfds
);
3191 FD_SET(fdRead
, &readfds
);
3192 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3193 ok(ret
== 2, "select returned %d\n", ret
);
3194 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3195 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3199 FD_SET(fdWrite
, &writefds
);
3200 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3202 ok(send(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0) > 0, "failed to send data\n");
3205 FD_SET(fdWrite
, &readfds
);
3206 FD_SET(fdRead
, &readfds
);
3207 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3208 ok(ret
== 1, "select returned %d\n", ret
);
3209 ok(!FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is in the set\n");
3210 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3212 ok(send(fdRead
, "test", 4, 0) == 4, "failed to send data\n");
3215 FD_SET(fdWrite
, &readfds
);
3216 FD_SET(fdRead
, &readfds
);
3217 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3218 ok(ret
== 2, "select returned %d\n", ret
);
3219 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3220 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3222 closesocket(fdRead
);
3223 closesocket(fdWrite
);
3225 /* select() works in 3 distinct states:
3226 * - to check if a connection attempt ended with success or error;
3227 * - to check if a pending connection is waiting for acceptance;
3228 * - to check for data to read, availability for write and OOB data
3230 * The tests below ensure that all conditions are tested.
3232 memset(&address
, 0, sizeof(address
));
3233 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3234 address
.sin_family
= AF_INET
;
3235 len
= sizeof(address
);
3236 fdListen
= setup_server_socket(&address
, &len
);
3237 select_timeout
.tv_sec
= 1;
3238 select_timeout
.tv_usec
= 250000;
3240 /* When no events are pending select returns 0 with no error */
3242 FD_SET_ALL(fdListen
);
3243 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3244 ok(ret
== 0, "expected 0, got %d\n", ret
);
3246 /* When a socket is attempting to connect the listening socket receives the read descriptor */
3247 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
3249 FD_SET_ALL(fdListen
);
3250 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3251 ok(ret
== 1, "expected 1, got %d\n", ret
);
3252 ok(FD_ISSET(fdListen
, &readfds
), "fdListen socket is not in the set\n");
3253 len
= sizeof(address
);
3254 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
3255 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
3257 /* The connector is signaled through the write descriptor */
3259 FD_SET_ALL(fdListen
);
3261 FD_SET_ALL(fdWrite
);
3262 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3263 ok(ret
== 2, "expected 2, got %d\n", ret
);
3264 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3265 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
3268 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
3269 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3270 ok(id
== 0, "expected 0, got %d\n", id
);
3272 /* When data is received the receiver gets the read descriptor */
3273 ret
= send(fdWrite
, "1234", 4, 0);
3274 ok(ret
== 4, "expected 4, got %d\n", ret
);
3276 FD_SET_ALL(fdListen
);
3277 FD_SET(fdRead
, &readfds
);
3278 FD_SET(fdRead
, &exceptfds
);
3279 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3280 ok(ret
== 1, "expected 1, got %d\n", ret
);
3281 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3282 ok(!FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is in the set\n");
3285 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3286 ok(ret
== 2, "expected 1, got %d\n", ret
);
3287 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3288 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
3289 ok(!FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is in the set\n");
3290 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3291 ok(ret
== 4, "expected 4, got %d\n", ret
);
3292 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
3294 /* When OOB data is received the socket is set in the except descriptor */
3295 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3296 ok(ret
== 1, "expected 1, got %d\n", ret
);
3298 FD_SET_ALL(fdListen
);
3299 FD_SET(fdRead
, &readfds
);
3300 FD_SET(fdRead
, &exceptfds
);
3301 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3302 ok(ret
== 1, "expected 1, got %d\n", ret
);
3303 ok(FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is not in the set\n");
3305 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3306 ok(ret
== 1, "expected 1, got %d\n", ret
);
3307 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3309 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
3311 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
3312 ok(ret
== 0, "expected 0, got %d\n", ret
);
3313 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3314 ok(ret
== 1, "expected 1, got %d\n", ret
);
3316 FD_SET_ALL(fdListen
);
3317 FD_SET(fdRead
, &readfds
);
3318 FD_SET(fdRead
, &exceptfds
);
3319 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3320 ok(ret
== 1, "expected 1, got %d\n", ret
);
3321 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3323 SetLastError(0xdeadbeef);
3324 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3325 ok(ret
== SOCKET_ERROR
, "expected SOCKET_ERROR, got %d\n", ret
);
3326 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %d\n", GetLastError());
3327 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3328 ok(ret
== 1, "expected 1, got %d\n", ret
);
3329 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3331 /* When the connection is closed the socket is set in the read descriptor */
3332 ret
= closesocket(fdRead
);
3333 ok(ret
== 0, "expected 0, got %d\n", ret
);
3335 FD_SET_ALL(fdListen
);
3336 FD_SET(fdWrite
, &readfds
);
3337 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3338 ok(ret
== 1, "expected 1, got %d\n", ret
);
3339 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3340 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
3341 ok(ret
== 0, "expected 0, got %d\n", ret
);
3342 ret
= closesocket(fdWrite
);
3343 ok(ret
== 0, "expected 0, got %d\n", ret
);
3345 /* w10pro64 sometimes takes over 2 seconds for an error to be reported. */
3346 if (winetest_interactive
)
3348 const struct sockaddr_in invalid_addr
=
3350 .sin_family
= AF_INET
,
3351 .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
),
3355 fdWrite
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3356 set_blocking(fdWrite
, FALSE
);
3358 ret
= connect(fdWrite
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
3359 ok(ret
== -1, "got %d\n", ret
);
3360 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3363 FD_SET(fdWrite
, &readfds
);
3364 FD_SET(fdWrite
, &writefds
);
3365 FD_SET(fdWrite
, &exceptfds
);
3366 select_timeout
.tv_sec
= 10;
3367 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3368 ok(ret
== 1, "expected 1, got %d\n", ret
);
3369 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3370 ok(select_timeout
.tv_usec
== 250000, "select timeout should not have changed\n");
3374 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
3375 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3376 ok(id
== WSAECONNREFUSED
, "got error %u\n", id
);
3380 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
3381 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3382 ok(id
== WSAECONNREFUSED
, "got error %u\n", id
);
3385 FD_SET(fdWrite
, &readfds
);
3386 FD_SET(fdWrite
, &writefds
);
3387 FD_SET(fdWrite
, &exceptfds
);
3388 select_timeout
.tv_sec
= 10;
3389 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3390 ok(ret
== 1, "got %d\n", ret
);
3391 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3393 /* Calling connect() doesn't reset the socket error, but a successful
3394 * connection does. This is kind of tricky to test, because while
3395 * Windows takes a couple seconds to actually fail the connection,
3396 * Linux will fail the connection almost immediately. */
3398 ret
= connect(fdWrite
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
3399 ok(ret
== -1, "got %d\n", ret
);
3400 todo_wine
ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3401 if (WSAGetLastError() == WSAECONNABORTED
)
3403 ret
= connect(fdWrite
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
3404 ok(ret
== -1, "got %d\n", ret
);
3405 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3410 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
3411 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3412 ok(id
== WSAECONNREFUSED
, "got error %u\n", id
);
3415 FD_SET(fdWrite
, &readfds
);
3416 FD_SET(fdWrite
, &writefds
);
3417 FD_SET(fdWrite
, &exceptfds
);
3418 select_timeout
.tv_sec
= 10;
3419 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3420 ok(ret
== 1, "got %d\n", ret
);
3421 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3423 len
= sizeof(address
);
3424 ret
= getsockname(fdListen
, (struct sockaddr
*)&address
, &len
);
3425 ok(!ret
, "got error %u\n", WSAGetLastError());
3426 ret
= connect(fdWrite
, (const struct sockaddr
*)&address
, sizeof(address
));
3427 ok(ret
== -1, "got %d\n", ret
);
3428 todo_wine
ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3429 if (WSAGetLastError() == WSAECONNABORTED
)
3431 ret
= connect(fdWrite
, (const struct sockaddr
*)&address
, sizeof(address
));
3432 ok(ret
== -1, "got %d\n", ret
);
3433 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3437 FD_SET(fdWrite
, &readfds
);
3438 FD_SET(fdWrite
, &writefds
);
3439 FD_SET(fdWrite
, &exceptfds
);
3440 select_timeout
.tv_sec
= 1;
3441 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3442 ok(ret
== 1, "expected 1, got %d\n", ret
);
3443 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3447 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
3448 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3449 ok(!id
, "got error %u\n", id
);
3451 closesocket(fdWrite
);
3453 /* test polling after a (synchronous) failure */
3455 fdWrite
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3457 ret
= connect(fdWrite
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
3458 ok(ret
== -1, "got %d\n", ret
);
3459 ok(WSAGetLastError() == WSAECONNREFUSED
, "got error %u\n", WSAGetLastError());
3462 FD_SET(fdWrite
, &readfds
);
3463 FD_SET(fdWrite
, &writefds
);
3464 FD_SET(fdWrite
, &exceptfds
);
3465 select_timeout
.tv_sec
= 0;
3466 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3467 ok(ret
== 1, "expected 1, got %d\n", ret
);
3468 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3472 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
3473 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3474 todo_wine
ok(!id
, "got error %u\n", id
);
3476 closesocket(fdWrite
);
3479 ret
= closesocket(fdListen
);
3480 ok(ret
== 0, "expected 0, got %d\n", ret
);
3482 select_timeout
.tv_sec
= 1;
3483 select_timeout
.tv_usec
= 250000;
3485 /* Try select() on a closed socket after connection */
3486 tcp_socketpair(&fdRead
, &fdWrite
);
3487 closesocket(fdRead
);
3489 FD_SET_ALL(fdWrite
);
3491 SetLastError(0xdeadbeef);
3492 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3493 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3494 ok(GetLastError() == WSAENOTSOCK
, "got %d\n", GetLastError());
3495 /* descriptor sets are unchanged */
3496 ok(readfds
.fd_count
== 2, "expected 2, got %d\n", readfds
.fd_count
);
3497 ok(exceptfds
.fd_count
== 2, "expected 2, got %d\n", exceptfds
.fd_count
);
3498 closesocket(fdWrite
);
3500 /* Close the socket currently being selected in a thread - bug 38399 */
3501 tcp_socketpair(&fdRead
, &fdWrite
);
3502 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3503 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3505 FD_SET_ALL(fdWrite
);
3506 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3507 ok(ret
== 1, "expected 1, got %d\n", ret
);
3508 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3509 WaitForSingleObject (thread_handle
, 1000);
3510 closesocket(fdRead
);
3511 /* test again with only the except descriptor */
3512 tcp_socketpair(&fdRead
, &fdWrite
);
3513 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3514 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3516 FD_SET(fdWrite
, &exceptfds
);
3517 SetLastError(0xdeadbeef);
3518 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
3519 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3520 ok(GetLastError() == WSAENOTSOCK
, "got %d\n", GetLastError());
3521 ok(!FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is in the set\n");
3522 WaitForSingleObject (thread_handle
, 1000);
3523 closesocket(fdRead
);
3525 /* test UDP behavior of unbound sockets */
3526 select_timeout
.tv_sec
= 0;
3527 select_timeout
.tv_usec
= 250000;
3528 fdWrite
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
3529 ok(fdWrite
!= INVALID_SOCKET
, "socket call failed\n");
3531 FD_SET_ALL(fdWrite
);
3532 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3533 ok(ret
== 1, "expected 1, got %d\n", ret
);
3534 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3535 closesocket(fdWrite
);
3540 static DWORD WINAPI
AcceptKillThread(void *param
)
3542 select_thread_params
*par
= param
;
3543 struct sockaddr_in address
;
3544 int len
= sizeof(address
);
3545 SOCKET client_socket
;
3547 SetEvent(server_ready
);
3548 client_socket
= accept(par
->s
, (struct sockaddr
*) &address
, &len
);
3549 if (client_socket
!= INVALID_SOCKET
)
3550 closesocket(client_socket
);
3551 par
->ReadKilled
= (client_socket
== INVALID_SOCKET
);
3556 static int CALLBACK
AlwaysDeferConditionFunc(LPWSABUF lpCallerId
, LPWSABUF lpCallerData
, LPQOS pQos
,
3557 LPQOS lpGQOS
, LPWSABUF lpCalleeId
, LPWSABUF lpCalleeData
,
3558 GROUP
*g
, DWORD_PTR dwCallbackData
)
3563 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
)
3566 SOCKET server_socket
;
3568 server_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
3569 ok(server_socket
!= INVALID_SOCKET
, "failed to bind socket, error %u\n", WSAGetLastError());
3572 ret
= setsockopt(server_socket
, SOL_SOCKET
, SO_REUSEADDR
, (char *)&val
, sizeof(val
));
3573 ok(!ret
, "failed to set SO_REUSEADDR, error %u\n", WSAGetLastError());
3575 ret
= bind(server_socket
, (struct sockaddr
*)addr
, *len
);
3576 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
3578 ret
= getsockname(server_socket
, (struct sockaddr
*)addr
, len
);
3579 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
3581 ret
= listen(server_socket
, 5);
3582 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
3584 return server_socket
;
3587 static SOCKET
setup_connector_socket(const struct sockaddr_in
*addr
, int len
, BOOL nonblock
)
3592 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
3593 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket %d\n", WSAGetLastError());
3596 set_blocking(connector
, !nonblock
);
3598 ret
= connect(connector
, (const struct sockaddr
*)addr
, len
);
3600 ok(!ret
, "connecting to accepting socket failed %d\n", WSAGetLastError());
3601 else if (ret
== SOCKET_ERROR
)
3602 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
3607 static void test_accept(void)
3610 SOCKET server_socket
, accepted
= INVALID_SOCKET
, connector
;
3611 struct sockaddr_in address
;
3612 SOCKADDR_STORAGE ss
, ss_empty
;
3614 select_thread_params thread_params
;
3615 HANDLE thread_handle
= NULL
;
3618 memset(&address
, 0, sizeof(address
));
3619 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3620 address
.sin_family
= AF_INET
;
3622 socklen
= sizeof(address
);
3623 server_socket
= setup_server_socket(&address
, &socklen
);
3625 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3626 if (connector
== INVALID_SOCKET
) goto done
;
3628 accepted
= WSAAccept(server_socket
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
3629 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
3631 accepted
= accept(server_socket
, NULL
, 0);
3632 ok(accepted
!= INVALID_SOCKET
, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
3634 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
3636 thread_params
.s
= server_socket
;
3637 thread_params
.ReadKilled
= FALSE
;
3638 thread_handle
= CreateThread(NULL
, 0, AcceptKillThread
, &thread_params
, 0, &id
);
3640 WaitForSingleObject(server_ready
, INFINITE
);
3642 ret
= closesocket(server_socket
);
3643 ok(!ret
, "failed to close socket, error %u\n", WSAGetLastError());
3645 WaitForSingleObject(thread_handle
, 1000);
3646 ok(thread_params
.ReadKilled
, "closesocket did not wake up accept\n");
3648 closesocket(accepted
);
3649 closesocket(connector
);
3650 accepted
= connector
= INVALID_SOCKET
;
3652 socklen
= sizeof(address
);
3653 server_socket
= setup_server_socket(&address
, &socklen
);
3655 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3656 if (connector
== INVALID_SOCKET
) goto done
;
3659 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
3660 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
3661 ok(!socklen
, "got %d\n", socklen
);
3662 closesocket(connector
);
3663 connector
= INVALID_SOCKET
;
3665 socklen
= sizeof(address
);
3666 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3667 if (connector
== INVALID_SOCKET
) goto done
;
3669 accepted
= WSAAccept(server_socket
, NULL
, NULL
, NULL
, 0);
3670 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
3671 closesocket(accepted
);
3672 closesocket(connector
);
3673 accepted
= connector
= INVALID_SOCKET
;
3675 socklen
= sizeof(address
);
3676 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3677 if (connector
== INVALID_SOCKET
) goto done
;
3679 socklen
= sizeof(ss
);
3680 memset(&ss
, 0, sizeof(ss
));
3681 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
3682 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
3683 ok(socklen
!= sizeof(ss
), "unexpected length\n");
3684 ok(ss
.ss_family
, "family not set\n");
3685 closesocket(accepted
);
3686 closesocket(connector
);
3687 accepted
= connector
= INVALID_SOCKET
;
3689 socklen
= sizeof(address
);
3690 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3691 if (connector
== INVALID_SOCKET
) goto done
;
3694 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
3695 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
3696 ok(!socklen
, "got %d\n", socklen
);
3697 closesocket(connector
);
3698 accepted
= connector
= INVALID_SOCKET
;
3700 socklen
= sizeof(address
);
3701 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3702 if (connector
== INVALID_SOCKET
) goto done
;
3704 accepted
= accept(server_socket
, NULL
, NULL
);
3705 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
3706 closesocket(accepted
);
3707 closesocket(connector
);
3708 accepted
= connector
= INVALID_SOCKET
;
3710 socklen
= sizeof(address
);
3711 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3712 if (connector
== INVALID_SOCKET
) goto done
;
3714 socklen
= sizeof(ss
);
3715 memset(&ss
, 0, sizeof(ss
));
3716 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
3717 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
3718 ok(socklen
!= sizeof(ss
), "unexpected length\n");
3719 ok(ss
.ss_family
, "family not set\n");
3720 closesocket(accepted
);
3721 closesocket(connector
);
3722 accepted
= connector
= INVALID_SOCKET
;
3724 socklen
= sizeof(address
);
3725 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
3726 if (connector
== INVALID_SOCKET
) goto done
;
3728 memset(&ss
, 0, sizeof(ss
));
3729 memset(&ss_empty
, 0, sizeof(ss_empty
));
3730 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, NULL
);
3731 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
3732 ok(!memcmp(&ss
, &ss_empty
, sizeof(ss
)), "structure is different\n");
3735 if (accepted
!= INVALID_SOCKET
)
3736 closesocket(accepted
);
3737 if (connector
!= INVALID_SOCKET
)
3738 closesocket(connector
);
3739 if (thread_handle
!= NULL
)
3740 CloseHandle(thread_handle
);
3741 if (server_ready
!= INVALID_HANDLE_VALUE
)
3742 CloseHandle(server_ready
);
3743 if (server_socket
!= INVALID_SOCKET
)
3744 closesocket(server_socket
);
3747 static void test_extendedSocketOptions(void)
3751 struct sockaddr_in sa
;
3752 int sa_len
= sizeof(struct sockaddr_in
);
3753 int optval
, optlen
= sizeof(int), ret
;
3757 ret
= WSAStartup(MAKEWORD(2,0), &wsa
);
3758 ok(!ret
, "failed to startup, error %u\n", WSAGetLastError());
3760 memset(&sa
, 0, sa_len
);
3762 sa
.sin_family
= AF_INET
;
3763 sa
.sin_port
= htons(0);
3764 sa
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
3766 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
3767 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
3769 ret
= bind(sock
, (struct sockaddr
*) &sa
, sa_len
);
3770 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
3772 ret
= getsockopt(sock
, SOL_SOCKET
, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3774 ok(ret
== 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret
);
3775 ok((optval
== 65507) || (optval
== 65527),
3776 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval
);
3778 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
3779 SetLastError(0xdeadbeef);
3780 optval
= 0xdeadbeef;
3781 optlen
= sizeof(int);
3782 ret
= getsockopt(sock
, 0xffffffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3783 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
3784 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
3785 ret
, WSAGetLastError(), optval
, optval
);
3787 /* more invalid values for level */
3788 SetLastError(0xdeadbeef);
3789 optval
= 0xdeadbeef;
3790 optlen
= sizeof(int);
3791 ret
= getsockopt(sock
, 0x1234ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3792 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
3793 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
3794 ret
, WSAGetLastError(), optval
, optval
);
3796 SetLastError(0xdeadbeef);
3797 optval
= 0xdeadbeef;
3798 optlen
= sizeof(int);
3799 ret
= getsockopt(sock
, 0x8000ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3800 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
3801 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
3802 ret
, WSAGetLastError(), optval
, optval
);
3804 SetLastError(0xdeadbeef);
3805 optval
= 0xdeadbeef;
3806 optlen
= sizeof(int);
3807 ret
= getsockopt(sock
, 0x00008000, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3808 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
3809 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
3810 ret
, WSAGetLastError(), optval
, optval
);
3812 SetLastError(0xdeadbeef);
3813 optval
= 0xdeadbeef;
3814 optlen
= sizeof(int);
3815 ret
= getsockopt(sock
, 0x00000800, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
3816 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
3817 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
3818 ret
, WSAGetLastError(), optval
, optval
);
3820 SetLastError(0xdeadbeef);
3821 optlen
= sizeof(LINGER
);
3822 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
3823 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOPROTOOPT
),
3824 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
3825 ret
, WSAGetLastError());
3828 sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
);
3829 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
3831 ret
= bind(sock
, (struct sockaddr
*) &sa
, sa_len
);
3832 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
3834 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
3835 ok(ret
== 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret
);
3837 optlen
= sizeof(BOOL
);
3838 ret
= getsockopt(sock
, SOL_SOCKET
, SO_DONTLINGER
, (char *)&bool_opt_val
, &optlen
);
3839 ok(ret
== 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret
);
3840 ok((linger_val
.l_onoff
&& !bool_opt_val
) || (!linger_val
.l_onoff
&& bool_opt_val
),
3841 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
3842 bool_opt_val
, linger_val
.l_onoff
);
3848 static void test_getsockname(void)
3852 struct sockaddr_in sa_set
, sa_get
;
3853 int sa_set_len
= sizeof(struct sockaddr_in
);
3854 int sa_get_len
= sa_set_len
;
3855 static const unsigned char null_padding
[] = {0,0,0,0,0,0,0,0};
3859 ret
= WSAStartup(MAKEWORD(2,0), &wsa
);
3860 ok(!ret
, "failed to startup, error %u\n", WSAGetLastError());
3862 memset(&sa_set
, 0, sa_set_len
);
3864 sa_set
.sin_family
= AF_INET
;
3865 sa_set
.sin_port
= htons(0);
3866 sa_set
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
3868 sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
);
3869 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
3872 WSASetLastError(0xdeadbeef);
3873 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
3874 ok(ret
== SOCKET_ERROR
, "expected failure\n");
3875 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
3876 ok(!memcmp(&sa_get
, &sa_set
, sizeof(sa_get
)), "address should not be changed\n");
3878 ret
= bind(sock
, (struct sockaddr
*) &sa_set
, sa_set_len
);
3879 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
3881 WSASetLastError(0xdeadbeef);
3882 memset(&sa_get
, 0, sizeof(sa_get
));
3883 ret
= getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
);
3884 ok(!ret
, "got %d\n", ret
);
3885 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
3886 ok(sa_get
.sin_family
== AF_INET
, "got family %#x\n", sa_get
.sin_family
);
3887 ok(sa_get
.sin_port
!= 0, "got zero port\n");
3888 ok(sa_get
.sin_addr
.s_addr
== INADDR_ANY
, "got addr %08x\n", sa_get
.sin_addr
.s_addr
);
3890 ret
= memcmp(sa_get
.sin_zero
, null_padding
, 8);
3891 ok(ret
== 0, "getsockname did not zero the sockaddr_in structure\n");
3893 sa_get_len
= sizeof(sa_get
) - 1;
3894 WSASetLastError(0xdeadbeef);
3895 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
3896 ok(ret
== -1, "expected failure\n");
3897 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
3898 ok(sa_get_len
== sizeof(sa_get
) - 1, "got size %d\n", sa_get_len
);
3902 h
= gethostbyname("");
3903 if (h
&& h
->h_length
== 4) /* this test is only meaningful in IPv4 */
3906 for (i
= 0; h
->h_addr_list
[i
]; i
++)
3910 ip
.s_addr
= *(ULONG
*) h
->h_addr_list
[i
];
3912 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
3913 ok(sock
!= INVALID_SOCKET
, "socket failed with %d\n", GetLastError());
3915 memset(&sa_set
, 0, sizeof(sa_set
));
3916 sa_set
.sin_family
= AF_INET
;
3917 sa_set
.sin_addr
.s_addr
= ip
.s_addr
;
3918 /* The same address we bind must be the same address we get */
3919 ret
= bind(sock
, (struct sockaddr
*)&sa_set
, sizeof(sa_set
));
3920 ok(ret
== 0, "bind failed with %d\n", GetLastError());
3921 sa_get_len
= sizeof(sa_get
);
3922 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
3923 ok(ret
== 0, "getsockname failed with %d\n", GetLastError());
3924 strcpy(ipstr
, inet_ntoa(sa_get
.sin_addr
));
3925 ok(sa_get
.sin_addr
.s_addr
== sa_set
.sin_addr
.s_addr
,
3926 "address does not match: %s != %s\n", ipstr
, inet_ntoa(sa_set
.sin_addr
));
3935 static DWORD apc_error
, apc_size
;
3936 static OVERLAPPED
*apc_overlapped
;
3937 static unsigned int apc_count
;
3939 static void WINAPI
socket_apc(DWORD error
, DWORD size
, OVERLAPPED
*overlapped
, DWORD flags
)
3941 ok(!flags
, "got flags %#x\n", flags
);
3945 apc_overlapped
= overlapped
;
3948 #define check_fionread_siocatmark(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, FALSE, FALSE)
3949 #define check_fionread_siocatmark_todo(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, TRUE, TRUE)
3950 #define check_fionread_siocatmark_todo_oob(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, FALSE, TRUE)
3951 static void check_fionread_siocatmark_(int line
, SOCKET s
, unsigned int normal
, unsigned int oob
,
3952 BOOL todo_normal
, BOOL todo_oob
)
3958 WSASetLastError(0xdeadbeef);
3959 ret
= WSAIoctl(s
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, NULL
, NULL
);
3960 ok_(__FILE__
, line
)(!ret
, "expected success\n");
3961 ok_(__FILE__
, line
)(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
3962 todo_wine_if (todo_normal
) ok_(__FILE__
, line
)(value
== normal
, "FIONBIO returned %u\n", value
);
3965 WSASetLastError(0xdeadbeef);
3966 ret
= WSAIoctl(s
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, NULL
, NULL
);
3967 ok_(__FILE__
, line
)(!ret
, "expected success\n");
3968 ok_(__FILE__
, line
)(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
3969 todo_wine_if (todo_oob
) ok_(__FILE__
, line
)(value
== oob
, "SIOCATMARK returned %u\n", value
);
3972 static void test_fionread_siocatmark(void)
3974 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
3975 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
3976 SOCKET client
, server
;
3983 tcp_socketpair(&client
, &server
);
3984 set_blocking(client
, FALSE
);
3985 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
3987 WSASetLastError(0xdeadbeef);
3988 ret
= ioctlsocket(client
, FIONREAD
, (u_long
*)1);
3989 ok(ret
== -1, "expected failure\n");
3990 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
3992 WSASetLastError(0xdeadbeef);
3993 ret
= ioctlsocket(client
, SIOCATMARK
, (u_long
*)1);
3994 ok(ret
== -1, "expected failure\n");
3995 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
3997 WSASetLastError(0xdeadbeef);
3998 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, NULL
, NULL
);
3999 ok(ret
== -1, "expected failure\n");
4000 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4002 WSASetLastError(0xdeadbeef);
4004 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
) - 1, &size
, NULL
, NULL
);
4005 ok(ret
== -1, "expected failure\n");
4006 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4007 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4009 WSASetLastError(0xdeadbeef);
4010 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, NULL
, NULL
);
4011 ok(ret
== -1, "expected failure\n");
4012 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4014 WSASetLastError(0xdeadbeef);
4016 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
) - 1, &size
, NULL
, NULL
);
4017 ok(ret
== -1, "expected failure\n");
4018 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4019 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4021 check_fionread_siocatmark(client
, 0, TRUE
);
4023 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 123, 0);
4025 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, NULL
);
4026 ok(ret
== -1, "expected failure\n");
4027 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4029 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, NULL
);
4030 ok(ret
== -1, "expected failure\n");
4031 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4033 WSASetLastError(0xdeadbeef);
4036 overlapped
.Internal
= 0xdeadbeef;
4037 overlapped
.InternalHigh
= 0xdeadbeef;
4038 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, NULL
);
4039 ok(!ret
, "expected success\n");
4040 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4041 ok(!value
, "got %u\n", value
);
4042 ok(size
== sizeof(value
), "got size %u\n", size
);
4043 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4044 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4046 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4047 ok(ret
, "got error %u\n", GetLastError());
4048 ok(!size
, "got size %u\n", size
);
4049 ok(key
== 123, "got key %Iu\n", key
);
4050 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4052 WSASetLastError(0xdeadbeef);
4055 overlapped
.Internal
= 0xdeadbeef;
4056 overlapped
.InternalHigh
= 0xdeadbeef;
4057 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, NULL
);
4058 ok(!ret
, "expected success\n");
4059 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4060 ok(value
== TRUE
, "got %u\n", value
);
4061 ok(size
== sizeof(value
), "got size %u\n", size
);
4062 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4063 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4065 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4066 ok(ret
, "got error %u\n", GetLastError());
4067 ok(!size
, "got size %u\n", size
);
4068 ok(key
== 123, "got key %Iu\n", key
);
4069 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4071 ret
= send(server
, "data", 5, 0);
4072 ok(ret
== 5, "got %d\n", ret
);
4074 /* wait for the data to be available */
4075 check_poll_mask(client
, POLLRDNORM
, POLLRDNORM
);
4077 check_fionread_siocatmark(client
, 5, TRUE
);
4079 ret
= send(server
, "a", 1, MSG_OOB
);
4080 ok(ret
== 1, "got %d\n", ret
);
4082 /* wait for the data to be available */
4083 check_poll_mask(client
, POLLRDBAND
, POLLRDBAND
);
4085 check_fionread_siocatmark_todo_oob(client
, 5, FALSE
);
4087 ret
= send(server
, "a", 1, MSG_OOB
);
4088 ok(ret
== 1, "got %d\n", ret
);
4090 check_fionread_siocatmark_todo(client
, 5, FALSE
);
4092 ret
= recv(client
, buffer
, 3, 0);
4093 ok(ret
== 3, "got %d\n", ret
);
4095 check_fionread_siocatmark_todo(client
, 2, FALSE
);
4097 ret
= recv(client
, buffer
, 1, MSG_OOB
);
4098 ok(ret
== 1, "got %d\n", ret
);
4100 /* wait for the data to be available */
4101 check_poll_mask_todo(client
, POLLRDBAND
, POLLRDBAND
);
4103 check_fionread_siocatmark_todo(client
, 2, FALSE
);
4105 ret
= recv(client
, buffer
, 5, 0);
4106 todo_wine
ok(ret
== 2, "got %d\n", ret
);
4108 check_fionread_siocatmark(client
, 0, FALSE
);
4110 ret
= recv(client
, buffer
, 1, MSG_OOB
);
4111 todo_wine
ok(ret
== 1, "got %d\n", ret
);
4113 check_fionread_siocatmark_todo_oob(client
, 0, TRUE
);
4115 ret
= send(server
, "a", 1, MSG_OOB
);
4116 ok(ret
== 1, "got %d\n", ret
);
4118 /* wait for the data to be available */
4119 check_poll_mask(client
, POLLRDBAND
, POLLRDBAND
);
4122 ret
= setsockopt(client
, SOL_SOCKET
, SO_OOBINLINE
, (char *)&ret
, sizeof(ret
));
4123 ok(!ret
, "got error %u\n", WSAGetLastError());
4125 check_fionread_siocatmark_todo_oob(client
, 1, FALSE
);
4127 ret
= recv(client
, buffer
, 1, 0);
4128 ok(ret
== 1, "got %d\n", ret
);
4130 check_fionread_siocatmark(client
, 0, TRUE
);
4132 ret
= send(server
, "a", 1, MSG_OOB
);
4133 ok(ret
== 1, "got %d\n", ret
);
4135 /* wait for the data to be available */
4136 check_poll_mask(client
, POLLRDNORM
, POLLRDNORM
);
4138 check_fionread_siocatmark(client
, 1, TRUE
);
4140 closesocket(client
);
4141 closesocket(server
);
4143 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4145 check_fionread_siocatmark(server
, 0, TRUE
);
4147 ret
= bind(server
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
4148 ok(!ret
, "got error %u\n", WSAGetLastError());
4150 check_fionread_siocatmark(server
, 0, TRUE
);
4152 closesocket(server
);
4153 CloseHandle(overlapped
.hEvent
);
4155 /* test with APCs */
4157 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4159 ret
= WSAIoctl(server
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, socket_apc
);
4160 ok(ret
== -1, "expected failure\n");
4161 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4163 ret
= WSAIoctl(server
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, socket_apc
);
4164 ok(ret
== -1, "expected failure\n");
4165 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4169 ret
= WSAIoctl(server
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, socket_apc
);
4170 ok(!ret
, "expected success\n");
4171 ok(size
== sizeof(value
), "got size %u\n", size
);
4173 ret
= SleepEx(0, TRUE
);
4174 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4175 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4176 ok(!apc_error
, "got APC error %u\n", apc_error
);
4177 ok(!apc_size
, "got APC size %u\n", apc_size
);
4178 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4182 ret
= WSAIoctl(server
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, socket_apc
);
4183 ok(!ret
, "expected success\n");
4184 ok(size
== sizeof(value
), "got size %u\n", size
);
4186 ret
= SleepEx(0, TRUE
);
4187 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4188 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4189 ok(!apc_error
, "got APC error %u\n", apc_error
);
4190 ok(!apc_size
, "got APC size %u\n", apc_size
);
4191 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4193 closesocket(server
);
4196 static void test_fionbio(void)
4198 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
4199 u_long one
= 1, zero
= 0;
4207 event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
4208 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4209 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
4211 WSASetLastError(0xdeadbeef);
4212 ret
= ioctlsocket(s
, FIONBIO
, (u_long
*)1);
4213 ok(ret
== -1, "expected failure\n");
4214 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4216 WSASetLastError(0xdeadbeef);
4217 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, NULL
, NULL
);
4218 ok(ret
== -1, "expected failure\n");
4219 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4221 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) - 1, NULL
, 0, &size
, &overlapped
, NULL
);
4222 ok(ret
== -1, "expected failure\n");
4223 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4226 WSASetLastError(0xdeadbeef);
4227 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, NULL
, NULL
);
4228 ok(!ret
, "expected success\n");
4229 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4230 ok(!size
, "got size %u\n", size
);
4232 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) + 1, NULL
, 0, &size
, NULL
, NULL
);
4233 ok(!ret
, "got error %u\n", WSAGetLastError());
4235 output
= VirtualAlloc(NULL
, 4, MEM_RESERVE
| MEM_COMMIT
, PAGE_NOACCESS
);
4236 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) + 1, output
, 4, &size
, NULL
, NULL
);
4237 ok(!ret
, "got error %u\n", WSAGetLastError());
4238 VirtualFree(output
, 0, MEM_FREE
);
4240 overlapped
.Internal
= 0xdeadbeef;
4241 overlapped
.InternalHigh
= 0xdeadbeef;
4243 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, &overlapped
, NULL
);
4244 ok(!ret
, "expected success\n");
4245 ok(!size
, "got size %u\n", size
);
4247 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4248 ok(ret
, "got error %u\n", GetLastError());
4249 ok(!size
, "got size %u\n", size
);
4250 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4251 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4252 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4254 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, &overlapped
, NULL
);
4255 ok(ret
== -1, "expected failure\n");
4256 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4258 ret
= WSAEventSelect(s
, event
, FD_READ
);
4259 ok(!ret
, "got error %u\n", WSAGetLastError());
4261 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, NULL
, NULL
);
4262 ok(!ret
, "got error %u\n", WSAGetLastError());
4265 ret
= WSAIoctl(s
, FIONBIO
, &zero
, sizeof(zero
), NULL
, 0, &size
, NULL
, NULL
);
4266 ok(ret
== -1, "expected failure\n");
4267 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
4268 todo_wine
ok(!size
, "got size %u\n", size
);
4274 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4276 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, &overlapped
, socket_apc
);
4277 ok(ret
== -1, "expected failure\n");
4278 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4282 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, &overlapped
, socket_apc
);
4283 ok(!ret
, "expected success\n");
4284 ok(!size
, "got size %u\n", size
);
4286 ret
= SleepEx(0, TRUE
);
4287 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4288 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4289 ok(!apc_error
, "got APC error %u\n", apc_error
);
4290 ok(!apc_size
, "got APC size %u\n", apc_size
);
4291 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4296 static void test_keepalive_vals(void)
4298 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
4299 struct tcp_keepalive kalive
;
4306 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4307 ok(sock
!= INVALID_SOCKET
, "Creating the socket failed: %d\n", WSAGetLastError());
4308 port
= CreateIoCompletionPort((HANDLE
)sock
, NULL
, 123, 0);
4310 WSASetLastError(0xdeadbeef);
4312 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, 0, NULL
, 0, &size
, NULL
, NULL
);
4313 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4314 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4315 ok(!size
, "got size %u\n", size
);
4317 WSASetLastError(0xdeadbeef);
4319 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, NULL
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4320 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4321 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4322 ok(!size
, "got size %u\n", size
);
4324 WSASetLastError(0xdeadbeef);
4326 make_keepalive(kalive
, 0, 0, 0);
4327 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4328 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4329 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4330 ok(!size
, "got size %u\n", size
);
4332 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, NULL
, NULL
);
4333 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4334 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4336 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, &overlapped
, NULL
);
4337 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4338 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4340 WSASetLastError(0xdeadbeef);
4342 overlapped
.Internal
= 0xdeadbeef;
4343 overlapped
.InternalHigh
= 0xdeadbeef;
4344 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
) - 1, NULL
, 0, &size
, &overlapped
, NULL
);
4345 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4346 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4347 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4348 todo_wine
ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4349 ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
4351 WSASetLastError(0xdeadbeef);
4353 overlapped
.Internal
= 0xdeadbeef;
4354 overlapped
.InternalHigh
= 0xdeadbeef;
4355 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, &overlapped
, NULL
);
4356 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4357 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4358 todo_wine
ok(size
== 0xdeadbeef, "got size %u\n", size
);
4360 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4361 ok(ret
, "got error %u\n", GetLastError());
4362 ok(!size
, "got size %u\n", size
);
4363 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4364 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4365 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4367 make_keepalive(kalive
, 1, 0, 0);
4368 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4369 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4371 make_keepalive(kalive
, 1, 1000, 1000);
4372 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4373 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4375 make_keepalive(kalive
, 1, 10000, 10000);
4376 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4377 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4379 make_keepalive(kalive
, 1, 100, 100);
4380 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4381 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4383 make_keepalive(kalive
, 0, 100, 100);
4384 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
4385 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
4390 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4392 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, &overlapped
, socket_apc
);
4393 ok(ret
== -1, "expected failure\n");
4394 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4398 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, &overlapped
, socket_apc
);
4399 ok(!ret
, "expected success\n");
4400 ok(!size
, "got size %u\n", size
);
4402 ret
= SleepEx(0, TRUE
);
4403 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4404 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4405 ok(!apc_error
, "got APC error %u\n", apc_error
);
4406 ok(!apc_size
, "got APC size %u\n", apc_size
);
4407 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4412 static void test_unsupported_ioctls(void)
4414 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
4422 static const DWORD codes
[] = {0xdeadbeef, FIOASYNC
, 0x667e, SIO_FLUSH
};
4424 for (i
= 0; i
< ARRAY_SIZE(codes
); ++i
)
4426 winetest_push_context("ioctl %#x", codes
[i
]);
4427 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4428 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
4430 WSASetLastError(0xdeadbeef);
4431 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, NULL
, &overlapped
, NULL
);
4432 ok(ret
== -1, "expected failure\n");
4433 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4435 WSASetLastError(0xdeadbeef);
4437 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, NULL
, NULL
);
4438 ok(ret
== -1, "expected failure\n");
4439 ok(WSAGetLastError() == WSAEOPNOTSUPP
, "got error %u\n", WSAGetLastError());
4440 ok(!size
, "got size %u\n", size
);
4442 WSASetLastError(0xdeadbeef);
4444 overlapped
.Internal
= 0xdeadbeef;
4445 overlapped
.InternalHigh
= 0xdeadbeef;
4446 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, &overlapped
, NULL
);
4447 ok(ret
== -1, "expected failure\n");
4448 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
4449 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4451 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4452 ok(!ret
, "expected failure\n");
4453 ok(GetLastError() == ERROR_NOT_SUPPORTED
, "got error %u\n", GetLastError());
4454 ok(!size
, "got size %u\n", size
);
4455 ok(key
== 123, "got key %Iu\n", key
);
4456 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4457 ok((NTSTATUS
)overlapped
.Internal
== STATUS_NOT_SUPPORTED
,
4458 "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4459 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4464 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4466 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, NULL
, &overlapped
, socket_apc
);
4467 ok(ret
== -1, "expected failure\n");
4468 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4472 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, &overlapped
, socket_apc
);
4473 ok(ret
== -1, "expected failure\n");
4474 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
4475 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4477 ret
= SleepEx(0, TRUE
);
4478 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4479 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4480 ok(apc_error
== WSAEOPNOTSUPP
, "got APC error %u\n", apc_error
);
4481 ok(!apc_size
, "got APC size %u\n", apc_size
);
4482 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4485 winetest_pop_context();
4489 static void test_get_extension_func(void)
4491 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
4492 GUID acceptex_guid
= WSAID_ACCEPTEX
;
4493 GUID bogus_guid
= {0xdeadbeef};
4501 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4502 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
4504 WSASetLastError(0xdeadbeef);
4505 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
4506 &func
, sizeof(func
), NULL
, &overlapped
, NULL
);
4507 ok(ret
== -1, "expected failure\n");
4508 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4510 WSASetLastError(0xdeadbeef);
4512 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
4513 &func
, sizeof(func
), &size
, NULL
, NULL
);
4514 ok(!ret
, "expected success\n");
4515 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4516 ok(size
== sizeof(func
), "got size %u\n", size
);
4518 WSASetLastError(0xdeadbeef);
4520 overlapped
.Internal
= 0xdeadbeef;
4521 overlapped
.InternalHigh
= 0xdeadbeef;
4522 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
4523 &func
, sizeof(func
), &size
, &overlapped
, NULL
);
4524 ok(!ret
, "expected success\n");
4525 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4526 ok(size
== sizeof(func
), "got size %u\n", size
);
4528 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4529 ok(ret
, "got error %u\n", GetLastError());
4530 ok(!size
, "got size %u\n", size
);
4531 ok(key
== 123, "got key %Iu\n", key
);
4532 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4533 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4534 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4537 overlapped
.Internal
= 0xdeadbeef;
4538 overlapped
.InternalHigh
= 0xdeadbeef;
4539 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &bogus_guid
, sizeof(GUID
),
4540 &func
, sizeof(func
), &size
, &overlapped
, NULL
);
4541 ok(ret
== -1, "expected failure\n");
4542 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
4543 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4544 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4545 ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
4547 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4548 ok(!ret
, "expected failure\n");
4549 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", WSAGetLastError());
4554 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4556 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
4557 &func
, sizeof(func
), NULL
, &overlapped
, socket_apc
);
4558 ok(ret
== -1, "expected failure\n");
4559 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4563 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
4564 &func
, sizeof(func
), &size
, &overlapped
, socket_apc
);
4565 ok(!ret
, "got error %u\n", WSAGetLastError());
4566 ok(size
== sizeof(func
), "got size %u\n", size
);
4568 ret
= SleepEx(0, TRUE
);
4569 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4570 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4571 ok(!apc_error
, "got APC error %u\n", apc_error
);
4572 ok(!apc_size
, "got APC size %u\n", apc_size
);
4573 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4578 static void test_base_handle(void)
4580 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
4590 int family
, type
, protocol
;
4594 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
4595 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
4596 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
4597 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
},
4600 for (i
= 0; i
< ARRAY_SIZE(tests
); ++i
)
4602 s
= socket(tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
);
4603 if (s
== INVALID_SOCKET
) continue;
4604 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
4606 WSASetLastError(0xdeadbeef);
4607 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), NULL
, &overlapped
, NULL
);
4608 ok(ret
== -1, "expected failure\n");
4609 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4611 WSASetLastError(0xdeadbeef);
4614 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, NULL
, NULL
);
4615 ok(!ret
, "expected success\n");
4616 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
4617 ok(size
== sizeof(base
), "got size %u\n", size
);
4618 ok(base
== s
, "expected %#Ix, got %#Ix\n", s
, base
);
4620 WSASetLastError(0xdeadbeef);
4623 overlapped
.Internal
= 0xdeadbeef;
4624 overlapped
.InternalHigh
= 0xdeadbeef;
4625 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, &overlapped
, NULL
);
4626 ok(ret
== -1, "expected failure\n");
4627 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
4628 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4630 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
4631 ok(!ret
, "expected failure\n");
4632 ok(GetLastError() == ERROR_NOT_SUPPORTED
, "got error %u\n", GetLastError());
4633 ok(!size
, "got size %u\n", size
);
4634 ok(key
== 123, "got key %Iu\n", key
);
4635 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
4636 ok((NTSTATUS
)overlapped
.Internal
== STATUS_NOT_SUPPORTED
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
4637 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
4638 ok(base
== 0xdeadbeef, "expected %#Ix, got %#Ix\n", s
, base
);
4643 s
= socket(tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
);
4645 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), NULL
, &overlapped
, socket_apc
);
4646 ok(ret
== -1, "expected failure\n");
4647 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
4652 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, &overlapped
, socket_apc
);
4653 ok(ret
== -1, "expected failure\n");
4654 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
4655 ok(size
== 0xdeadbeef, "got size %u\n", size
);
4657 ret
= SleepEx(0, TRUE
);
4658 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
4659 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
4660 ok(apc_error
== WSAEOPNOTSUPP
, "got APC error %u\n", apc_error
);
4661 ok(!apc_size
, "got APC size %u\n", apc_size
);
4662 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
4663 ok(base
== 0xdeadbeef, "expected %#Ix, got %#Ix\n", s
, base
);
4669 static BOOL drain_pause
= FALSE
;
4670 static DWORD WINAPI
drain_socket_thread(LPVOID arg
)
4673 SOCKET sock
= *(SOCKET
*)arg
;
4676 while ((ret
= recv(sock
, buffer
, sizeof(buffer
), 0)) != 0)
4680 if (WSAGetLastError() == WSAEWOULDBLOCK
)
4684 FD_SET(sock
, &readset
);
4685 select(sock
+1, &readset
, NULL
, NULL
, NULL
);
4696 static void test_send(void)
4698 SOCKET src
= INVALID_SOCKET
;
4699 SOCKET dst
= INVALID_SOCKET
;
4700 HANDLE hThread
= NULL
;
4701 const int buflen
= 1024*1024;
4702 char *buffer
= NULL
;
4703 int ret
, i
, zero
= 0;
4707 DWORD id
, bytes_sent
, dwRet
;
4709 memset(&ov
, 0, sizeof(ov
));
4711 tcp_socketpair(&src
, &dst
);
4713 set_blocking(dst
, FALSE
);
4714 /* force disable buffering so we can get a pending overlapped request */
4715 ret
= setsockopt(dst
, SOL_SOCKET
, SO_SNDBUF
, (char *) &zero
, sizeof(zero
));
4716 ok(!ret
, "setsockopt SO_SNDBUF failed: %d - %d\n", ret
, GetLastError());
4718 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
4720 buffer
= HeapAlloc(GetProcessHeap(), 0, buflen
);
4722 /* fill the buffer with some nonsense */
4723 for (i
= 0; i
< buflen
; ++i
)
4725 buffer
[i
] = (char) i
;
4728 ret
= send(src
, buffer
, buflen
, 0);
4729 ok(ret
== buflen
, "send should have sent %d bytes, but it only sent %d\n", buflen
, ret
);
4734 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
4735 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
4740 WSASetLastError(12345);
4741 ret
= WSASend(dst
, &buf
, 1, &bytes_sent
, 0, &ov
, NULL
);
4742 ok(ret
== SOCKET_ERROR
, "expected failure\n");
4743 ok(WSAGetLastError() == ERROR_IO_PENDING
, "wrong error %u\n", WSAGetLastError());
4745 /* don't check for completion yet, we may need to drain the buffer while still sending */
4746 set_blocking(src
, FALSE
);
4747 for (i
= 0; i
< buflen
; ++i
)
4751 ret
= recv(src
, buffer
, 1, 0);
4752 while (ret
== SOCKET_ERROR
&& GetLastError() == WSAEWOULDBLOCK
&& j
< 100)
4756 ret
= recv(src
, buffer
, 1, 0);
4759 ok(ret
== 1, "Failed to receive data %d - %d (got %d/%d)\n", ret
, GetLastError(), i
, buflen
);
4763 ok(buffer
[0] == (char) i
, "Received bad data at position %d\n", i
);
4766 dwRet
= WaitForSingleObject(ov
.hEvent
, 1000);
4767 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
4768 if (dwRet
== WAIT_OBJECT_0
)
4770 bret
= GetOverlappedResult((HANDLE
)dst
, &ov
, &bytes_sent
, FALSE
);
4771 ok(bret
&& bytes_sent
== buflen
,
4772 "Got %d instead of %d (%d - %d)\n", bytes_sent
, buflen
, bret
, GetLastError());
4775 WSASetLastError(12345);
4776 ret
= WSASend(INVALID_SOCKET
, &buf
, 1, NULL
, 0, &ov
, NULL
);
4777 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
4778 "WSASend failed %d - %d\n", ret
, WSAGetLastError());
4780 WSASetLastError(12345);
4781 ret
= WSASend(dst
, &buf
, 1, NULL
, 0, &ov
, NULL
);
4782 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
,
4783 "Failed to start overlapped send %d - %d\n", ret
, WSAGetLastError());
4786 if (src
!= INVALID_SOCKET
)
4788 if (dst
!= INVALID_SOCKET
)
4790 if (hThread
!= NULL
)
4792 dwRet
= WaitForSingleObject(hThread
, 500);
4793 ok(dwRet
== WAIT_OBJECT_0
, "failed to wait for thread termination: %d\n", GetLastError());
4794 CloseHandle(hThread
);
4797 CloseHandle(ov
.hEvent
);
4798 HeapFree(GetProcessHeap(), 0, buffer
);
4801 #define WM_SOCKET (WM_USER+100)
4803 struct event_test_ctx
4811 static void select_events(struct event_test_ctx
*ctx
, SOCKET socket
, LONG events
)
4815 if (ctx
->is_message
)
4816 ret
= WSAAsyncSelect(socket
, ctx
->window
, WM_USER
, events
);
4818 ret
= WSAEventSelect(socket
, ctx
->event
, events
);
4819 ok(!ret
, "failed to select, error %u\n", WSAGetLastError());
4820 ctx
->socket
= socket
;
4823 #define check_events(a, b, c, d) check_events_(__LINE__, a, b, c, d, FALSE, FALSE)
4824 #define check_events_todo(a, b, c, d) check_events_(__LINE__, a, b, c, d, TRUE, TRUE)
4825 #define check_events_todo_event(a, b, c, d) check_events_(__LINE__, a, b, c, d, TRUE, FALSE)
4826 #define check_events_todo_msg(a, b, c, d) check_events_(__LINE__, a, b, c, d, FALSE, TRUE)
4827 static void check_events_(int line
, struct event_test_ctx
*ctx
,
4828 LONG flag1
, LONG flag2
, DWORD timeout
, BOOL todo_event
, BOOL todo_msg
)
4832 if (ctx
->is_message
)
4834 BOOL any_fail
= FALSE
;
4839 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
4840 while (!ret
&& !MsgWaitForMultipleObjects(0, NULL
, FALSE
, timeout
, QS_POSTMESSAGE
))
4841 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
4842 todo_wine_if (todo_msg
&& !ret
) ok_(__FILE__
, line
)(ret
, "expected a message\n");
4845 ok_(__FILE__
, line
)(msg
.wParam
== ctx
->socket
,
4846 "expected wparam %#Ix, got %#Ix\n", ctx
->socket
, msg
.wParam
);
4847 todo_wine_if (todo_msg
&& msg
.lParam
!= flag1
)
4848 ok_(__FILE__
, line
)(msg
.lParam
== flag1
, "got first event %#Ix\n", msg
.lParam
);
4849 if (msg
.lParam
!= flag1
) any_fail
= TRUE
;
4856 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
4857 while (!ret
&& !MsgWaitForMultipleObjects(0, NULL
, FALSE
, timeout
, QS_POSTMESSAGE
))
4858 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
4859 ok_(__FILE__
, line
)(ret
, "expected a message\n");
4860 ok_(__FILE__
, line
)(msg
.wParam
== ctx
->socket
, "got wparam %#Ix\n", msg
.wParam
);
4861 todo_wine_if (todo_msg
) ok_(__FILE__
, line
)(msg
.lParam
== flag2
, "got second event %#Ix\n", msg
.lParam
);
4863 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
4864 todo_wine_if (todo_msg
&& ret
) ok_(__FILE__
, line
)(!ret
, "got unexpected event %#Ix\n", msg
.lParam
);
4865 if (ret
) any_fail
= TRUE
;
4867 /* catch tests which succeed */
4868 todo_wine_if (todo_msg
) ok_(__FILE__
, line
)(!any_fail
, "event series matches\n");
4872 WSANETWORKEVENTS events
;
4874 ret
= WaitForSingleObject(ctx
->event
, timeout
);
4876 todo_wine_if (todo_event
&& ret
) ok_(__FILE__
, line
)(!ret
, "event wait timed out\n");
4878 todo_wine_if (todo_event
) ok_(__FILE__
, line
)(ret
== WAIT_TIMEOUT
, "expected timeout\n");
4879 ret
= WSAEnumNetworkEvents(ctx
->socket
, ctx
->event
, &events
);
4880 ok_(__FILE__
, line
)(!ret
, "failed to get events, error %u\n", WSAGetLastError());
4881 todo_wine_if (todo_event
)
4882 ok_(__FILE__
, line
)(events
.lNetworkEvents
== (flag1
| flag2
), "got events %#x\n", events
.lNetworkEvents
);
4886 static void test_accept_events(struct event_test_ctx
*ctx
)
4888 const struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
4889 SOCKET listener
, server
, client
, client2
;
4890 struct sockaddr_in destaddr
;
4893 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4894 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4896 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
4898 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
4899 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
4900 len
= sizeof(destaddr
);
4901 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
4902 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
4903 ret
= listen(listener
, 2);
4904 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
4906 check_events(ctx
, 0, 0, 0);
4908 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4909 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4910 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4911 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
4913 check_events(ctx
, FD_ACCEPT
, 0, 200);
4914 check_events(ctx
, 0, 0, 0);
4915 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
4916 if (ctx
->is_message
)
4917 check_events(ctx
, FD_ACCEPT
, 0, 200);
4918 check_events(ctx
, 0, 0, 0);
4919 select_events(ctx
, listener
, 0);
4920 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
4921 if (ctx
->is_message
)
4922 check_events(ctx
, FD_ACCEPT
, 0, 200);
4923 check_events(ctx
, 0, 0, 0);
4925 client2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4926 ok(client2
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4927 ret
= connect(client2
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4928 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
4930 if (!ctx
->is_message
)
4931 check_events_todo(ctx
, FD_ACCEPT
, 0, 200);
4932 check_events(ctx
, 0, 0, 0);
4934 server
= accept(listener
, NULL
, NULL
);
4935 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
4936 closesocket(server
);
4938 check_events(ctx
, FD_ACCEPT
, 0, 200);
4939 check_events(ctx
, 0, 0, 0);
4941 server
= accept(listener
, NULL
, NULL
);
4942 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
4943 closesocket(server
);
4945 check_events(ctx
, 0, 0, 0);
4947 closesocket(client2
);
4948 closesocket(client
);
4950 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4951 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4952 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4953 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
4955 check_events(ctx
, FD_ACCEPT
, 0, 200);
4957 server
= accept(listener
, NULL
, NULL
);
4958 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
4959 closesocket(server
);
4960 closesocket(client
);
4962 check_events(ctx
, 0, 0, 200);
4964 closesocket(listener
);
4966 /* Connect and then select. */
4968 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4969 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4970 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
4971 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
4972 len
= sizeof(destaddr
);
4973 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
4974 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
4975 ret
= listen(listener
, 2);
4976 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
4978 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4979 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4980 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4981 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
4983 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
4985 check_events(ctx
, FD_ACCEPT
, 0, 200);
4987 server
= accept(listener
, NULL
, NULL
);
4988 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
4989 closesocket(server
);
4990 closesocket(client
);
4992 /* As above, but select on a subset not containing FD_ACCEPT first. */
4994 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
4996 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4997 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4998 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4999 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
5001 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
5002 check_events(ctx
, FD_ACCEPT
, 0, 200);
5004 server
= accept(listener
, NULL
, NULL
);
5005 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
5006 closesocket(server
);
5007 closesocket(client
);
5009 /* As above, but call accept() before selecting. */
5011 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
5013 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5014 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5015 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
5016 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
5018 server
= accept(listener
, NULL
, NULL
);
5019 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
5021 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
5022 check_events(ctx
, 0, 0, 200);
5024 closesocket(server
);
5025 closesocket(client
);
5027 closesocket(listener
);
5030 static void test_connect_events(struct event_test_ctx
*ctx
)
5032 const struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
5033 SOCKET listener
, server
, client
;
5034 struct sockaddr_in destaddr
;
5037 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5038 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5039 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
5040 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
5041 len
= sizeof(destaddr
);
5042 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
5043 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
5044 ret
= listen(listener
, 2);
5045 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
5047 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5048 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5050 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5051 check_events(ctx
, 0, 0, 0);
5053 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
5054 ok(!ret
|| WSAGetLastError() == WSAEWOULDBLOCK
, "failed to connect, error %u\n", WSAGetLastError());
5056 check_events(ctx
, FD_CONNECT
, FD_WRITE
, 200);
5057 check_events(ctx
, 0, 0, 0);
5058 select_events(ctx
, client
, 0);
5059 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5060 if (ctx
->is_message
)
5061 check_events(ctx
, FD_WRITE
, 0, 200);
5062 check_events(ctx
, 0, 0, 0);
5064 server
= accept(listener
, NULL
, NULL
);
5065 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
5067 closesocket(client
);
5068 closesocket(server
);
5070 /* Connect and then select. */
5072 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5073 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5075 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
5076 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
5078 server
= accept(listener
, NULL
, NULL
);
5079 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
5081 ret
= send(client
, "data", 5, 0);
5082 ok(ret
== 5, "got %d\n", ret
);
5084 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5085 if (ctx
->is_message
)
5086 check_events(ctx
, FD_WRITE
, 0, 200);
5088 check_events(ctx
, FD_CONNECT
, FD_WRITE
, 200);
5090 closesocket(client
);
5091 closesocket(server
);
5093 /* As above, but select on a subset not containing FD_CONNECT first. */
5095 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5096 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5098 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_OOB
| FD_READ
| FD_WRITE
);
5100 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
5101 ok(!ret
|| WSAGetLastError() == WSAEWOULDBLOCK
, "failed to connect, error %u\n", WSAGetLastError());
5103 server
= accept(listener
, NULL
, NULL
);
5104 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
5106 check_events(ctx
, FD_WRITE
, 0, 200);
5108 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5110 if (ctx
->is_message
)
5111 check_events(ctx
, FD_WRITE
, 0, 200);
5113 check_events_todo(ctx
, FD_CONNECT
, 0, 200);
5115 closesocket(client
);
5116 closesocket(server
);
5118 closesocket(listener
);
5121 /* perform a blocking recv() even on a nonblocking socket */
5122 static int sync_recv(SOCKET s
, void *buffer
, int len
, DWORD flags
)
5124 OVERLAPPED overlapped
= {0};
5129 overlapped
.hEvent
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
5130 wsabuf
.buf
= buffer
;
5132 ret
= WSARecv(s
, &wsabuf
, 1, &ret_len
, &flags
, &overlapped
, NULL
);
5133 if (ret
== -1 && WSAGetLastError() == ERROR_IO_PENDING
)
5135 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
5136 ok(!ret
, "wait timed out\n");
5137 ret
= WSAGetOverlappedResult(s
, &overlapped
, &ret_len
, FALSE
, &flags
);
5138 ret
= (ret
? 0 : -1);
5140 CloseHandle(overlapped
.hEvent
);
5141 if (!ret
) return ret_len
;
5145 static void test_write_events(struct event_test_ctx
*ctx
)
5147 static const int buffer_size
= 1024 * 1024;
5148 SOCKET server
, client
;
5152 buffer
= malloc(buffer_size
);
5154 tcp_socketpair(&client
, &server
);
5155 set_blocking(client
, FALSE
);
5157 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5158 check_events(ctx
, FD_WRITE
, 0, 200);
5159 check_events(ctx
, 0, 0, 0);
5160 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5161 if (ctx
->is_message
)
5162 check_events(ctx
, FD_WRITE
, 0, 200);
5163 check_events(ctx
, 0, 0, 0);
5164 select_events(ctx
, server
, 0);
5165 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5166 if (ctx
->is_message
)
5167 check_events(ctx
, FD_WRITE
, 0, 200);
5168 check_events(ctx
, 0, 0, 0);
5170 ret
= send(server
, "data", 5, 0);
5171 ok(ret
== 5, "got %d\n", ret
);
5173 check_events(ctx
, 0, 0, 0);
5175 ret
= sync_recv(client
, buffer
, buffer_size
, 0);
5176 ok(ret
== 5, "got %d\n", ret
);
5178 check_events(ctx
, 0, 0, 0);
5182 while ((ret
= send(server
, buffer
, buffer_size
, 0)) == buffer_size
);
5183 /* Windows will never send less than buffer_size bytes here, but Linux
5184 * may do a short write. */
5185 todo_wine_if (ret
> 0)
5187 ok(ret
== -1, "got %d\n", ret
);
5188 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
5191 while (recv(client
, buffer
, buffer_size
, 0) > 0);
5192 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
5194 /* Broken on Windows versions older than win10v1607 (though sometimes
5195 * works regardless, for unclear reasons. */
5196 check_events(ctx
, FD_WRITE
, 0, 200);
5197 check_events(ctx
, 0, 0, 0);
5198 select_events(ctx
, server
, 0);
5199 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5200 if (ctx
->is_message
)
5201 check_events(ctx
, FD_WRITE
, 0, 200);
5202 check_events(ctx
, 0, 0, 0);
5205 closesocket(server
);
5206 closesocket(client
);
5208 /* Despite the documentation, and unlike FD_ACCEPT and FD_RECV, calling
5209 * send() doesn't clear the FD_WRITE bit. */
5211 tcp_socketpair(&client
, &server
);
5213 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
5215 ret
= send(server
, "data", 5, 0);
5216 ok(ret
== 5, "got %d\n", ret
);
5218 check_events(ctx
, FD_WRITE
, 0, 200);
5220 closesocket(server
);
5221 closesocket(client
);
5226 static void test_read_events(struct event_test_ctx
*ctx
)
5228 SOCKET server
, client
;
5233 tcp_socketpair(&client
, &server
);
5234 set_blocking(client
, FALSE
);
5236 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5237 check_events(ctx
, 0, 0, 0);
5239 ret
= send(client
, "data", 5, 0);
5240 ok(ret
== 5, "got %d\n", ret
);
5242 check_events(ctx
, FD_READ
, 0, 200);
5243 check_events(ctx
, 0, 0, 0);
5244 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5245 if (ctx
->is_message
)
5246 check_events(ctx
, FD_READ
, 0, 200);
5247 check_events(ctx
, 0, 0, 0);
5248 select_events(ctx
, server
, 0);
5249 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5250 if (ctx
->is_message
)
5251 check_events(ctx
, FD_READ
, 0, 200);
5252 check_events(ctx
, 0, 0, 0);
5254 ret
= send(client
, "data", 5, 0);
5255 ok(ret
== 5, "got %d\n", ret
);
5257 if (!ctx
->is_message
)
5258 check_events_todo(ctx
, FD_READ
, 0, 200);
5259 check_events(ctx
, 0, 0, 0);
5261 ret
= recv(server
, buffer
, 2, 0);
5262 ok(ret
== 2, "got %d\n", ret
);
5264 check_events(ctx
, FD_READ
, 0, 200);
5265 check_events(ctx
, 0, 0, 0);
5267 ret
= recv(server
, buffer
, -1, 0);
5268 ok(ret
== -1, "got %d\n", ret
);
5269 ok(WSAGetLastError() == WSAEFAULT
|| WSAGetLastError() == WSAENOBUFS
/* < Windows 7 */,
5270 "got error %u\n", WSAGetLastError());
5272 if (ctx
->is_message
)
5273 check_events_todo_msg(ctx
, FD_READ
, 0, 200);
5274 check_events(ctx
, 0, 0, 0);
5276 for (i
= 0; i
< 8; ++i
)
5278 ret
= sync_recv(server
, buffer
, 1, 0);
5279 ok(ret
== 1, "got %d\n", ret
);
5282 check_events(ctx
, FD_READ
, 0, 200);
5283 check_events(ctx
, 0, 0, 0);
5286 /* Send data while we're not selecting. */
5288 select_events(ctx
, server
, 0);
5289 ret
= send(client
, "data", 5, 0);
5290 ok(ret
== 5, "got %d\n", ret
);
5291 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5293 check_events(ctx
, FD_READ
, 0, 200);
5295 ret
= recv(server
, buffer
, 5, 0);
5296 ok(ret
== 5, "got %d\n", ret
);
5298 select_events(ctx
, server
, 0);
5299 ret
= send(client
, "data", 5, 0);
5300 ok(ret
== 5, "got %d\n", ret
);
5301 ret
= sync_recv(server
, buffer
, 5, 0);
5302 ok(ret
== 5, "got %d\n", ret
);
5303 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
);
5305 check_events(ctx
, 0, 0, 200);
5307 closesocket(server
);
5308 closesocket(client
);
5311 static void test_oob_events(struct event_test_ctx
*ctx
)
5313 SOCKET server
, client
;
5317 tcp_socketpair(&client
, &server
);
5318 set_blocking(client
, FALSE
);
5320 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5321 check_events(ctx
, 0, 0, 0);
5323 ret
= send(client
, "a", 1, MSG_OOB
);
5324 ok(ret
== 1, "got %d\n", ret
);
5326 check_events(ctx
, FD_OOB
, 0, 200);
5327 check_events(ctx
, 0, 0, 0);
5328 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5329 if (ctx
->is_message
)
5330 check_events(ctx
, FD_OOB
, 0, 200);
5331 check_events(ctx
, 0, 0, 0);
5332 select_events(ctx
, server
, 0);
5333 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5334 if (ctx
->is_message
)
5335 check_events(ctx
, FD_OOB
, 0, 200);
5336 check_events(ctx
, 0, 0, 0);
5338 ret
= send(client
, "b", 1, MSG_OOB
);
5339 ok(ret
== 1, "got %d\n", ret
);
5341 if (!ctx
->is_message
)
5342 check_events_todo_event(ctx
, FD_OOB
, 0, 200);
5343 check_events(ctx
, 0, 0, 0);
5345 ret
= recv(server
, buffer
, 1, MSG_OOB
);
5346 ok(ret
== 1, "got %d\n", ret
);
5348 check_events_todo(ctx
, FD_OOB
, 0, 200);
5349 check_events(ctx
, 0, 0, 0);
5351 ret
= recv(server
, buffer
, 1, MSG_OOB
);
5352 todo_wine
ok(ret
== 1, "got %d\n", ret
);
5354 check_events(ctx
, 0, 0, 0);
5356 /* Send data while we're not selecting. */
5358 select_events(ctx
, server
, 0);
5359 ret
= send(client
, "a", 1, MSG_OOB
);
5360 ok(ret
== 1, "got %d\n", ret
);
5361 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5363 check_events(ctx
, FD_OOB
, 0, 200);
5365 ret
= recv(server
, buffer
, 1, MSG_OOB
);
5366 ok(ret
== 1, "got %d\n", ret
);
5368 closesocket(server
);
5369 closesocket(client
);
5372 static void test_close_events(struct event_test_ctx
*ctx
)
5374 SOCKET server
, client
;
5378 /* Test closesocket(). */
5380 tcp_socketpair(&client
, &server
);
5382 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5384 closesocket(client
);
5386 check_events(ctx
, FD_CLOSE
, 0, 200);
5387 check_events(ctx
, 0, 0, 0);
5388 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5389 if (ctx
->is_message
)
5390 check_events(ctx
, FD_CLOSE
, 0, 200);
5391 check_events(ctx
, 0, 0, 0);
5392 select_events(ctx
, server
, 0);
5393 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5394 if (ctx
->is_message
)
5395 check_events(ctx
, FD_CLOSE
, 0, 200);
5396 check_events(ctx
, 0, 0, 0);
5398 ret
= recv(server
, buffer
, 5, 0);
5399 ok(!ret
, "got %d\n", ret
);
5401 check_events(ctx
, 0, 0, 0);
5403 closesocket(server
);
5405 /* Test shutdown(remote end, SD_SEND). */
5407 tcp_socketpair(&client
, &server
);
5409 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5411 shutdown(client
, SD_SEND
);
5413 check_events(ctx
, FD_CLOSE
, 0, 200);
5414 check_events(ctx
, 0, 0, 0);
5416 closesocket(client
);
5418 check_events(ctx
, 0, 0, 0);
5420 closesocket(server
);
5422 /* No other shutdown() call generates an event. */
5424 tcp_socketpair(&client
, &server
);
5426 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5428 shutdown(client
, SD_RECEIVE
);
5429 shutdown(server
, SD_BOTH
);
5431 check_events(ctx
, 0, 0, 200);
5433 shutdown(client
, SD_SEND
);
5435 check_events_todo(ctx
, FD_CLOSE
, 0, 200);
5436 check_events(ctx
, 0, 0, 0);
5438 closesocket(server
);
5439 closesocket(client
);
5441 /* Test sending data before calling closesocket(). */
5443 tcp_socketpair(&client
, &server
);
5445 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5447 ret
= send(client
, "data", 5, 0);
5448 ok(ret
== 5, "got %d\n", ret
);
5450 check_events(ctx
, FD_READ
, 0, 200);
5452 closesocket(client
);
5454 check_events_todo(ctx
, FD_CLOSE
, 0, 200);
5456 ret
= recv(server
, buffer
, 3, 0);
5457 ok(ret
== 3, "got %d\n", ret
);
5459 check_events(ctx
, FD_READ
, 0, 200);
5461 ret
= recv(server
, buffer
, 5, 0);
5462 ok(ret
== 2, "got %d\n", ret
);
5464 check_events_todo(ctx
, 0, 0, 0);
5466 closesocket(server
);
5468 /* Close and then select. */
5470 tcp_socketpair(&client
, &server
);
5471 closesocket(client
);
5473 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5474 check_events(ctx
, FD_CLOSE
, 0, 200);
5476 closesocket(server
);
5478 /* As above, but select on a subset not containing FD_CLOSE first. */
5480 tcp_socketpair(&client
, &server
);
5482 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
);
5484 closesocket(client
);
5486 check_events(ctx
, 0, 0, 200);
5487 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
5488 check_events_todo_event(ctx
, FD_CLOSE
, 0, 200);
5490 closesocket(server
);
5493 static void test_events(void)
5495 struct event_test_ctx ctx
;
5497 ctx
.is_message
= FALSE
;
5498 ctx
.event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
5500 test_accept_events(&ctx
);
5501 test_connect_events(&ctx
);
5502 test_write_events(&ctx
);
5503 test_read_events(&ctx
);
5504 test_close_events(&ctx
);
5505 test_oob_events(&ctx
);
5507 CloseHandle(ctx
.event
);
5509 ctx
.is_message
= TRUE
;
5510 ctx
.window
= CreateWindowA("Message", NULL
, 0, 0, 0, 0, 0, HWND_MESSAGE
, NULL
, NULL
, NULL
);
5512 test_accept_events(&ctx
);
5513 test_connect_events(&ctx
);
5514 test_write_events(&ctx
);
5515 test_read_events(&ctx
);
5516 test_close_events(&ctx
);
5517 test_oob_events(&ctx
);
5519 DestroyWindow(ctx
.window
);
5522 static void test_ipv6only(void)
5524 SOCKET v4
= INVALID_SOCKET
, v6
;
5525 struct sockaddr_in sin4
;
5526 struct sockaddr_in6 sin6
;
5527 int ret
, enabled
, len
= sizeof(enabled
);
5529 memset(&sin4
, 0, sizeof(sin4
));
5530 sin4
.sin_family
= AF_INET
;
5531 sin4
.sin_port
= htons(SERVERPORT
);
5533 memset(&sin6
, 0, sizeof(sin6
));
5534 sin6
.sin6_family
= AF_INET6
;
5535 sin6
.sin6_port
= htons(SERVERPORT
);
5537 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
5538 if (v6
== INVALID_SOCKET
)
5540 skip("Could not create IPv6 socket (LastError: %d)\n", WSAGetLastError());
5545 ret
= getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5546 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5547 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
5549 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
5550 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
5552 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5553 ok(v4
!= INVALID_SOCKET
, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
5557 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5558 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5559 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
5563 len
= sizeof(enabled
);
5564 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
5565 ok(!ret
, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5569 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5570 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5571 ok(!enabled
, "expected 0, got %d\n", enabled
);
5575 len
= sizeof(enabled
);
5576 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
5577 ok(!ret
, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5579 /* bind on IPv4 socket should succeed - IPV6_V6ONLY is enabled by default */
5580 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
5581 ok(!ret
, "Could not bind IPv4 address (LastError: %d)\n", WSAGetLastError());
5585 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5586 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5587 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
5591 len
= sizeof(enabled
);
5592 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
5593 ok(ret
, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
5597 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5598 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5599 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
5603 len
= sizeof(enabled
);
5604 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
5605 ok(ret
, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
5610 /* Test again, this time disabling IPV6_V6ONLY. */
5611 sin4
.sin_port
= htons(SERVERPORT
+2);
5612 sin6
.sin6_port
= htons(SERVERPORT
+2);
5614 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
5615 ok(v6
!= INVALID_SOCKET
, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
5616 WSAGetLastError(), WSAEAFNOSUPPORT
);
5619 ret
= setsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
5620 ok(!ret
, "Could not disable IPV6_V6ONLY (LastError: %d).\n", WSAGetLastError());
5623 ret
= getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5624 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5625 ok(!enabled
, "expected 0, got %d\n", enabled
);
5629 On Windows, bind on both IPv4 and IPv6 with IPV6_V6ONLY disabled succeeds by default.
5630 Application must set SO_EXCLUSIVEADDRUSE on first socket to disallow another successful bind.
5631 In general, a standard application should not use SO_REUSEADDR.
5632 Setting both SO_EXCLUSIVEADDRUSE and SO_REUSEADDR on the same socket is not possible in
5633 either order, the later setsockopt call always fails.
5636 ret
= setsockopt(v6
, SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, (char*)&enabled
, len
);
5637 ok(!ret
, "Could not set SO_EXCLUSIVEADDRUSE on IPv6 socket (LastError: %d)\n", WSAGetLastError());
5639 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
5640 ok(!ret
, "Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
5643 len
= sizeof(enabled
);
5644 getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
5645 ok(!ret
, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
5646 ok(!enabled
, "IPV6_V6ONLY is enabled after bind\n");
5648 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5649 ok(v4
!= INVALID_SOCKET
, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
5652 ret
= setsockopt(v4
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&enabled
, len
);
5653 ok(!ret
, "Could not set SO_REUSEADDR on IPv4 socket (LastError: %d)\n", WSAGetLastError());
5655 WSASetLastError(0xdeadbeef);
5656 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
5657 ok(ret
, "bind succeeded unexpectedly for the IPv4 socket\n");
5658 ok(WSAGetLastError() == WSAEACCES
, "Expected 10013, got %d\n", WSAGetLastError());
5661 if (v4
!= INVALID_SOCKET
)
5663 if (v6
!= INVALID_SOCKET
)
5667 static void test_WSASendMsg(void)
5670 struct sockaddr_in sendaddr
, sockaddr
;
5671 GUID WSASendMsg_GUID
= WSAID_WSASENDMSG
;
5672 LPFN_WSASENDMSG pWSASendMsg
= NULL
;
5673 char teststr
[12] = "hello world", buffer
[32];
5676 DWORD bytesSent
, err
;
5679 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
5681 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
5682 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
5684 /* Obtain the WSASendMsg function */
5685 WSAIoctl(sock
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSASendMsg_GUID
, sizeof(WSASendMsg_GUID
),
5686 &pWSASendMsg
, sizeof(pWSASendMsg
), &err
, NULL
, NULL
);
5690 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
5694 /* fake address for now */
5695 sendaddr
.sin_family
= AF_INET
;
5696 sendaddr
.sin_port
= htons(139);
5697 sendaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5699 memset(&msg
, 0, sizeof(msg
));
5700 iovec
[0].buf
= teststr
;
5701 iovec
[0].len
= sizeof(teststr
);
5702 iovec
[1].buf
= teststr
;
5703 iovec
[1].len
= sizeof(teststr
) / 2;
5704 msg
.name
= (struct sockaddr
*) &sendaddr
;
5705 msg
.namelen
= sizeof(sendaddr
);
5706 msg
.lpBuffers
= iovec
;
5707 msg
.dwBufferCount
= 1; /* send only one buffer for now */
5709 WSASetLastError(0xdeadbeef);
5710 ret
= pWSASendMsg(INVALID_SOCKET
, &msg
, 0, NULL
, NULL
, NULL
);
5711 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
5712 err
= WSAGetLastError();
5713 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
5715 WSASetLastError(0xdeadbeef);
5716 ret
= pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
);
5717 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
5718 err
= WSAGetLastError();
5719 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
5721 WSASetLastError(0xdeadbeef);
5722 ret
= pWSASendMsg(sock
, NULL
, 0, &bytesSent
, NULL
, NULL
);
5723 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
5724 err
= WSAGetLastError();
5725 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
5727 WSASetLastError(0xdeadbeef);
5728 ret
= pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
);
5729 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
5730 err
= WSAGetLastError();
5731 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
5735 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
5736 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
5738 dst
= socket(AF_INET
, SOCK_DGRAM
, 0);
5739 ok(dst
!= INVALID_SOCKET
, "socket() failed\n");
5741 memset(&sockaddr
, 0, sizeof(sockaddr
));
5742 sockaddr
.sin_family
= AF_INET
;
5743 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5744 ok(!bind(dst
, (struct sockaddr
*)&sockaddr
, sizeof(sockaddr
)),
5745 "bind should have worked\n");
5747 /* read address to find out the port number to be used in send */
5748 memset(&sendaddr
, 0, sizeof(sendaddr
));
5749 addrlen
= sizeof(sendaddr
);
5750 ok(!getsockname(dst
, (struct sockaddr
*) &sendaddr
, &addrlen
),
5751 "getsockname should have worked\n");
5752 ok(sendaddr
.sin_port
, "socket port should be != 0\n");
5754 /* ensure the sending socket is not bound */
5755 WSASetLastError(0xdeadbeef);
5756 addrlen
= sizeof(sockaddr
);
5757 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
5758 ok(ret
== SOCKET_ERROR
, "getsockname should have failed\n");
5759 err
= WSAGetLastError();
5760 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
5762 set_blocking(sock
, TRUE
);
5765 SetLastError(0xdeadbeef);
5766 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
5767 ok(!ret
, "WSASendMsg should have worked\n");
5768 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
5769 "Expected 0, got %d\n", GetLastError());
5770 ok(bytesSent
== iovec
[0].len
, "incorrect bytes sent, expected %d, sent %d\n",
5771 iovec
[0].len
, bytesSent
);
5774 addrlen
= sizeof(sockaddr
);
5775 memset(buffer
, 0, sizeof(buffer
));
5776 SetLastError(0xdeadbeef);
5777 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
5778 ok(ret
== bytesSent
, "got %d, expected %d\n",
5780 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5782 /* A successful call to WSASendMsg must have bound the socket */
5783 addrlen
= sizeof(sockaddr
);
5784 sockaddr
.sin_port
= 0;
5785 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5786 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
5787 ok(!ret
, "getsockname should have worked\n");
5788 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
5789 inet_ntoa(sockaddr
.sin_addr
));
5790 ok(sockaddr
.sin_port
, "sin_port should be != 0\n");
5792 msg
.dwBufferCount
= 2; /* send both buffers */
5795 SetLastError(0xdeadbeef);
5796 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
5797 ok(!ret
, "WSASendMsg should have worked\n");
5798 ok(bytesSent
== iovec
[0].len
+ iovec
[1].len
, "incorrect bytes sent, expected %d, sent %d\n",
5799 iovec
[0].len
+ iovec
[1].len
, bytesSent
);
5800 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
5801 "Expected 0, got %d\n", GetLastError());
5804 addrlen
= sizeof(sockaddr
);
5805 memset(buffer
, 0, sizeof(buffer
));
5806 SetLastError(0xdeadbeef);
5807 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
5808 ok(ret
== bytesSent
, "got %d, expected %d\n",
5810 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5815 /* a bad call to WSASendMsg will also bind the socket */
5816 addrlen
= sizeof(sockaddr
);
5817 sockaddr
.sin_port
= 0;
5818 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5819 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
5820 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
5821 ok(pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
5823 ok(!getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have worked\n");
5824 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
5825 inet_ntoa(sockaddr
.sin_addr
));
5826 ok(sockaddr
.sin_port
, "sin_port should be > 0\n");
5830 /* a bad call without msg parameter will not trigger the auto-bind */
5831 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
5832 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
5833 ok(pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
5834 ok(getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have failed\n");
5835 err
= WSAGetLastError();
5836 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
5839 /* SOCK_STREAM sockets are not supported */
5841 sock
= socket(AF_INET
, SOCK_STREAM
, 0);
5842 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
5843 SetLastError(0xdeadbeef);
5844 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
5845 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
5846 err
= WSAGetLastError();
5848 ok(err
== WSAEINVAL
, "expected 10014, got %d instead\n", err
);
5852 static void test_WSASendTo(void)
5855 struct sockaddr_in addr
, ret_addr
;
5856 char buf
[12] = "hello world";
5861 addr
.sin_family
= AF_INET
;
5862 addr
.sin_port
= htons(139);
5863 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5864 data_buf
.len
= sizeof(buf
);
5867 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
5868 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
5870 WSASetLastError(12345);
5871 ret
= WSASendTo(INVALID_SOCKET
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
5872 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
5873 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
5875 len
= sizeof(ret_addr
);
5876 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr
, &len
);
5877 ok(ret
== -1, "expected failure\n");
5878 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
5880 WSASetLastError(12345);
5881 ret
= WSASendTo(s
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
5882 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
5883 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
5885 WSASetLastError(12345);
5886 ret
= WSASendTo(s
, &data_buf
, 1, &bytesSent
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
5887 ok(!ret
, "expected success\n");
5888 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5890 len
= sizeof(ret_addr
);
5891 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr
, &len
);
5892 ok(!ret
, "got error %u\n", WSAGetLastError());
5893 ok(ret_addr
.sin_family
== AF_INET
, "got family %u\n", ret_addr
.sin_family
);
5894 ok(ret_addr
.sin_port
, "expected nonzero port\n");
5897 static DWORD WINAPI
recv_thread(LPVOID arg
)
5899 SOCKET sock
= *(SOCKET
*)arg
;
5906 wsa
.len
= sizeof(buffer
);
5907 ov
.hEvent
= WSACreateEvent();
5908 WSARecv(sock
, &wsa
, 1, NULL
, &flags
, &ov
, NULL
);
5910 WaitForSingleObject(ov
.hEvent
, 1000);
5911 WSACloseEvent(ov
.hEvent
);
5915 static int completion_called
;
5917 static void WINAPI
io_completion(DWORD error
, DWORD transferred
, WSAOVERLAPPED
*overlapped
, DWORD flags
)
5919 completion_called
++;
5922 static void test_WSARecv(void)
5924 SOCKET src
, dest
, server
= INVALID_SOCKET
;
5928 DWORD bytesReturned
, flags
, id
;
5930 struct sockaddr_in addr
;
5934 HANDLE thread
, event
= NULL
, io_port
;
5936 tcp_socketpair(&src
, &dest
);
5938 memset(&ov
, 0, sizeof(ov
));
5943 /* Send 4 bytes and receive in two calls of 2 */
5944 SetLastError(0xdeadbeef);
5945 iret
= send(src
, "test", 4, 0);
5946 ok(iret
== 4, "Expected 4, got %d\n", iret
);
5947 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5948 SetLastError(0xdeadbeef);
5949 bytesReturned
= 0xdeadbeef;
5950 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
5951 ok(!iret
, "Expected 0, got %d\n", iret
);
5952 ok(bytesReturned
== 2, "Expected 2, got %d\n", bytesReturned
);
5953 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5954 SetLastError(0xdeadbeef);
5955 bytesReturned
= 0xdeadbeef;
5956 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
5957 ok(!iret
, "Expected 0, got %d\n", iret
);
5958 ok(bytesReturned
== 2, "Expected 2, got %d\n", bytesReturned
);
5959 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5962 SetLastError(0xdeadbeef);
5963 iret
= send(src
, "test", 4, 0);
5964 ok(iret
== 4, "Expected 4, got %d\n", iret
);
5965 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5966 SetLastError(0xdeadbeef);
5967 bytesReturned
= 0xdeadbeef;
5968 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
5969 ok(!iret
, "Expected 0, got %d\n", iret
);
5970 ok(bytesReturned
== 4, "Expected 4, got %d\n", bytesReturned
);
5971 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5973 /* Test 2 buffers */
5976 bufs
[1].buf
= buf
+ 10;
5977 SetLastError(0xdeadbeef);
5978 iret
= send(src
, "deadbeefs", 9, 0);
5979 ok(iret
== 9, "Expected 9, got %d\n", iret
);
5980 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5981 SetLastError(0xdeadbeef);
5982 bytesReturned
= 0xdeadbeef;
5983 iret
= WSARecv(dest
, bufs
, 2, &bytesReturned
, &flags
, NULL
, NULL
);
5984 ok(!iret
, "Expected 0, got %d\n", iret
);
5985 ok(bytesReturned
== 9, "Expected 9, got %d\n", bytesReturned
);
5986 bufs
[0].buf
[4] = '\0';
5987 bufs
[1].buf
[5] = '\0';
5988 ok(!strcmp(bufs
[0].buf
, "dead"), "buf[0] doesn't match: %s != dead\n", bufs
[0].buf
);
5989 ok(!strcmp(bufs
[1].buf
, "beefs"), "buf[1] doesn't match: %s != beefs\n", bufs
[1].buf
);
5990 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5992 bufs
[0].len
= sizeof(buf
);
5993 ov
.hEvent
= event
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5994 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
6000 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
6001 ok(!iret
, "Failed to set linger %d\n", GetLastError());
6003 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, NULL
);
6004 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6006 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
6007 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6010 src
= INVALID_SOCKET
;
6012 dwret
= WaitForSingleObject(ov
.hEvent
, 1000);
6013 ok(dwret
== WAIT_OBJECT_0
, "Waiting for disconnect event failed with %d + errno %d\n", dwret
, GetLastError());
6015 bret
= GetOverlappedResult((HANDLE
)dest
, &ov
, &bytesReturned
, FALSE
);
6016 todo_wine
ok(!bret
, "expected failure\n");
6017 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
, "got error %u\n", GetLastError());
6018 ok(bytesReturned
== 0, "Bytes received is %d\n", bytesReturned
);
6020 dest
= INVALID_SOCKET
;
6022 src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
6023 ok(src
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6024 if (src
== INVALID_SOCKET
) goto end
;
6026 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
6027 ok(server
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6028 if (server
== INVALID_SOCKET
) goto end
;
6030 memset(&addr
, 0, sizeof(addr
));
6031 addr
.sin_family
= AF_INET
;
6032 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6033 iret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
6034 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6037 iret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
6038 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
6040 iret
= listen(server
, 1);
6041 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
6043 iret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
6044 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
6047 dest
= accept(server
, (struct sockaddr
*)&addr
, &len
);
6048 ok(dest
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6049 if (dest
== INVALID_SOCKET
) goto end
;
6051 send(src
, "test message", sizeof("test message"), 0);
6052 thread
= CreateThread(NULL
, 0, recv_thread
, &dest
, 0, &id
);
6053 WaitForSingleObject(thread
, 3000);
6054 CloseHandle(thread
);
6056 memset(&ov
, 0, sizeof(ov
));
6059 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, io_completion
);
6060 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6061 send(src
, "test message", sizeof("test message"), 0);
6063 completion_called
= 0;
6064 dwret
= SleepEx(1000, TRUE
);
6065 ok(dwret
== WAIT_IO_COMPLETION
, "got %u\n", dwret
);
6066 ok(completion_called
== 1, "completion not called\n");
6068 dwret
= WaitForSingleObject(event
, 1);
6069 ok(dwret
== WAIT_TIMEOUT
, "got %u\n", dwret
);
6071 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, NULL
, 0, 0 );
6072 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
6074 /* Using completion function on socket associated with completion port is not allowed. */
6075 memset(&ov
, 0, sizeof(ov
));
6076 completion_called
= 0;
6077 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, io_completion
);
6078 ok(iret
== SOCKET_ERROR
&& GetLastError() == WSAEINVAL
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6079 ok(!completion_called
, "completion called\n");
6081 CloseHandle(io_port
);
6084 if (server
!= INVALID_SOCKET
)
6085 closesocket(server
);
6086 if (dest
!= INVALID_SOCKET
)
6088 if (src
!= INVALID_SOCKET
)
6091 WSACloseEvent(event
);
6094 struct write_watch_thread_args
6103 static DWORD CALLBACK
write_watch_thread( void *arg
)
6105 struct write_watch_thread_args
*args
= arg
;
6106 struct sockaddr addr
;
6107 int addr_len
= sizeof(addr
), ret
;
6108 DWORD bytes
, flags
= 0;
6114 ret
= recv( args
->dest
, args
->base
, args
->size
, 0 );
6115 ok( ret
== strlen(args
->expect
) + 1, "wrong len %d\n", ret
);
6116 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
6119 ret
= recvfrom( args
->dest
, args
->base
, args
->size
, 0, &addr
, &addr_len
);
6120 ok( ret
== strlen(args
->expect
) + 1, "wrong len %d\n", ret
);
6121 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
6124 buf
[0].len
= args
->size
;
6125 buf
[0].buf
= args
->base
;
6126 ret
= WSARecv( args
->dest
, buf
, 1, &bytes
, &flags
, NULL
, NULL
);
6127 ok( !ret
, "WSARecv failed %u\n", GetLastError() );
6128 ok( bytes
== strlen(args
->expect
) + 1, "wrong len %d\n", bytes
);
6129 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
6132 buf
[0].len
= args
->size
;
6133 buf
[0].buf
= args
->base
;
6134 ret
= WSARecvFrom( args
->dest
, buf
, 1, &bytes
, &flags
, &addr
, &addr_len
, NULL
, NULL
);
6135 ok( !ret
, "WSARecvFrom failed %u\n", GetLastError() );
6136 ok( bytes
== strlen(args
->expect
) + 1, "wrong len %d\n", bytes
);
6137 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
6143 static void test_write_watch(void)
6148 struct write_watch_thread_args args
;
6149 DWORD bytesReturned
, flags
, size
;
6150 struct sockaddr addr
;
6152 HANDLE thread
, event
;
6157 UINT (WINAPI
*pGetWriteWatch
)(DWORD
,LPVOID
,SIZE_T
,LPVOID
*,ULONG_PTR
*,ULONG
*);
6159 pGetWriteWatch
= (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" );
6160 if (!pGetWriteWatch
)
6162 win_skip( "write watched not supported\n" );
6166 tcp_socketpair(&src
, &dest
);
6168 memset(&ov
, 0, sizeof(ov
));
6169 ov
.hEvent
= event
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6170 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
6175 base
= VirtualAlloc( 0, size
, MEM_RESERVE
| MEM_COMMIT
| MEM_WRITE_WATCH
, PAGE_READWRITE
);
6176 ok( base
!= NULL
, "VirtualAlloc failed %u\n", GetLastError() );
6178 memset( base
, 0, size
);
6180 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6181 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6182 ok( count
== 16, "wrong count %lu\n", count
);
6186 bufs
[1].len
= 0x8000;
6187 bufs
[1].buf
= base
+ 0x4000;
6189 ret
= WSARecv( dest
, bufs
, 2, NULL
, &flags
, &ov
, NULL
);
6190 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
6191 "WSARecv failed - %d error %d\n", ret
, GetLastError());
6194 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6195 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6196 ok( count
== 9, "wrong count %lu\n", count
);
6197 ok( !base
[0], "data set\n" );
6199 send(src
, "test message", sizeof("test message"), 0);
6201 ret
= GetOverlappedResult( (HANDLE
)dest
, &ov
, &bytesReturned
, TRUE
);
6202 ok( ret
, "GetOverlappedResult failed %u\n", GetLastError() );
6203 ok( bytesReturned
== sizeof("test message"), "wrong size %u\n", bytesReturned
);
6204 ok( !memcmp( base
, "test ", 5 ), "wrong data %s\n", base
);
6205 ok( !memcmp( base
+ 0x4000, "message", 8 ), "wrong data %s\n", base
+ 0x4000 );
6208 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6209 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6210 ok( count
== 0, "wrong count %lu\n", count
);
6212 memset( base
, 0, size
);
6214 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6215 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6216 ok( count
== 16, "wrong count %lu\n", count
);
6218 bufs
[1].len
= 0x4000;
6219 bufs
[1].buf
= base
+ 0x2000;
6220 ret
= WSARecvFrom( dest
, bufs
, 2, NULL
, &flags
, &addr
, &addr_len
, &ov
, NULL
);
6221 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
6222 "WSARecv failed - %d error %d\n", ret
, GetLastError());
6225 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6226 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6227 ok( count
== 5, "wrong count %lu\n", count
);
6228 ok( !base
[0], "data set\n" );
6230 send(src
, "test message", sizeof("test message"), 0);
6232 ret
= GetOverlappedResult( (HANDLE
)dest
, &ov
, &bytesReturned
, TRUE
);
6233 ok( ret
, "GetOverlappedResult failed %u\n", GetLastError() );
6234 ok( bytesReturned
== sizeof("test message"), "wrong size %u\n", bytesReturned
);
6235 ok( !memcmp( base
, "test ", 5 ), "wrong data %s\n", base
);
6236 ok( !memcmp( base
+ 0x2000, "message", 8 ), "wrong data %s\n", base
+ 0x2000 );
6239 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6240 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6241 ok( count
== 0, "wrong count %lu\n", count
);
6243 memset( base
, 0, size
);
6245 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6246 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6247 ok( count
== 16, "wrong count %lu\n", count
);
6252 args
.expect
= "test message";
6253 for (args
.func
= 0; args
.func
< 4; args
.func
++)
6255 thread
= CreateThread( NULL
, 0, write_watch_thread
, &args
, 0, NULL
);
6259 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6260 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6261 ok( count
== 8, "wrong count %lu\n", count
);
6263 send(src
, "test message", sizeof("test message"), 0);
6264 WaitForSingleObject( thread
, 10000 );
6265 CloseHandle( thread
);
6268 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
6269 ok( !ret
, "GetWriteWatch failed %u\n", GetLastError() );
6270 ok( count
== 0, "wrong count %lu\n", count
);
6272 WSACloseEvent( event
);
6273 closesocket( dest
);
6275 VirtualFree( base
, 0, MEM_FREE
);
6278 static void test_WSAPoll(void)
6280 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
6282 SOCKET listener
, server
, client
;
6283 struct sockaddr_in address
;
6285 HANDLE thread_handle
;
6289 static const short invalid_flags
[] =
6290 {POLLERR
, POLLHUP
, POLLNVAL
, 0x8, POLLWRBAND
, 0x40, 0x80, POLLPRI
, 0x800, 0x1000, 0x2000, 0x4000, 0x8000};
6292 if (!pWSAPoll
) /* >= Vista */
6294 win_skip("WSAPoll is unsupported, some tests will be skipped.\n");
6298 /* Invalid parameters test */
6299 SetLastError(0xdeadbeef);
6300 ret
= pWSAPoll(NULL
, 0, 0);
6301 err
= GetLastError();
6302 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6303 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6304 SetLastError(0xdeadbeef);
6305 ret
= pWSAPoll(NULL
, 1, 0);
6306 err
= GetLastError();
6307 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6308 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6309 SetLastError(0xdeadbeef);
6310 ret
= pWSAPoll(NULL
, 0, 1);
6311 err
= GetLastError();
6312 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6313 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6314 SetLastError(0xdeadbeef);
6315 ret
= pWSAPoll(NULL
, 1, 1);
6316 err
= GetLastError();
6317 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6318 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6320 memset(&address
, 0, sizeof(address
));
6321 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6322 address
.sin_family
= AF_INET
;
6323 len
= sizeof(address
);
6324 listener
= setup_server_socket(&address
, &len
);
6326 for (i
= 0; i
< ARRAY_SIZE(invalid_flags
); ++i
)
6328 fds
[0].fd
= listener
;
6329 fds
[0].events
= invalid_flags
[i
];
6330 fds
[0].revents
= 0xdead;
6331 WSASetLastError(0xdeadbeef);
6332 ret
= pWSAPoll(fds
, 1, 0);
6333 todo_wine
ok(ret
== -1, "got %d\n", ret
);
6334 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6337 /* When no events are pending poll returns 0 with no error */
6338 fds
[0].fd
= listener
;
6339 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
6340 fds
[0].revents
= 0xdead;
6341 ret
= pWSAPoll(fds
, 1, 0);
6342 ok(ret
== 0, "got %d\n", ret
);
6343 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
6346 fds
[0].events
= POLLERR
;
6347 fds
[0].revents
= 0xdead;
6348 fds
[1].fd
= listener
;
6349 fds
[1].events
= POLLIN
;
6350 fds
[1].revents
= 0xdead;
6351 WSASetLastError(0xdeadbeef);
6352 ret
= pWSAPoll(fds
, 2, 0);
6353 ok(!ret
, "got %d\n", ret
);
6354 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
6355 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
6356 ok(!fds
[1].revents
, "got events %#x\n", fds
[1].revents
);
6358 fds
[0].fd
= listener
;
6359 fds
[0].events
= POLLIN
;
6360 fds
[0].revents
= 0xdead;
6361 fds
[1].fd
= 0xabacab;
6362 fds
[1].events
= POLLIN
;
6363 fds
[1].revents
= 0xdead;
6364 WSASetLastError(0xdeadbeef);
6365 ret
= pWSAPoll(fds
, 2, 0);
6366 ok(!ret
, "got %d\n", ret
);
6367 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
6368 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
6369 ok(fds
[1].revents
== POLLNVAL
, "got events %#x\n", fds
[1].revents
);
6371 fds
[0].fd
= listener
;
6372 fds
[0].events
= POLLIN
;
6373 fds
[0].revents
= 0xdead;
6374 fds
[1].fd
= 0xabacab;
6375 fds
[1].events
= POLLERR
;
6376 fds
[1].revents
= 0xdead;
6377 WSASetLastError(0xdeadbeef);
6378 ret
= pWSAPoll(fds
, 2, 0);
6379 todo_wine
ok(ret
== -1, "got %d\n", ret
);
6380 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6381 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
6382 todo_wine
ok(!fds
[1].revents
, "got events %#x\n", fds
[1].revents
);
6385 fds
[0].events
= POLLERR
;
6386 fds
[0].revents
= 0xdead;
6387 fds
[1].fd
= 0xabacab;
6388 fds
[1].events
= POLLERR
;
6389 fds
[1].revents
= 0xdead;
6390 WSASetLastError(0xdeadbeef);
6391 ret
= pWSAPoll(fds
, 2, 0);
6392 ok(ret
== -1, "got %d\n", ret
);
6393 ok(WSAGetLastError() == WSAENOTSOCK
, "got error %u\n", WSAGetLastError());
6394 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
6395 ok(fds
[1].revents
== POLLNVAL
, "got events %#x\n", fds
[1].revents
);
6397 /* Test listening socket connection attempt notifications */
6398 client
= setup_connector_socket(&address
, len
, TRUE
);
6400 fds
[0].fd
= listener
;
6401 fds
[0].events
= POLLIN
;
6402 fds
[0].revents
= 0xdead;
6403 ret
= pWSAPoll(fds
, 1, 100);
6404 ok(ret
== 1, "got %d\n", ret
);
6405 ok(fds
[0].revents
== POLLRDNORM
, "got events %#x\n", fds
[0].revents
);
6407 fds
[0].revents
= 0xdead;
6408 ret
= pWSAPoll(fds
, 1, 0);
6409 ok(ret
== 1, "got %d\n", ret
);
6410 ok(fds
[0].revents
== POLLRDNORM
, "got events %#x\n", fds
[0].revents
);
6412 fds
[0].events
= POLLRDBAND
| POLLWRNORM
;
6413 fds
[0].revents
= 0xdead;
6414 ret
= pWSAPoll(fds
, 1, 0);
6415 ok(ret
== 0, "got %d\n", ret
);
6416 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
6418 server
= accept(listener
, NULL
, NULL
);
6419 ok(server
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
6420 set_blocking(client
, FALSE
);
6421 set_blocking(server
, FALSE
);
6423 for (i
= 0; i
< ARRAY_SIZE(invalid_flags
); ++i
)
6426 fds
[0].events
= invalid_flags
[i
];
6427 fds
[0].revents
= 0xdead;
6428 WSASetLastError(0xdeadbeef);
6429 ret
= pWSAPoll(fds
, 1, 0);
6430 todo_wine
ok(ret
== -1, "got %d\n", ret
);
6431 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6434 /* Test flags exposed by connected sockets. */
6436 fds
[0].fd
= listener
;
6437 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
6438 fds
[0].revents
= 0xdead;
6440 fds
[1].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
6441 fds
[1].revents
= 0xdead;
6443 fds
[2].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
6444 fds
[2].revents
= 0xdead;
6445 ret
= pWSAPoll(fds
, 3, 0);
6446 ok(ret
== 2, "got %d\n", ret
);
6447 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
6448 ok(fds
[1].revents
== POLLWRNORM
, "got events %#x\n", fds
[1].revents
);
6449 ok(fds
[2].revents
== POLLWRNORM
, "got events %#x\n", fds
[2].revents
);
6451 /* Test data receiving notifications */
6453 ret
= send(server
, "1234", 4, 0);
6454 ok(ret
== 4, "got %d\n", ret
);
6456 check_poll_mask(client
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
6457 check_poll(client
, POLLRDNORM
| POLLWRNORM
);
6458 check_poll(server
, POLLWRNORM
);
6460 ret
= sync_recv(client
, buffer
, sizeof(buffer
), 0);
6461 ok(ret
== 4, "got %d\n", ret
);
6463 check_poll(client
, POLLWRNORM
);
6464 check_poll(server
, POLLWRNORM
);
6466 /* Because the kernel asynchronously buffers data, this test is not reliable. */
6470 static const int large_buffer_size
= 1024 * 1024;
6471 char *large_buffer
= malloc(large_buffer_size
);
6473 while (send(server
, large_buffer
, large_buffer_size
, 0) == large_buffer_size
);
6475 check_poll(client
, POLLWRNORM
| POLLRDNORM
);
6476 check_poll(server
, 0);
6478 while (recv(client
, large_buffer
, large_buffer_size
, 0) > 0);
6480 check_poll(client
, POLLWRNORM
);
6481 check_poll(server
, POLLWRNORM
);
6486 /* Test OOB data notifications */
6488 ret
= send(client
, "A", 1, MSG_OOB
);
6489 ok(ret
== 1, "got %d\n", ret
);
6491 check_poll(client
, POLLWRNORM
);
6492 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDBAND
);
6493 check_poll(server
, POLLWRNORM
| POLLRDBAND
);
6496 ret
= recv(server
, buffer
, 1, MSG_OOB
);
6497 ok(ret
== 1, "got %d\n", ret
);
6498 ok(buffer
[0] == 'A', "got %#x\n", buffer
[0]);
6500 check_poll(client
, POLLWRNORM
);
6501 check_poll(server
, POLLWRNORM
);
6503 /* If the socket is OOBINLINED the notification is like normal data */
6506 ret
= setsockopt(server
, SOL_SOCKET
, SO_OOBINLINE
, (char *)&ret
, sizeof(ret
));
6507 ok(!ret
, "got error %u\n", WSAGetLastError());
6508 ret
= send(client
, "A", 1, MSG_OOB
);
6509 ok(ret
== 1, "got %d\n", ret
);
6511 check_poll(client
, POLLWRNORM
);
6512 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
6513 check_poll(server
, POLLWRNORM
| POLLRDNORM
);
6516 ret
= recv(server
, buffer
, 1, 0);
6517 ok(ret
== 1, "got %d\n", ret
);
6518 ok(buffer
[0] == 'A', "got %#x\n", buffer
[0]);
6520 check_poll(client
, POLLWRNORM
);
6521 check_poll_todo(server
, POLLWRNORM
);
6523 /* Test shutdown. */
6525 ret
= shutdown(client
, SD_RECEIVE
);
6526 ok(!ret
, "got error %u\n", WSAGetLastError());
6528 check_poll(client
, POLLWRNORM
);
6529 check_poll_todo(server
, POLLWRNORM
);
6531 ret
= shutdown(client
, SD_SEND
);
6532 ok(!ret
, "got error %u\n", WSAGetLastError());
6534 check_poll(client
, POLLWRNORM
);
6535 check_poll_mask_todo(server
, 0, POLLHUP
);
6536 check_poll_todo(server
, POLLWRNORM
| POLLHUP
);
6538 closesocket(client
);
6539 closesocket(server
);
6541 /* Test shutdown via closesocket(). */
6543 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6544 ret
= connect(client
, (struct sockaddr
*)&address
, sizeof(address
));
6545 ok(!ret
, "got error %u\n", WSAGetLastError());
6546 server
= accept(listener
, NULL
, NULL
);
6547 ok(server
!= -1, "got error %u\n", WSAGetLastError());
6549 closesocket(client
);
6551 check_poll_mask(server
, 0, POLLHUP
);
6552 check_poll(server
, POLLWRNORM
| POLLHUP
);
6554 closesocket(server
);
6556 /* Test shutdown with data in the pipe. */
6558 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6559 ret
= connect(client
, (struct sockaddr
*)&address
, sizeof(address
));
6560 ok(!ret
, "got error %u\n", WSAGetLastError());
6561 server
= accept(listener
, NULL
, NULL
);
6562 ok(server
!= -1, "got error %u\n", WSAGetLastError());
6564 ret
= send(client
, "data", 5, 0);
6565 ok(ret
== 5, "got %d\n", ret
);
6567 check_poll(client
, POLLWRNORM
);
6568 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
6569 check_poll(server
, POLLWRNORM
| POLLRDNORM
);
6571 ret
= shutdown(client
, SD_SEND
);
6573 check_poll(client
, POLLWRNORM
);
6574 check_poll_mask_todo(server
, 0, POLLHUP
);
6575 check_poll_todo(server
, POLLWRNORM
| POLLRDNORM
| POLLHUP
);
6577 closesocket(client
);
6578 closesocket(server
);
6580 /* Test closing a socket while selecting on it. */
6582 tcp_socketpair(&client
, &server
);
6584 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &client
, 0, NULL
);
6586 fds
[0].events
= POLLRDNORM
| POLLRDBAND
;
6587 fds
[0].revents
= 0xdead;
6588 ret
= pWSAPoll(fds
, 1, 2000);
6589 ok(ret
== 1, "got %d\n", ret
);
6590 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
6591 ret
= WaitForSingleObject(thread_handle
, 1000);
6592 ok(!ret
, "wait failed\n");
6593 CloseHandle(thread_handle
);
6595 closesocket(server
);
6597 /* Test a failed connection.
6599 * The following WSAPoll() call times out on versions older than w10pro64,
6600 * but even on w10pro64 it takes over 2 seconds for an error to be reported,
6601 * so make the test interactive-only. */
6602 if (winetest_interactive
)
6604 const struct sockaddr_in invalid_addr
=
6606 .sin_family
= AF_INET
,
6607 .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
),
6612 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6613 set_blocking(client
, FALSE
);
6615 ret
= connect(client
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
6616 ok(ret
== -1, "got %d\n", ret
);
6617 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
6620 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
6621 fds
[0].revents
= 0xdead;
6622 ret
= pWSAPoll(fds
, 1, 10000);
6623 todo_wine
ok(ret
== 1, "got %d\n", ret
);
6624 todo_wine
ok(fds
[0].revents
== (POLLWRNORM
| POLLHUP
| POLLERR
), "got events %#x\n", fds
[0].revents
);
6628 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
6629 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
6630 ok(err
== WSAECONNREFUSED
, "got error %u\n", err
);
6634 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
6635 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
6636 ok(err
== WSAECONNREFUSED
, "got error %u\n", err
);
6638 check_poll_todo(client
, POLLWRNORM
| POLLHUP
| POLLERR
);
6640 closesocket(client
);
6642 /* test polling after a (synchronous) failure */
6644 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6646 ret
= connect(client
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
6647 ok(ret
== -1, "got %d\n", ret
);
6648 ok(WSAGetLastError() == WSAECONNREFUSED
, "got error %u\n", WSAGetLastError());
6650 check_poll_todo(client
, POLLWRNORM
| POLLHUP
| POLLERR
);
6654 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
6655 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
6656 todo_wine
ok(!err
, "got error %u\n", err
);
6658 closesocket(client
);
6661 closesocket(listener
);
6663 /* Test UDP sockets. */
6665 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
6666 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
6668 check_poll(client
, POLLWRNORM
);
6669 check_poll(server
, POLLWRNORM
);
6671 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
6672 ok(!ret
, "got error %u\n", WSAGetLastError());
6673 len
= sizeof(address
);
6674 ret
= getsockname(client
, (struct sockaddr
*)&address
, &len
);
6675 ok(!ret
, "got error %u\n", WSAGetLastError());
6677 check_poll(client
, POLLWRNORM
);
6678 check_poll(server
, POLLWRNORM
);
6680 ret
= sendto(server
, "data", 5, 0, (struct sockaddr
*)&address
, sizeof(address
));
6681 ok(ret
== 5, "got %d\n", ret
);
6683 check_poll_mask(client
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
6684 check_poll(client
, POLLWRNORM
| POLLRDNORM
);
6685 check_poll(server
, POLLWRNORM
);
6687 closesocket(client
);
6688 closesocket(server
);
6691 static void test_connect(void)
6693 SOCKET listener
= INVALID_SOCKET
;
6694 SOCKET acceptor
= INVALID_SOCKET
;
6695 SOCKET connector
= INVALID_SOCKET
;
6696 struct sockaddr_in address
, conaddress
;
6698 OVERLAPPED overlapped
;
6699 LPFN_CONNECTEX pConnectEx
;
6700 GUID connectExGuid
= WSAID_CONNECTEX
;
6701 DWORD bytesReturned
;
6707 memset(&overlapped
, 0, sizeof(overlapped
));
6709 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
6710 ok(listener
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6712 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
6713 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6715 memset(&address
, 0, sizeof(address
));
6716 address
.sin_family
= AF_INET
;
6717 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6718 iret
= bind(listener
, (struct sockaddr
*)&address
, sizeof(address
));
6719 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6721 addrlen
= sizeof(address
);
6722 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
6723 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
6725 iret
= listen(listener
, 1);
6726 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
6728 iret
= set_blocking(listener
, TRUE
);
6729 ok(!iret
, "failed to set nonblocking, error %u\n", WSAGetLastError());
6731 bytesReturned
= 0xdeadbeef;
6732 iret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectExGuid
, sizeof(connectExGuid
),
6733 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
6734 ok(!iret
, "failed to get ConnectEx, error %u\n", WSAGetLastError());
6736 ok(bytesReturned
== sizeof(pConnectEx
), "expected sizeof(pConnectEx), got %u\n", bytesReturned
);
6738 WSASetLastError(0xdeadbeef);
6739 iret
= connect(listener
, (struct sockaddr
*)&address
, sizeof(address
));
6740 ok(iret
== -1, "got %d\n", iret
);
6741 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6743 WSASetLastError(0xdeadbeef);
6744 overlapped
.Internal
= 0xdeadbeef;
6745 overlapped
.InternalHigh
= 0xdeadbeef;
6746 iret
= pConnectEx(listener
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
6747 ok(!iret
, "got %d\n", iret
);
6748 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6749 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
6750 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
6752 bret
= pConnectEx(INVALID_SOCKET
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
6753 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "ConnectEx on invalid socket "
6754 "returned %d + errno %d\n", bret
, WSAGetLastError());
6756 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
6757 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "ConnectEx on a unbound socket "
6758 "returned %d + errno %d\n", bret
, WSAGetLastError());
6760 /* ConnectEx needs a bound socket */
6761 memset(&conaddress
, 0, sizeof(conaddress
));
6762 conaddress
.sin_family
= AF_INET
;
6763 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6764 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
6765 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6767 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, NULL
);
6768 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "ConnectEx on a NULL overlapped "
6769 "returned %d + errno %d\n", bret
, WSAGetLastError());
6771 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6773 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
6774 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
6775 "returned %d + errno %d\n", bret
, WSAGetLastError());
6776 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
6777 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
6779 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
6780 ok(bret
, "Connecting failed, error %d\n", GetLastError());
6781 ok(bytesReturned
== 0, "Bytes sent is %d\n", bytesReturned
);
6783 closesocket(connector
);
6784 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
6785 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6786 /* ConnectEx needs a bound socket */
6787 memset(&conaddress
, 0, sizeof(conaddress
));
6788 conaddress
.sin_family
= AF_INET
;
6789 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6790 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
6791 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6793 acceptor
= accept(listener
, NULL
, NULL
);
6794 ok(acceptor
!= INVALID_SOCKET
, "failed to accept socket, error %u\n", WSAGetLastError());
6799 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, buffer
, 3, &bytesReturned
, &overlapped
);
6800 memset(buffer
, 0, 3);
6801 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
6802 "returned %d + errno %d\n", bret
, WSAGetLastError());
6803 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
6804 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
6806 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
6807 ok(bret
, "Connecting failed, error %d\n", GetLastError());
6808 ok(bytesReturned
== 3, "Bytes sent is %d\n", bytesReturned
);
6810 acceptor
= accept(listener
, NULL
, NULL
);
6811 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket error %d\n", WSAGetLastError());
6813 bytesReturned
= recv(acceptor
, buffer
, 3, 0);
6815 ok(bytesReturned
== 3, "Didn't get all sent data, got only %d\n", bytesReturned
);
6816 ok(buffer
[0] == '1' && buffer
[1] == '2' && buffer
[2] == '3',
6817 "Failed to get the right data, expected '123', got '%s'\n", buffer
);
6819 WSASetLastError(0xdeadbeef);
6820 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
6821 ok(iret
== -1, "got %d\n", iret
);
6822 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
6824 WSASetLastError(0xdeadbeef);
6825 iret
= connect(acceptor
, (struct sockaddr
*)&address
, sizeof(address
));
6826 ok(iret
== -1, "got %d\n", iret
);
6827 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6829 WSASetLastError(0xdeadbeef);
6830 overlapped
.Internal
= 0xdeadbeef;
6831 overlapped
.InternalHigh
= 0xdeadbeef;
6832 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
6833 ok(!bret
, "got %d\n", bret
);
6834 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6835 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
6836 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
6838 WSASetLastError(0xdeadbeef);
6839 overlapped
.Internal
= 0xdeadbeef;
6840 overlapped
.InternalHigh
= 0xdeadbeef;
6841 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
6842 ok(!bret
, "got %d\n", bret
);
6843 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6844 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
6845 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
6847 closesocket(connector
);
6848 closesocket(acceptor
);
6849 closesocket(listener
);
6851 tcp_socketpair(&connector
, &acceptor
);
6853 WSASetLastError(0xdeadbeef);
6854 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
6855 ok(iret
== -1, "got %d\n", iret
);
6856 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6858 WSASetLastError(0xdeadbeef);
6859 iret
= connect(acceptor
, (struct sockaddr
*)&address
, sizeof(address
));
6860 ok(iret
== -1, "got %d\n", iret
);
6861 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6863 WSASetLastError(0xdeadbeef);
6864 overlapped
.Internal
= 0xdeadbeef;
6865 overlapped
.InternalHigh
= 0xdeadbeef;
6866 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
6867 ok(!bret
, "got %d\n", bret
);
6868 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6869 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
6870 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
6872 WSASetLastError(0xdeadbeef);
6873 overlapped
.Internal
= 0xdeadbeef;
6874 overlapped
.InternalHigh
= 0xdeadbeef;
6875 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
6876 ok(!bret
, "got %d\n", bret
);
6877 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
6878 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
6879 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
6881 closesocket(connector
);
6882 closesocket(acceptor
);
6884 /* Connect with error */
6886 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
6887 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6888 /* ConnectEx needs a bound socket */
6889 memset(&conaddress
, 0, sizeof(conaddress
));
6890 conaddress
.sin_family
= AF_INET
;
6891 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6892 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
6893 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6895 address
.sin_port
= htons(1);
6897 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
6898 ok(bret
== FALSE
&& GetLastError() == ERROR_IO_PENDING
, "ConnectEx to bad destination failed: "
6899 "returned %d + errno %d\n", bret
, GetLastError());
6900 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
6901 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
6903 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
6904 ok(bret
== FALSE
&& GetLastError() == ERROR_CONNECTION_REFUSED
,
6905 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
6907 WSACloseEvent(overlapped
.hEvent
);
6908 closesocket(connector
);
6911 static void test_AcceptEx(void)
6913 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
6914 SOCKET listener
, acceptor
, acceptor2
, connector
, connector2
;
6915 struct sockaddr_in bindAddress
, peerAddress
, *readBindAddress
, *readRemoteAddress
;
6916 int socklen
, optlen
;
6917 GUID acceptExGuid
= WSAID_ACCEPTEX
, getAcceptExGuid
= WSAID_GETACCEPTEXSOCKADDRS
;
6918 GUID connectex_guid
= WSAID_CONNECTEX
;
6919 LPFN_ACCEPTEX pAcceptEx
= NULL
;
6920 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs
= NULL
;
6921 LPFN_CONNECTEX pConnectEx
= NULL
;
6922 fd_set fds_accept
, fds_send
;
6923 static const struct timeval timeout
= {1, 0};
6924 DWORD bytesReturned
, connect_time
;
6925 char buffer
[1024], ipbuffer
[32];
6926 OVERLAPPED overlapped
= {0}, overlapped2
= {0};
6927 int iret
, localSize
= sizeof(struct sockaddr_in
), remoteSize
= localSize
;
6931 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6932 overlapped2
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6934 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
6935 ok(listener
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6937 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
6938 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
6940 memset(&bindAddress
, 0, sizeof(bindAddress
));
6941 bindAddress
.sin_family
= AF_INET
;
6942 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6943 iret
= bind(listener
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
6944 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
6946 socklen
= sizeof(bindAddress
);
6947 iret
= getsockname(listener
, (struct sockaddr
*)&bindAddress
, &socklen
);
6948 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
6950 iret
= set_blocking(listener
, FALSE
);
6951 ok(!iret
, "Failed to set nonblocking, error %u\n", WSAGetLastError());
6953 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
6954 &pAcceptEx
, sizeof(pAcceptEx
), &bytesReturned
, NULL
, NULL
);
6955 ok(!iret
, "Failed to get AcceptEx, error %u\n", WSAGetLastError());
6957 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &getAcceptExGuid
, sizeof(getAcceptExGuid
),
6958 &pGetAcceptExSockaddrs
, sizeof(pGetAcceptExSockaddrs
), &bytesReturned
, NULL
, NULL
);
6959 ok(!iret
, "Failed to get GetAcceptExSockaddrs, error %u\n", WSAGetLastError());
6961 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
6962 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
6963 ok(!iret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
6965 overlapped
.Internal
= 0xdeadbeef;
6966 bret
= pAcceptEx(INVALID_SOCKET
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
6967 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
6968 &bytesReturned
, &overlapped
);
6969 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid listening socket "
6970 "returned %d + errno %d\n", bret
, WSAGetLastError());
6971 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
6973 overlapped
.Internal
= 0xdeadbeef;
6974 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
6975 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
6976 &bytesReturned
, &overlapped
);
6978 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "AcceptEx on a non-listening socket "
6979 "returned %d + errno %d\n", bret
, WSAGetLastError());
6980 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
6981 if (!bret
&& WSAGetLastError() == ERROR_IO_PENDING
)
6982 CancelIo((HANDLE
)listener
);
6984 iret
= listen(listener
, 5);
6985 ok(!iret
, "failed to listen, error %u\n", GetLastError());
6987 overlapped
.Internal
= 0xdeadbeef;
6988 bret
= pAcceptEx(listener
, INVALID_SOCKET
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
6989 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
6990 &bytesReturned
, &overlapped
);
6991 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid accepting socket "
6992 "returned %d + errno %d\n", bret
, WSAGetLastError());
6993 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
6995 overlapped
.Internal
= 0xdeadbeef;
6996 bret
= pAcceptEx(listener
, acceptor
, NULL
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
6997 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
6998 &bytesReturned
, &overlapped
);
6999 todo_wine
ok(bret
== FALSE
&& WSAGetLastError() == WSAEFAULT
,
7000 "AcceptEx on NULL buffer returned %d + errno %d\n", bret
, WSAGetLastError());
7001 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7003 overlapped
.Internal
= 0xdeadbeef;
7004 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
7005 &bytesReturned
, &overlapped
);
7006 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
,
7007 "AcceptEx on too small local address size returned %d + errno %d\n",
7008 bret
, WSAGetLastError());
7009 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7011 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7012 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7013 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7014 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
7015 iret
= getsockname(connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
7016 ok(!iret
, "getsockname failed, error %u\n", WSAGetLastError());
7018 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7019 ok(!dwret
, "wait failed\n");
7020 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7021 ok(bret
, "got error %u\n", GetLastError());
7022 ok(!(NTSTATUS
)overlapped
.Internal
, "got %#lx\n", overlapped
.Internal
);
7023 ok(!bytesReturned
, "got size %u\n", bytesReturned
);
7025 readBindAddress
= readRemoteAddress
= (struct sockaddr_in
*)0xdeadbeef;
7026 localSize
= remoteSize
= 0xdeadbeef;
7027 pGetAcceptExSockaddrs(buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
7028 (struct sockaddr
**)&readBindAddress
, &localSize
, (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
7029 todo_wine
ok(readBindAddress
== (struct sockaddr_in
*)0xdeadbeef, "got local addr %p\n", readBindAddress
);
7030 ok(!memcmp(readRemoteAddress
, &peerAddress
, sizeof(peerAddress
)), "remote addr didn't match\n");
7031 todo_wine
ok(localSize
== 0xdeadbeef, "got local size %u\n", localSize
);
7032 ok(remoteSize
== sizeof(struct sockaddr_in
), "got remote size %u\n", remoteSize
);
7034 closesocket(connector
);
7035 closesocket(acceptor
);
7037 /* A UDP socket cannot be accepted into. */
7039 acceptor
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
7041 overlapped
.Internal
= 0xdeadbeef;
7042 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7043 ok(!bret
, "expected failure\n");
7044 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7045 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
7046 if (WSAGetLastError() == ERROR_IO_PENDING
)
7047 CancelIo((HANDLE
)listener
);
7049 closesocket(acceptor
);
7051 /* A bound socket cannot be accepted into. */
7053 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7054 iret
= bind(acceptor
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
7055 ok(!iret
, "got error %u\n", WSAGetLastError());
7057 overlapped
.Internal
= 0xdeadbeef;
7058 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7059 ok(!bret
, "expected failure\n");
7060 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7061 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
7062 if (WSAGetLastError() == ERROR_IO_PENDING
)
7063 CancelIo((HANDLE
)listener
);
7065 closesocket(acceptor
);
7067 /* A connected socket cannot be accepted into. */
7069 tcp_socketpair(&acceptor
, &acceptor2
);
7071 overlapped
.Internal
= 0xdeadbeef;
7072 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7073 ok(!bret
, "expected failure\n");
7074 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7075 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
7076 if (WSAGetLastError() == ERROR_IO_PENDING
)
7077 CancelIo((HANDLE
)listener
);
7079 overlapped
.Internal
= 0xdeadbeef;
7080 bret
= pAcceptEx(listener
, acceptor2
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7081 ok(!bret
, "expected failure\n");
7082 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7083 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
7084 if (WSAGetLastError() == ERROR_IO_PENDING
)
7085 CancelIo((HANDLE
)listener
);
7087 closesocket(acceptor
);
7088 closesocket(acceptor2
);
7090 /* Pass an insufficient local address size. */
7092 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7093 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7095 overlapped
.Internal
= 0xdeadbeef;
7096 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 3,
7097 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7098 ok(!bret
&& WSAGetLastError() == ERROR_IO_PENDING
, "got %d, error %u\n", bret
, WSAGetLastError());
7099 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got %#lx\n", overlapped
.Internal
);
7101 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7102 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7103 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7104 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
7106 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7107 ok(!dwret
, "wait failed\n");
7108 bytesReturned
= 0xdeadbeef;
7109 SetLastError(0xdeadbeef);
7110 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7111 ok(!bret
, "expected failure\n");
7112 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "got error %u\n", GetLastError());
7113 ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "got %#lx\n", overlapped
.Internal
);
7114 ok(!bytesReturned
, "got size %u\n", bytesReturned
);
7116 closesocket(acceptor
);
7118 /* The above connection request is not accepted. */
7119 acceptor
= accept(listener
, NULL
, NULL
);
7120 todo_wine
ok(acceptor
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
7121 closesocket(acceptor
);
7123 closesocket(connector
);
7125 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7126 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7128 overlapped
.Internal
= 0xdeadbeef;
7129 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 4,
7130 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7131 ok(!bret
&& WSAGetLastError() == ERROR_IO_PENDING
, "got %d, error %u\n", bret
, WSAGetLastError());
7132 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got %#lx\n", overlapped
.Internal
);
7134 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7135 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7136 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7137 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
7139 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7140 ok(!dwret
, "wait failed\n");
7141 bytesReturned
= 0xdeadbeef;
7142 SetLastError(0xdeadbeef);
7143 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7144 todo_wine
ok(!bret
, "expected failure\n");
7145 todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "got error %u\n", GetLastError());
7146 todo_wine
ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "got %#lx\n", overlapped
.Internal
);
7147 ok(!bytesReturned
, "got size %u\n", bytesReturned
);
7149 closesocket(acceptor
);
7151 /* The above connection request is not accepted. */
7152 acceptor
= accept(listener
, NULL
, NULL
);
7153 todo_wine
ok(acceptor
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
7154 closesocket(acceptor
);
7156 closesocket(connector
);
7158 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7159 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7161 overlapped
.Internal
= 0xdeadbeef;
7162 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 15,
7163 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7164 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx on too small local address "
7165 "size returned %d + errno %d\n",
7166 bret
, WSAGetLastError());
7167 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7168 bret
= CancelIo((HANDLE
) listener
);
7169 ok(bret
, "Failed to cancel pending accept socket\n");
7171 overlapped
.Internal
= 0xdeadbeef;
7172 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16, 0,
7173 &bytesReturned
, &overlapped
);
7174 ok(bret
== FALSE
&& WSAGetLastError() == WSAEFAULT
,
7175 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7176 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7178 overlapped
.Internal
= 0xdeadbeef;
7179 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
7180 sizeof(struct sockaddr_in
) + 15, &bytesReturned
, &overlapped
);
7181 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
,
7182 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7183 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7184 bret
= CancelIo((HANDLE
) listener
);
7185 ok(bret
, "Failed to cancel pending accept socket\n");
7187 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7188 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7189 &bytesReturned
, NULL
);
7190 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7191 "returned %d + errno %d\n", bret
, WSAGetLastError());
7193 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, 0, &bytesReturned
, NULL
);
7194 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7195 "returned %d + errno %d\n", bret
, WSAGetLastError());
7197 overlapped
.Internal
= 0xdeadbeef;
7198 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7199 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7200 &bytesReturned
, &overlapped
);
7201 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7202 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7204 /* try to accept into the same socket twice */
7205 overlapped
.Internal
= 0xdeadbeef;
7206 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7207 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7208 &bytesReturned
, &overlapped
);
7209 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
,
7210 "AcceptEx on already pending socket returned %d + errno %d\n", bret
, WSAGetLastError());
7211 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7213 /* try to connect a socket that's being accepted into */
7214 iret
= connect(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7215 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
,
7216 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret
, WSAGetLastError());
7218 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
),
7219 NULL
, 0, &bytesReturned
, &overlapped2
);
7220 ok(!bret
, "expected failure\n");
7221 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7223 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7224 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7225 overlapped
.Internal
= 0xdeadbeef;
7226 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7227 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7229 dwret
= WaitForSingleObject(overlapped
.hEvent
, INFINITE
);
7230 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7231 ok(overlapped
.Internal
== STATUS_SUCCESS
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7233 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7234 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7235 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7237 closesocket(connector
);
7238 connector
= INVALID_SOCKET
;
7239 closesocket(acceptor
);
7241 /* Test short reads */
7243 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7244 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7245 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7246 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7247 overlapped
.Internal
= 0xdeadbeef;
7248 bret
= pAcceptEx(listener
, acceptor
, buffer
, 2,
7249 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7250 &bytesReturned
, &overlapped
);
7251 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7252 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7254 connect_time
= 0xdeadbeef;
7255 optlen
= sizeof(connect_time
);
7256 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7257 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7258 ok(connect_time
== ~0u, "unexpected connect time %u\n", connect_time
);
7260 /* AcceptEx() still won't complete until we send data */
7261 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7262 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7264 connect_time
= 0xdeadbeef;
7265 optlen
= sizeof(connect_time
);
7266 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7267 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7268 ok(connect_time
< 0xdeadbeef, "unexpected connect time %u\n", connect_time
);
7270 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7271 ok(dwret
== WAIT_TIMEOUT
, "Waiting for accept event timeout failed with %d + errno %d\n", dwret
, GetLastError());
7272 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7274 iret
= getsockname( connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
7275 ok( !iret
, "getsockname failed.\n");
7277 /* AcceptEx() could complete any time now */
7278 iret
= send(connector
, buffer
, 1, 0);
7279 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
7281 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7282 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7283 ok(overlapped
.Internal
== STATUS_SUCCESS
, "got %08x\n", (ULONG
)overlapped
.Internal
);
7285 /* Check if the buffer from AcceptEx is decoded correctly */
7286 pGetAcceptExSockaddrs(buffer
, 2, sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7287 (struct sockaddr
**)&readBindAddress
, &localSize
,
7288 (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
7289 strcpy( ipbuffer
, inet_ntoa(readBindAddress
->sin_addr
));
7290 ok( readBindAddress
->sin_addr
.s_addr
== bindAddress
.sin_addr
.s_addr
,
7291 "Local socket address is different %s != %s\n",
7292 ipbuffer
, inet_ntoa(bindAddress
.sin_addr
));
7293 ok( readBindAddress
->sin_port
== bindAddress
.sin_port
,
7294 "Local socket port is different: %d != %d\n",
7295 readBindAddress
->sin_port
, bindAddress
.sin_port
);
7296 strcpy( ipbuffer
, inet_ntoa(readRemoteAddress
->sin_addr
));
7297 ok( readRemoteAddress
->sin_addr
.s_addr
== peerAddress
.sin_addr
.s_addr
,
7298 "Remote socket address is different %s != %s\n",
7299 ipbuffer
, inet_ntoa(peerAddress
.sin_addr
));
7300 ok( readRemoteAddress
->sin_port
== peerAddress
.sin_port
,
7301 "Remote socket port is different: %d != %d\n",
7302 readRemoteAddress
->sin_port
, peerAddress
.sin_port
);
7304 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7305 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7306 ok(bytesReturned
== 1, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7308 closesocket(connector
);
7309 connector
= INVALID_SOCKET
;
7310 closesocket(acceptor
);
7312 /* Test CF_DEFER & AcceptEx interaction */
7314 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7315 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7316 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7317 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7318 connector2
= socket(AF_INET
, SOCK_STREAM
, 0);
7319 ok(connector2
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7321 iret
= set_blocking(connector
, FALSE
);
7322 ok(!iret
, "failed to set nonblocking, error %u\n", GetLastError());
7323 iret
= set_blocking(connector2
, FALSE
);
7324 ok(!iret
, "failed to set nonblocking, error %u\n", GetLastError());
7326 /* Connect socket #1 */
7327 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7328 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7332 FD_ZERO(&fds_accept
);
7333 FD_SET(listener
, &fds_accept
);
7334 iret
= select(0, &fds_accept
, NULL
, NULL
, &timeout
);
7335 ok(iret
== 1, "wait timed out\n");
7337 acceptor2
= WSAAccept(listener
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
7338 ok(acceptor2
== INVALID_SOCKET
, "expected failure\n");
7339 ok(WSAGetLastError() == WSATRY_AGAIN
, "got error %u\n", WSAGetLastError());
7340 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
7341 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7342 ok(!bret
, "expected failure\n");
7343 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
7346 FD_SET(connector
, &fds_send
);
7347 iret
= select(0, NULL
, &fds_send
, NULL
, &timeout
);
7348 ok(iret
== 1, "wait timed out\n");
7350 iret
= send(connector
, "1", 1, 0);
7351 ok(iret
== 1, "got ret %d, error %u\n", iret
, WSAGetLastError());
7353 iret
= connect(connector2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7354 ok(iret
== SOCKET_ERROR
, "expected failure\n");
7355 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
7357 iret
= select(0, &fds_accept
, NULL
, NULL
, &timeout
);
7358 ok(iret
== 1, "wait timed out\n");
7360 acceptor2
= accept(listener
, NULL
, NULL
);
7361 ok(acceptor2
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
7362 closesocket(acceptor2
);
7365 FD_SET(connector2
, &fds_send
);
7366 iret
= select(0, NULL
, &fds_send
, NULL
, &timeout
);
7367 ok(iret
== 1, "wait timed out\n");
7369 iret
= send(connector2
, "2", 1, 0);
7370 ok(iret
== 1, "got ret %d, error %u\n", iret
, WSAGetLastError());
7372 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7373 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7375 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7376 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7377 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7379 set_blocking(acceptor
, TRUE
);
7380 iret
= recv( acceptor
, buffer
, 2, 0);
7381 ok(iret
== 1, "Failed to get data, %d, errno: %d\n", iret
, WSAGetLastError());
7382 ok(buffer
[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer
[0]);
7384 closesocket(connector
);
7385 closesocket(connector2
);
7386 closesocket(acceptor
);
7388 /* clean up in case of failures */
7389 while ((acceptor
= accept(listener
, NULL
, NULL
)) != INVALID_SOCKET
)
7390 closesocket(acceptor
);
7392 /* Disconnect during receive? */
7394 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7395 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7396 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7397 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7398 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7399 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7400 &bytesReturned
, &overlapped
);
7401 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7403 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7404 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7406 closesocket(connector
);
7407 connector
= INVALID_SOCKET
;
7409 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7410 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7412 bytesReturned
= 123456;
7413 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7414 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7415 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7417 closesocket(acceptor
);
7419 /* Test closing with pending requests */
7421 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7422 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7423 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7424 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7425 &bytesReturned
, &overlapped
);
7426 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7428 closesocket(acceptor
);
7430 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7431 ok(dwret
== WAIT_OBJECT_0
,
7432 "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7433 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7434 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7436 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7437 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7438 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7439 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7440 &bytesReturned
, &overlapped
);
7441 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7443 CancelIo((HANDLE
) acceptor
);
7445 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7446 ok(dwret
== WAIT_TIMEOUT
, "Waiting for timeout failed with %d + errno %d\n", dwret
, GetLastError());
7448 closesocket(acceptor
);
7450 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7451 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7452 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7453 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7454 &bytesReturned
, &overlapped
);
7455 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7457 closesocket(listener
);
7459 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7460 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7462 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7463 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7465 CloseHandle(overlapped
.hEvent
);
7466 CloseHandle(overlapped2
.hEvent
);
7467 closesocket(acceptor
);
7468 closesocket(connector2
);
7471 static void test_shutdown(void)
7473 struct sockaddr_in addr
, server_addr
, client_addr
;
7474 SOCKET listener
, client
, server
;
7475 OVERLAPPED overlapped
= {0};
7476 DWORD size
, flags
= 0;
7481 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7482 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7483 ok(listener
!= INVALID_SOCKET
, "failed to create listener socket, error %d\n", WSAGetLastError());
7485 memset(&addr
, 0, sizeof(addr
));
7486 addr
.sin_family
= AF_INET
;
7487 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7488 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
7489 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
7490 addrlen
= sizeof(server_addr
);
7491 ret
= getsockname(listener
, (struct sockaddr
*)&server_addr
, &addrlen
);
7492 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
7494 ret
= listen(listener
, 1);
7495 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
7497 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7498 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7500 WSASetLastError(0xdeadbeef);
7501 ret
= shutdown(client
, SD_SEND
);
7502 ok(ret
== -1, "expected failure\n");
7503 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
7505 WSASetLastError(0xdeadbeef);
7506 ret
= shutdown(client
, SD_RECEIVE
);
7507 ok(ret
== -1, "expected failure\n");
7508 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
7510 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7511 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
7512 server
= accept(listener
, NULL
, NULL
);
7513 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
7514 set_blocking(client
, FALSE
);
7516 WSASetLastError(0xdeadbeef);
7517 ret
= shutdown(client
, SD_SEND
);
7518 ok(!ret
, "expected success\n");
7519 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7521 WSASetLastError(0xdeadbeef);
7522 ret
= shutdown(client
, SD_SEND
);
7523 ok(!ret
, "expected success\n");
7524 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7526 WSASetLastError(0xdeadbeef);
7527 ret
= send(client
, "test", 5, 0);
7528 ok(ret
== -1, "got %d\n", ret
);
7529 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7531 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7532 ok(!ret
, "got %d\n", ret
);
7533 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7534 ok(!ret
, "got %d\n", ret
);
7536 WSASetLastError(0xdeadbeef);
7537 ret
= shutdown(server
, SD_RECEIVE
);
7538 ok(!ret
, "expected success\n");
7539 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7541 WSASetLastError(0xdeadbeef);
7542 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7543 todo_wine
ok(ret
== -1, "got %d\n", ret
);
7544 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7546 ret
= send(server
, "test", 5, 0);
7547 ok(ret
== 5, "got %d\n", ret
);
7549 ret
= sync_recv(client
, buffer
, sizeof(buffer
), 0);
7550 ok(ret
== 5, "got %d\n", ret
);
7551 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
7553 WSASetLastError(0xdeadbeef);
7554 ret
= shutdown(client
, SD_RECEIVE
);
7555 ok(!ret
, "expected success\n");
7556 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7558 WSASetLastError(0xdeadbeef);
7559 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
7560 ok(ret
== -1, "got %d\n", ret
);
7561 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7563 WSASetLastError(0xdeadbeef);
7564 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
7565 ok(ret
== -1, "got %d\n", ret
);
7566 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7568 WSASetLastError(0xdeadbeef);
7569 ret
= shutdown(server
, SD_SEND
);
7570 ok(!ret
, "expected success\n");
7571 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7573 WSASetLastError(0xdeadbeef);
7574 ret
= send(server
, "test", 5, 0);
7575 ok(ret
== -1, "got %d\n", ret
);
7576 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7578 addrlen
= sizeof(addr
);
7579 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
7580 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
7581 todo_wine
ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
7583 addrlen
= sizeof(client_addr
);
7584 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
7585 ok(!ret
, "got error %u\n", WSAGetLastError());
7586 addrlen
= sizeof(addr
);
7587 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
7588 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
7589 todo_wine
ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
7591 WSASetLastError(0xdeadbeef);
7592 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7593 ok(ret
== -1, "got %d\n", ret
);
7594 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
7596 WSASetLastError(0xdeadbeef);
7597 ret
= shutdown(client
, 0xdeadbeef);
7598 ok(ret
== -1, "expected failure\n");
7599 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7601 closesocket(client
);
7602 closesocket(server
);
7606 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7607 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7608 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7609 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
7610 server
= accept(listener
, NULL
, NULL
);
7611 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
7613 WSASetLastError(0xdeadbeef);
7614 ret
= shutdown(client
, SD_BOTH
);
7615 ok(!ret
, "expected success\n");
7616 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7618 WSASetLastError(0xdeadbeef);
7619 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
7620 ok(ret
== -1, "got %d\n", ret
);
7621 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7623 WSASetLastError(0xdeadbeef);
7624 ret
= send(client
, "test", 5, 0);
7625 ok(ret
== -1, "got %d\n", ret
);
7626 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7628 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7629 ok(!ret
, "got %d\n", ret
);
7631 WSASetLastError(0xdeadbeef);
7632 ret
= shutdown(server
, SD_BOTH
);
7633 ok(!ret
, "expected success\n");
7634 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7636 WSASetLastError(0xdeadbeef);
7637 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7638 todo_wine
ok(ret
== -1, "got %d\n", ret
);
7639 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7641 WSASetLastError(0xdeadbeef);
7642 ret
= send(server
, "test", 5, 0);
7643 ok(ret
== -1, "got %d\n", ret
);
7644 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7646 addrlen
= sizeof(addr
);
7647 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
7648 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
7649 todo_wine
ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
7651 addrlen
= sizeof(client_addr
);
7652 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
7653 ok(!ret
, "got error %u\n", WSAGetLastError());
7654 addrlen
= sizeof(addr
);
7655 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
7656 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
7657 todo_wine
ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
7659 closesocket(client
);
7660 closesocket(server
);
7662 /* Test shutting down with async I/O pending. */
7664 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7665 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7666 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7667 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
7668 server
= accept(listener
, NULL
, NULL
);
7669 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
7670 set_blocking(client
, FALSE
);
7672 wsabuf
.buf
= buffer
;
7673 wsabuf
.len
= sizeof(buffer
);
7674 WSASetLastError(0xdeadbeef);
7675 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
7676 ok(ret
== -1, "got %d\n", ret
);
7677 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
7679 ret
= shutdown(client
, SD_RECEIVE
);
7680 ok(!ret
, "got error %u\n", WSAGetLastError());
7682 WSASetLastError(0xdeadbeef);
7683 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
7684 ok(ret
== -1, "got %d\n", ret
);
7685 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7687 ret
= send(server
, "test", 5, 0);
7688 ok(ret
== 5, "got %d\n", ret
);
7690 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7691 ok(!ret
, "wait timed out\n");
7693 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
7694 ok(ret
, "got error %u\n", GetLastError());
7695 ok(size
== 5, "got size %u\n", size
);
7696 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, size
));
7698 WSASetLastError(0xdeadbeef);
7699 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
7700 ok(ret
== -1, "got %d\n", ret
);
7701 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7703 WSASetLastError(0xdeadbeef);
7704 ret
= WSARecv(server
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
7705 ok(ret
== -1, "got %d\n", ret
);
7706 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
7708 ret
= shutdown(client
, SD_SEND
);
7709 ok(!ret
, "got error %u\n", WSAGetLastError());
7711 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7712 ok(!ret
, "wait timed out\n");
7714 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
7715 ok(ret
, "got error %u\n", GetLastError());
7716 ok(!size
, "got size %u\n", size
);
7718 closesocket(client
);
7719 closesocket(server
);
7721 /* Test shutting down a listening socket. */
7723 WSASetLastError(0xdeadbeef);
7724 ret
= shutdown(listener
, SD_SEND
);
7725 ok(ret
== -1, "expected failure\n");
7726 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
7728 WSASetLastError(0xdeadbeef);
7729 ret
= shutdown(listener
, SD_RECEIVE
);
7730 ok(ret
== -1, "expected failure\n");
7731 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
7733 closesocket(listener
);
7735 /* Test shutting down UDP sockets. */
7737 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
7738 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
7739 memset(&addr
, 0, sizeof(addr
));
7740 addr
.sin_family
= AF_INET
;
7741 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7742 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
7743 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
7744 addrlen
= sizeof(server_addr
);
7745 ret
= getsockname(server
, (struct sockaddr
*)&server_addr
, &addrlen
);
7746 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
7747 set_blocking(server
, FALSE
);
7749 WSASetLastError(0xdeadbeef);
7750 ret
= shutdown(server
, SD_RECEIVE
);
7751 ok(!ret
, "expected success\n");
7752 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7754 WSASetLastError(0xdeadbeef);
7755 ret
= recvfrom(server
, buffer
, sizeof(buffer
), 0, NULL
, NULL
);
7756 ok(ret
== -1, "got %d\n", ret
);
7757 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7759 ret
= sendto(client
, "test", 5, 0, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7760 ok(ret
== 5, "got %d\n", ret
);
7762 WSASetLastError(0xdeadbeef);
7763 ret
= shutdown(client
, SD_SEND
);
7764 ok(!ret
, "expected success\n");
7765 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7767 WSASetLastError(0xdeadbeef);
7768 ret
= shutdown(client
, SD_SEND
);
7769 ok(!ret
, "expected success\n");
7770 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7772 WSASetLastError(0xdeadbeef);
7773 ret
= sendto(client
, "test", 5, 0, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7774 ok(ret
== -1, "got %d\n", ret
);
7775 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7777 closesocket(client
);
7778 closesocket(server
);
7780 CloseHandle(overlapped
.hEvent
);
7783 static void test_DisconnectEx(void)
7785 struct sockaddr_in server_addr
, client_addr
, addr
;
7786 GUID disconnectex_guid
= WSAID_DISCONNECTEX
;
7787 SOCKET listener
, server
, client
;
7788 LPFN_DISCONNECTEX pDisconnectEx
;
7789 OVERLAPPED overlapped
= {0};
7794 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
7796 client
= socket(AF_INET
, SOCK_STREAM
, 0);
7797 ok(client
!= INVALID_SOCKET
, "failed to create connector socket, error %u\n", WSAGetLastError());
7799 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &disconnectex_guid
, sizeof(disconnectex_guid
),
7800 &pDisconnectEx
, sizeof(pDisconnectEx
), &size
, NULL
, NULL
);
7803 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
7804 closesocket(client
);
7808 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7809 ok(listener
!= INVALID_SOCKET
, "failed to create listener socket, error %d\n", WSAGetLastError());
7811 memset(&addr
, 0, sizeof(addr
));
7812 addr
.sin_family
= AF_INET
;
7813 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7814 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
7815 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
7816 addrlen
= sizeof(server_addr
);
7817 ret
= getsockname(listener
, (struct sockaddr
*)&server_addr
, &addrlen
);
7818 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
7819 ret
= listen(listener
, 1);
7820 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
7822 WSASetLastError(0xdeadbeef);
7823 ret
= pDisconnectEx(INVALID_SOCKET
, &overlapped
, 0, 0);
7824 ok(!ret
, "expected failure\n");
7825 ok(WSAGetLastError() == WSAENOTSOCK
, "got error %u\n", WSAGetLastError());
7827 WSASetLastError(0xdeadbeef);
7828 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
7829 ok(!ret
, "expected failure\n");
7830 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
7832 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7833 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
7834 server
= accept(listener
, NULL
, NULL
);
7835 ok(server
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
7837 WSASetLastError(0xdeadbeef);
7838 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
7839 ok(!ret
, "expected failure\n");
7840 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
7842 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7843 ok(!ret
, "wait timed out\n");
7845 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
7846 ok(ret
, "got error %u\n", GetLastError());
7847 ok(!size
, "got size %u\n", size
);
7849 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7850 ok(ret
== -1, "expected failure\n");
7851 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
7853 WSASetLastError(0xdeadbeef);
7854 ret
= send(client
, "test", 5, 0);
7855 ok(ret
== -1, "expected failure\n");
7856 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7858 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7859 ok(!ret
, "got %d\n", ret
);
7861 ret
= send(server
, "test", 5, 0);
7862 ok(ret
== 5, "got %d\n", ret
);
7864 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
7865 ok(ret
== 5, "got %d\n", ret
);
7866 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
7868 addrlen
= sizeof(addr
);
7869 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
7870 ok(!ret
, "got error %u\n", WSAGetLastError());
7871 ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
7873 addrlen
= sizeof(client_addr
);
7874 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
7875 ok(!ret
, "got error %u\n", WSAGetLastError());
7876 addrlen
= sizeof(addr
);
7877 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
7878 ok(!ret
, "got error %u\n", WSAGetLastError());
7879 ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
7881 closesocket(client
);
7882 closesocket(server
);
7884 /* Test the synchronous case. */
7886 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7887 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
7888 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7889 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
7890 server
= accept(listener
, NULL
, NULL
);
7891 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
7893 WSASetLastError(0xdeadbeef);
7894 ret
= pDisconnectEx(client
, NULL
, 0, 0);
7895 ok(ret
, "expected success\n");
7896 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7898 WSASetLastError(0xdeadbeef);
7899 ret
= pDisconnectEx(client
, NULL
, 0, 0);
7900 ok(ret
, "expected success\n");
7901 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
7903 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
7904 ok(ret
== -1, "expected failure\n");
7905 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
7907 WSASetLastError(0xdeadbeef);
7908 ret
= send(client
, "test", 5, 0);
7909 ok(ret
== -1, "expected failure\n");
7910 todo_wine
ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
7912 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
7913 ok(!ret
, "got %d\n", ret
);
7915 ret
= send(server
, "test", 5, 0);
7916 ok(ret
== 5, "got %d\n", ret
);
7918 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
7919 ok(ret
== 5, "got %d\n", ret
);
7920 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
7922 addrlen
= sizeof(addr
);
7923 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
7924 ok(!ret
, "got error %u\n", WSAGetLastError());
7925 ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
7927 addrlen
= sizeof(client_addr
);
7928 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
7929 ok(!ret
, "got error %u\n", WSAGetLastError());
7930 addrlen
= sizeof(addr
);
7931 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
7932 ok(!ret
, "got error %u\n", WSAGetLastError());
7933 ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
7935 closesocket(client
);
7936 closesocket(server
);
7938 closesocket(listener
);
7939 CloseHandle(overlapped
.hEvent
);
7942 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
7944 static void compare_file2(HANDLE handle
, SOCKET sock
, int offset
, const char *file
, int line
)
7946 char buf1
[256], buf2
[256];
7950 SetFilePointer(handle
, offset
, NULL
, FILE_BEGIN
);
7953 DWORD n1
= 0, n2
= 0;
7955 success
= ReadFile(handle
, buf1
, sizeof(buf1
), &n1
, NULL
);
7956 ok_(file
,line
)(success
, "Failed to read from file.\n");
7957 if (success
&& n1
== 0)
7961 n2
= recv(sock
, buf2
, n1
, 0);
7962 ok_(file
,line
)(n1
== n2
, "Block %d size mismatch (%d != %d)\n", i
, n1
, n2
);
7963 ok_(file
,line
)(memcmp(buf1
, buf2
, n2
) == 0, "Block %d failed\n", i
);
7968 static void test_TransmitFile(void)
7970 DWORD num_bytes
, err
, file_size
, total_sent
;
7971 GUID transmitFileGuid
= WSAID_TRANSMITFILE
;
7972 LPFN_TRANSMITFILE pTransmitFile
= NULL
;
7973 HANDLE file
= INVALID_HANDLE_VALUE
;
7974 char header_msg
[] = "hello world";
7975 char footer_msg
[] = "goodbye!!!";
7976 char system_ini_path
[MAX_PATH
];
7977 struct sockaddr_in bindAddress
;
7978 TRANSMIT_FILE_BUFFERS buffers
;
7979 SOCKET client
, server
, dest
;
7985 memset( &ov
, 0, sizeof(ov
) );
7987 /* Setup sockets for testing TransmitFile */
7988 client
= socket(AF_INET
, SOCK_STREAM
, 0);
7989 ok(client
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7990 server
= socket(AF_INET
, SOCK_STREAM
, 0);
7991 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", GetLastError());
7992 iret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &transmitFileGuid
, sizeof(transmitFileGuid
),
7993 &pTransmitFile
, sizeof(pTransmitFile
), &num_bytes
, NULL
, NULL
);
7994 ok(!iret
, "failed to get TransmitFile, error %u\n", GetLastError());
7995 GetSystemWindowsDirectoryA(system_ini_path
, MAX_PATH
);
7996 strcat(system_ini_path
, "\\system.ini");
7997 file
= CreateFileA(system_ini_path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
7998 ok(file
!= INVALID_HANDLE_VALUE
, "failed to open file, error %u\n", GetLastError());
7999 file_size
= GetFileSize(file
, NULL
);
8001 /* Test TransmitFile with an invalid socket */
8002 bret
= pTransmitFile(INVALID_SOCKET
, file
, 0, 0, NULL
, NULL
, 0);
8003 err
= WSAGetLastError();
8004 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8005 ok(err
== WSAENOTSOCK
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTSOCK
);
8007 /* Test a bogus TransmitFile without a connected socket */
8008 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, TF_REUSE_SOCKET
);
8009 err
= WSAGetLastError();
8010 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8011 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
8013 /* Setup a properly connected socket for transfers */
8014 memset(&bindAddress
, 0, sizeof(bindAddress
));
8015 bindAddress
.sin_family
= AF_INET
;
8016 bindAddress
.sin_port
= htons(SERVERPORT
+1);
8017 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8018 iret
= bind(server
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8019 ok(!iret
, "failed to bind socket, error %u\n", GetLastError());
8020 iret
= listen(server
, 1);
8021 ok(!iret
, "failed to listen, error %u\n", GetLastError());
8022 iret
= connect(client
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8023 ok(!iret
, "failed to connect, error %u\n", GetLastError());
8024 len
= sizeof(bindAddress
);
8025 dest
= accept(server
, (struct sockaddr
*)&bindAddress
, &len
);
8026 ok(dest
!= INVALID_SOCKET
, "failed to accept, error %u\n", GetLastError());
8027 iret
= set_blocking(dest
, FALSE
);
8028 ok(!iret
, "failed to set nonblocking, error %u\n", GetLastError());
8030 /* Test TransmitFile with no possible buffer */
8031 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
8032 ok(bret
, "TransmitFile failed unexpectedly.\n");
8033 iret
= recv(dest
, buf
, sizeof(buf
), 0);
8034 ok(iret
== -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret
);
8036 /* Test TransmitFile with only buffer data */
8037 buffers
.Head
= &header_msg
[0];
8038 buffers
.HeadLength
= sizeof(header_msg
);
8039 buffers
.Tail
= &footer_msg
[0];
8040 buffers
.TailLength
= sizeof(footer_msg
);
8041 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, &buffers
, 0);
8042 ok(bret
, "TransmitFile failed unexpectedly.\n");
8043 iret
= recv(dest
, buf
, sizeof(buf
), 0);
8044 ok(iret
== sizeof(header_msg
)+sizeof(footer_msg
),
8045 "Returned an unexpected buffer from TransmitFile: %d\n", iret
);
8046 ok(memcmp(&buf
[0], &header_msg
[0], sizeof(header_msg
)) == 0,
8047 "TransmitFile header buffer did not match!\n");
8048 ok(memcmp(&buf
[sizeof(header_msg
)], &footer_msg
[0], sizeof(footer_msg
)) == 0,
8049 "TransmitFile footer buffer did not match!\n");
8051 /* Test TransmitFile with only file data */
8052 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, NULL
, 0);
8053 ok(bret
, "TransmitFile failed unexpectedly.\n");
8054 compare_file(file
, dest
, 0);
8056 /* Test TransmitFile with both file and buffer data */
8057 buffers
.Head
= &header_msg
[0];
8058 buffers
.HeadLength
= sizeof(header_msg
);
8059 buffers
.Tail
= &footer_msg
[0];
8060 buffers
.TailLength
= sizeof(footer_msg
);
8061 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8062 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, &buffers
, 0);
8063 ok(bret
, "TransmitFile failed unexpectedly.\n");
8064 iret
= recv(dest
, buf
, sizeof(header_msg
), 0);
8065 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)) == 0,
8066 "TransmitFile header buffer did not match!\n");
8067 compare_file(file
, dest
, 0);
8068 iret
= recv(dest
, buf
, sizeof(footer_msg
), 0);
8069 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)) == 0,
8070 "TransmitFile footer buffer did not match!\n");
8072 /* Test overlapped TransmitFile */
8073 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8074 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8075 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
8076 err
= WSAGetLastError();
8077 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8078 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n",
8079 err
, ERROR_IO_PENDING
);
8080 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8081 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8082 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8083 ok(total_sent
== file_size
,
8084 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8085 total_sent
, file_size
);
8086 compare_file(file
, dest
, 0);
8088 /* Test overlapped TransmitFile w/ start offset */
8089 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8090 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8092 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
8093 err
= WSAGetLastError();
8094 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8095 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8096 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8097 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8098 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8099 ok(total_sent
== (file_size
- ov
.Offset
),
8100 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8101 total_sent
, file_size
- ov
.Offset
);
8102 compare_file(file
, dest
, ov
.Offset
);
8104 /* Test overlapped TransmitFile w/ file and buffer data */
8105 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8106 buffers
.Head
= &header_msg
[0];
8107 buffers
.HeadLength
= sizeof(header_msg
);
8108 buffers
.Tail
= &footer_msg
[0];
8109 buffers
.TailLength
= sizeof(footer_msg
);
8110 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8112 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, &buffers
, 0);
8113 err
= WSAGetLastError();
8114 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8115 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8116 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8117 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8118 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8119 ok(total_sent
== (file_size
+ buffers
.HeadLength
+ buffers
.TailLength
),
8120 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8121 total_sent
, file_size
+ buffers
.HeadLength
+ buffers
.TailLength
);
8122 iret
= recv(dest
, buf
, sizeof(header_msg
), 0);
8123 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)) == 0,
8124 "TransmitFile header buffer did not match!\n");
8125 compare_file(file
, dest
, 0);
8126 iret
= recv(dest
, buf
, sizeof(footer_msg
), 0);
8127 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)) == 0,
8128 "TransmitFile footer buffer did not match!\n");
8130 /* Test TransmitFile with a UDP datagram socket */
8131 closesocket(client
);
8132 client
= socket(AF_INET
, SOCK_DGRAM
, 0);
8133 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
8134 err
= WSAGetLastError();
8135 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8136 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
8139 CloseHandle(ov
.hEvent
);
8140 closesocket(client
);
8141 closesocket(server
);
8144 static void test_getpeername(void)
8147 struct sockaddr_in sa
, sa_out
;
8148 SOCKADDR_STORAGE ss
;
8150 const char buf
[] = "hello world";
8153 /* Test the parameter validation order. */
8154 ret
= getpeername(INVALID_SOCKET
, NULL
, NULL
);
8155 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8156 ok(WSAGetLastError() == WSAENOTSOCK
,
8157 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
8159 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
8160 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8162 ret
= getpeername(sock
, NULL
, NULL
);
8163 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8164 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
,
8165 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8167 memset(&sa
, 0, sizeof(sa
));
8168 sa
.sin_family
= AF_INET
;
8169 sa
.sin_port
= htons(139);
8170 sa
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8172 /* sendto does not change a socket's connection state. */
8173 ret
= sendto(sock
, buf
, sizeof(buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
8174 ok(ret
!= SOCKET_ERROR
,
8175 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8177 ret
= getpeername(sock
, NULL
, NULL
);
8178 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8179 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
,
8180 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8182 ret
= connect(sock
, (struct sockaddr
*)&sa
, sizeof(sa
));
8184 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8186 ret
= getpeername(sock
, NULL
, NULL
);
8187 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8188 ok(WSAGetLastError() == WSAEFAULT
,
8189 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8191 /* Test crashes on Wine. */
8194 ret
= getpeername(sock
, (void*)0xdeadbeef, (void*)0xcafebabe);
8195 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8196 ok(WSAGetLastError() == WSAEFAULT
,
8197 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8200 ret
= getpeername(sock
, (struct sockaddr
*)&sa_out
, NULL
);
8201 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8202 ok(WSAGetLastError() == WSAEFAULT
,
8203 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8206 ret
= getpeername(sock
, NULL
, &sa_len
);
8207 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8208 ok(WSAGetLastError() == WSAEFAULT
,
8209 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8210 ok(!sa_len
, "got %d\n", sa_len
);
8213 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8214 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8215 ok(WSAGetLastError() == WSAEFAULT
,
8216 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8217 ok(!sa_len
, "got %d\n", sa_len
);
8219 sa_len
= sizeof(ss
);
8220 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8221 ok(ret
== 0, "Expected getpeername to return 0, got %d\n", ret
);
8222 ok(!memcmp(&sa
, &ss
, sizeof(sa
)),
8223 "Expected the returned structure to be identical to the connect structure\n");
8224 ok(sa_len
== sizeof(sa
), "got %d\n", sa_len
);
8229 static void test_sioRoutingInterfaceQuery(void)
8231 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
8232 struct sockaddr_in in
= {0}, out
= {0};
8239 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
8240 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8241 port
= CreateIoCompletionPort((HANDLE
)sock
, NULL
, 123, 0);
8243 WSASetLastError(0xdeadbeef);
8244 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), NULL
, NULL
, NULL
);
8245 ok(ret
== -1, "expected failure\n");
8246 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
8249 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
) - 1, &out
, sizeof(out
), &size
, NULL
, NULL
);
8250 ok(ret
== -1, "expected failure\n");
8251 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8252 ok(size
== 0xdeadbeef, "got size %u\n", size
);
8255 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, NULL
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
8256 ok(ret
== -1, "expected failure\n");
8257 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8258 ok(size
== 0xdeadbeef, "got size %u\n", size
);
8261 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
8262 ok(ret
== -1, "expected failure\n");
8263 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
8264 ok(size
== 0xdeadbeef, "got size %u\n", size
);
8266 in
.sin_family
= AF_INET
;
8268 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
8269 todo_wine
ok(ret
== -1, "expected failure\n");
8270 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8271 todo_wine
ok(size
== 0xdeadbeef, "got size %u\n", size
);
8273 in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
8274 WSASetLastError(0xdeadbeef);
8276 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
8277 ok(!ret
, "expected failure\n");
8278 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
8279 ok(size
== sizeof(out
), "got size %u\n", size
);
8280 /* We expect the source address to be INADDR_LOOPBACK as well, but
8281 * there's no guarantee that a route to the loopback address exists,
8282 * so rather than introduce spurious test failures we do not test the
8287 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
) - 1, &size
, NULL
, NULL
);
8288 ok(ret
== -1, "expected failure\n");
8289 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
8290 todo_wine
ok(size
== sizeof(out
), "got size %u\n", size
);
8293 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), NULL
, sizeof(out
), &size
, NULL
, NULL
);
8294 ok(ret
== -1, "expected failure\n");
8295 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
8296 ok(size
== 0xdeadbeef, "got size %u\n", size
);
8298 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), NULL
, &overlapped
, NULL
);
8299 ok(ret
== -1, "expected failure\n");
8300 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
8301 ok(size
== 0xdeadbeef, "got size %u\n", size
);
8303 WSASetLastError(0xdeadbeef);
8305 overlapped
.Internal
= 0xdeadbeef;
8306 overlapped
.InternalHigh
= 0xdeadbeef;
8307 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, &overlapped
, NULL
);
8308 ok(!ret
, "expected failure\n");
8309 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
8310 ok(size
== sizeof(out
), "got size %u\n", size
);
8312 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
8313 ok(ret
, "got error %u\n", GetLastError());
8314 ok(!size
, "got size %u\n", size
);
8315 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
8316 ok(!overlapped
.Internal
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
8317 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
8322 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
8324 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
),
8325 &out
, sizeof(out
), NULL
, &overlapped
, socket_apc
);
8326 ok(ret
== -1, "expected failure\n");
8327 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
8331 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
),
8332 &out
, sizeof(out
), &size
, &overlapped
, socket_apc
);
8333 ok(!ret
, "expected success\n");
8334 ok(size
== sizeof(out
), "got size %u\n", size
);
8336 ret
= SleepEx(0, TRUE
);
8337 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
8338 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
8339 ok(!apc_error
, "got APC error %u\n", apc_error
);
8340 ok(!apc_size
, "got APC size %u\n", apc_size
);
8341 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
8346 static void test_sioAddressListChange(void)
8348 struct sockaddr_in bindAddress
;
8349 struct in_addr net_address
;
8350 WSAOVERLAPPED overlapped
, *olp
;
8352 DWORD num_bytes
, error
, tick
;
8353 SOCKET sock
, sock2
, sock3
;
8354 WSAEVENT event2
, event3
;
8361 /* Use gethostbyname to find the list of local network interfaces */
8362 h
= gethostbyname("");
8363 ok(!!h
, "failed to get interface list, error %u\n", WSAGetLastError());
8364 for (acount
= 0; h
->h_addr_list
[acount
]; acount
++);
8367 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
8371 net_address
.s_addr
= *(ULONG
*) h
->h_addr_list
[0];
8373 sock
= socket(AF_INET
, 0, IPPROTO_TCP
);
8374 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
8376 memset(&bindAddress
, 0, sizeof(bindAddress
));
8377 bindAddress
.sin_family
= AF_INET
;
8378 bindAddress
.sin_addr
.s_addr
= net_address
.s_addr
;
8379 SetLastError(0xdeadbeef);
8380 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8381 ok (!ret
, "bind() failed with error %d\n", GetLastError());
8382 set_blocking(sock
, FALSE
);
8384 memset(&overlapped
, 0, sizeof(overlapped
));
8385 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8386 SetLastError(0xdeadbeef);
8387 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8388 error
= GetLastError();
8389 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error
);
8390 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%x\n", error
);
8392 CloseHandle(overlapped
.hEvent
);
8395 sock
= socket(AF_INET
, 0, IPPROTO_TCP
);
8396 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
8398 SetLastError(0xdeadbeef);
8399 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8400 ok (!ret
, "bind() failed with error %d\n", GetLastError());
8401 set_blocking(sock
, TRUE
);
8403 memset(&overlapped
, 0, sizeof(overlapped
));
8404 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8405 SetLastError(0xdeadbeef);
8406 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8407 error
= GetLastError();
8408 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error
);
8409 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%x\n", error
);
8411 CloseHandle(overlapped
.hEvent
);
8414 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8415 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
8417 SetLastError(0xdeadbeef);
8418 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8419 ok (!ret
, "bind() failed with error %d\n", GetLastError());
8420 set_blocking(sock
, FALSE
);
8422 memset(&overlapped
, 0, sizeof(overlapped
));
8423 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8424 SetLastError(0xdeadbeef);
8425 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8426 error
= GetLastError();
8427 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error
);
8428 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%x\n", error
);
8430 CloseHandle(overlapped
.hEvent
);
8433 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8434 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
8436 SetLastError(0xdeadbeef);
8437 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8438 ok (!ret
, "bind() failed with error %d\n", GetLastError());
8439 set_blocking(sock
, TRUE
);
8441 memset(&overlapped
, 0, sizeof(overlapped
));
8442 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8443 SetLastError(0xdeadbeef);
8444 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8445 error
= GetLastError();
8446 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error
);
8447 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%x\n", error
);
8449 CloseHandle(overlapped
.hEvent
);
8452 /* When the socket is overlapped non-blocking and the list change is requested without
8453 * an overlapped structure the error will be different. */
8454 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8455 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
8457 SetLastError(0xdeadbeef);
8458 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8459 ok (!ret
, "bind() failed with error %d\n", GetLastError());
8460 set_blocking(sock
, FALSE
);
8462 SetLastError(0xdeadbeef);
8463 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
8464 error
= GetLastError();
8465 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error
);
8466 ok (error
== WSAEWOULDBLOCK
, "expected 10035, got %d\n", error
);
8468 io_port
= CreateIoCompletionPort( (HANDLE
)sock
, NULL
, 0, 0 );
8469 ok (io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8471 set_blocking(sock
, FALSE
);
8472 memset(&overlapped
, 0, sizeof(overlapped
));
8473 SetLastError(0xdeadbeef);
8474 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8475 error
= GetLastError();
8476 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %u\n", error
);
8477 ok (error
== ERROR_IO_PENDING
, "expected ERROR_IO_PENDING got %u\n", error
);
8479 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8480 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 0 );
8481 ok(!bret
, "failed to get completion status %u\n", bret
);
8482 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8483 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8487 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8488 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 0 );
8489 ok(!bret
, "failed to get completion status %u\n", bret
);
8490 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %u\n", GetLastError());
8491 ok(olp
== &overlapped
, "Overlapped structure is at %p\n", olp
);
8493 CloseHandle(io_port
);
8495 /* Misuse of the API by using a blocking socket and not using an overlapped structure,
8496 * this leads to a hang forever. */
8499 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8501 SetLastError(0xdeadbeef);
8502 bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8504 set_blocking(sock
, TRUE
);
8505 WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
8511 if (!winetest_interactive
)
8513 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
8517 /* Bind an overlapped socket to the first found network interface */
8518 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8519 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8520 sock2
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8521 ok(sock2
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8522 sock3
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8523 ok(sock3
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8525 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8526 ok(!ret
, "bind failed unexpectedly\n");
8527 ret
= bind(sock2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8528 ok(!ret
, "bind failed unexpectedly\n");
8529 ret
= bind(sock3
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8530 ok(!ret
, "bind failed unexpectedly\n");
8532 set_blocking(sock2
, FALSE
);
8533 set_blocking(sock3
, FALSE
);
8535 /* Wait for address changes, request that the user connects/disconnects an interface */
8536 memset(&overlapped
, 0, sizeof(overlapped
));
8537 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8538 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8539 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
8540 ok(WSAGetLastError() == WSA_IO_PENDING
, "Expected pending last error, got %d\n", WSAGetLastError());
8542 ret
= WSAIoctl(sock2
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
8543 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
8544 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "Expected would block last error, got %d\n", WSAGetLastError());
8546 event2
= WSACreateEvent();
8547 event3
= WSACreateEvent();
8548 ret
= WSAEventSelect (sock2
, event2
, FD_ADDRESS_LIST_CHANGE
);
8549 ok(!ret
, "WSAEventSelect failed with %d\n", WSAGetLastError());
8550 /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */
8551 ret
= WSAEventSelect (sock3
, event3
, FD_ADDRESS_LIST_CHANGE
);
8552 ok(!ret
, "WSAEventSelect failed with %d\n", WSAGetLastError());
8554 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
8555 " change the ipv4 address of any of the local network interfaces (15 second timeout).\n");
8556 tick
= GetTickCount();
8557 ret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
8558 ok(ret
== WAIT_OBJECT_0
, "failed to get overlapped event %u\n", ret
);
8560 ret
= WaitForSingleObject(event2
, 500);
8562 ok(ret
== WAIT_OBJECT_0
, "failed to get change event %u\n", ret
);
8564 ret
= WaitForSingleObject(event3
, 500);
8565 ok(ret
== WAIT_TIMEOUT
, "unexpected change event\n");
8567 trace("Spent %d ms waiting.\n", GetTickCount() - tick
);
8569 WSACloseEvent(event2
);
8570 WSACloseEvent(event3
);
8578 * Provide consistent initialization for the AcceptEx IOCP tests.
8580 static SOCKET
setup_iocp_src(struct sockaddr_in
*bindAddress
)
8585 src
= socket(AF_INET
, SOCK_STREAM
, 0);
8586 ok(src
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8588 memset(bindAddress
, 0, sizeof(*bindAddress
));
8589 bindAddress
->sin_family
= AF_INET
;
8590 bindAddress
->sin_addr
.s_addr
= inet_addr("127.0.0.1");
8591 iret
= bind(src
, (struct sockaddr
*)bindAddress
, sizeof(*bindAddress
));
8592 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8594 socklen
= sizeof(*bindAddress
);
8595 iret
= getsockname(src
, (struct sockaddr
*)bindAddress
, &socklen
);
8596 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
8598 iret
= set_blocking(src
, FALSE
);
8599 ok(!iret
, "failed to make socket non-blocking, error %u\n", WSAGetLastError());
8601 iret
= listen(src
, 5);
8602 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
8607 static void test_completion_port(void)
8610 WSAOVERLAPPED ov
, *olp
;
8611 SOCKET src
, dest
, dup
, connector
= INVALID_SOCKET
;
8612 WSAPROTOCOL_INFOA info
;
8615 DWORD num_bytes
, flags
;
8620 struct sockaddr_in bindAddress
;
8621 GUID acceptExGuid
= WSAID_ACCEPTEX
;
8622 LPFN_ACCEPTEX pAcceptEx
= NULL
;
8625 memset(buf
, 0, sizeof(buf
));
8626 io_port
= CreateIoCompletionPort(INVALID_HANDLE_VALUE
, NULL
, 0, 0);
8627 ok( io_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8629 memset(&ov
, 0, sizeof(ov
));
8631 tcp_socketpair(&src
, &dest
);
8633 bufs
.len
= sizeof(buf
);
8639 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8640 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8642 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, io_port
, 125, 0 );
8643 ok(io_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8645 SetLastError(0xdeadbeef);
8647 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8648 ok(iret
== SOCKET_ERROR
, "WSARecv returned %d\n", iret
);
8649 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8654 src
= INVALID_SOCKET
;
8656 SetLastError(0xdeadbeef);
8658 num_bytes
= 0xdeadbeef;
8659 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8661 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8662 todo_wine
ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8663 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
, "Last error was %d\n", GetLastError());
8664 ok(key
== 125, "Key is %lu\n", key
);
8665 ok(num_bytes
== 0, "Number of bytes received is %u\n", num_bytes
);
8666 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8668 SetLastError(0xdeadbeef);
8670 num_bytes
= 0xdeadbeef;
8671 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8673 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8674 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8675 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8676 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8677 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8678 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8680 if (dest
!= INVALID_SOCKET
)
8683 memset(&ov
, 0, sizeof(ov
));
8685 tcp_socketpair(&src
, &dest
);
8687 bufs
.len
= sizeof(buf
);
8693 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8694 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8696 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
8697 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8699 set_blocking(dest
, FALSE
);
8702 src
= INVALID_SOCKET
;
8706 num_bytes
= 0xdeadbeef;
8707 SetLastError(0xdeadbeef);
8709 iret
= WSASend(dest
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
8710 ok(iret
== SOCKET_ERROR
, "WSASend failed - %d\n", iret
);
8711 ok(GetLastError() == WSAECONNRESET
, "Last error was %d\n", GetLastError());
8712 ok(num_bytes
== 0xdeadbeef, "Managed to send %d\n", num_bytes
);
8714 SetLastError(0xdeadbeef);
8716 num_bytes
= 0xdeadbeef;
8717 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8719 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8720 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
8721 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8722 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8723 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8724 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8726 if (dest
!= INVALID_SOCKET
)
8729 /* Test IOCP response on successful immediate read. */
8730 tcp_socketpair(&src
, &dest
);
8732 bufs
.len
= sizeof(buf
);
8735 SetLastError(0xdeadbeef);
8737 iret
= WSASend(src
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
8738 ok(!iret
, "WSASend failed - %d, last error %u\n", iret
, GetLastError());
8739 ok(num_bytes
== sizeof(buf
), "Managed to send %d\n", num_bytes
);
8741 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
8742 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8743 set_blocking(dest
, FALSE
);
8746 FD_SET(dest
, &fds_recv
);
8747 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
8749 num_bytes
= 0xdeadbeef;
8752 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8753 ok(!iret
, "WSARecv failed - %d, last error %u\n", iret
, GetLastError());
8754 ok(num_bytes
== sizeof(buf
), "Managed to read %d\n", num_bytes
);
8756 SetLastError(0xdeadbeef);
8758 num_bytes
= 0xdeadbeef;
8759 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8761 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8762 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
8763 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
8764 ok(key
== 125, "Key is %lu\n", key
);
8765 ok(num_bytes
== sizeof(buf
), "Number of bytes transferred is %u\n", num_bytes
);
8766 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8768 /* Test IOCP response on graceful shutdown. */
8772 FD_SET(dest
, &fds_recv
);
8773 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
8775 num_bytes
= 0xdeadbeef;
8777 memset(&ov
, 0, sizeof(ov
));
8779 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8780 ok(!iret
, "WSARecv failed - %d, last error %u\n", iret
, GetLastError());
8781 ok(!num_bytes
, "Managed to read %d\n", num_bytes
);
8783 SetLastError(0xdeadbeef);
8785 num_bytes
= 0xdeadbeef;
8786 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8788 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8789 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
8790 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
8791 ok(key
== 125, "Key is %lu\n", key
);
8792 ok(!num_bytes
, "Number of bytes transferred is %u\n", num_bytes
);
8793 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8796 src
= INVALID_SOCKET
;
8798 dest
= INVALID_SOCKET
;
8800 /* Test IOCP response on hard shutdown. This was the condition that triggered
8801 * a crash in an actual app (bug 38980). */
8802 tcp_socketpair(&src
, &dest
);
8804 bufs
.len
= sizeof(buf
);
8807 memset(&ov
, 0, sizeof(ov
));
8811 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8812 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8814 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
8815 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8816 set_blocking(dest
, FALSE
);
8819 src
= INVALID_SOCKET
;
8822 FD_SET(dest
, &fds_recv
);
8823 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
8825 num_bytes
= 0xdeadbeef;
8826 SetLastError(0xdeadbeef);
8828 /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */
8829 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8830 todo_wine
ok(iret
== SOCKET_ERROR
, "WSARecv failed - %d\n", iret
);
8831 todo_wine
ok(GetLastError() == WSAECONNRESET
, "Last error was %d\n", GetLastError());
8832 todo_wine
ok(num_bytes
== 0xdeadbeef, "Managed to read %d\n", num_bytes
);
8834 SetLastError(0xdeadbeef);
8836 num_bytes
= 0xdeadbeef;
8837 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8839 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8840 todo_wine
ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
8841 todo_wine
ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8842 todo_wine
ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8843 todo_wine
ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8844 todo_wine
ok(!olp
, "Overlapped structure is at %p\n", olp
);
8848 /* Test reading from a non-connected socket, mostly because the above test is marked todo. */
8849 dest
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8850 ok(dest
!= INVALID_SOCKET
, "socket() failed\n");
8852 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
8853 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8854 set_blocking(dest
, FALSE
);
8856 num_bytes
= 0xdeadbeef;
8857 SetLastError(0xdeadbeef);
8858 memset(&ov
, 0, sizeof(ov
));
8860 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8861 ok(iret
== SOCKET_ERROR
, "WSARecv failed - %d\n", iret
);
8862 ok(GetLastError() == WSAENOTCONN
, "Last error was %d\n", GetLastError());
8863 ok(num_bytes
== 0xdeadbeef, "Managed to read %d\n", num_bytes
);
8865 SetLastError(0xdeadbeef);
8867 num_bytes
= 0xdeadbeef;
8868 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8870 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8871 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
8872 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8873 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8874 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8875 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8877 num_bytes
= 0xdeadbeef;
8880 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
8881 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8883 iret
= WSAIoctl(dest
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
8884 &pAcceptEx
, sizeof(pAcceptEx
), &num_bytes
, NULL
, NULL
);
8885 ok(!iret
, "failed to get AcceptEx, error %u\n", WSAGetLastError());
8887 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
8889 src
= setup_iocp_src(&bindAddress
);
8891 SetLastError(0xdeadbeef);
8893 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8894 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8896 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8897 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8899 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
8900 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8903 src
= INVALID_SOCKET
;
8905 SetLastError(0xdeadbeef);
8907 num_bytes
= 0xdeadbeef;
8908 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8910 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8911 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8912 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8913 ok(key
== 125, "Key is %lu\n", key
);
8914 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8915 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8916 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8918 SetLastError(0xdeadbeef);
8920 num_bytes
= 0xdeadbeef;
8921 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8922 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8923 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8924 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8925 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8926 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8927 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8929 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
8931 src
= setup_iocp_src(&bindAddress
);
8933 SetLastError(0xdeadbeef);
8935 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
8936 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8938 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8939 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8941 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8942 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8945 src
= INVALID_SOCKET
;
8947 SetLastError(0xdeadbeef);
8949 num_bytes
= 0xdeadbeef;
8950 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8952 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8953 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8954 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8955 ok(key
== 125, "Key is %lu\n", key
);
8956 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8957 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8958 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8960 SetLastError(0xdeadbeef);
8962 num_bytes
= 0xdeadbeef;
8963 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8964 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8965 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8966 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8967 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8968 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8969 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8971 /* Test IOCP with duplicated handle */
8973 src
= setup_iocp_src(&bindAddress
);
8975 SetLastError(0xdeadbeef);
8977 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
8978 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8980 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8981 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8982 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8984 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8985 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8987 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8988 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8990 SetLastError(0xdeadbeef);
8992 num_bytes
= 0xdeadbeef;
8993 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8994 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8995 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8996 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8997 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8998 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8999 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9002 src
= INVALID_SOCKET
;
9004 dup
= INVALID_SOCKET
;
9006 SetLastError(0xdeadbeef);
9008 num_bytes
= 0xdeadbeef;
9009 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9010 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9011 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9012 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
9013 ok(key
== 125, "Key is %lu\n", key
);
9014 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9015 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9016 ok(olp
&& olp
->Internal
== (ULONG
)STATUS_CANCELLED
, "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9018 SetLastError(0xdeadbeef);
9020 num_bytes
= 0xdeadbeef;
9021 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9022 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9023 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9024 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9025 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9026 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9027 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9029 /* Test IOCP with duplicated handle (closing duplicated handle) */
9031 src
= setup_iocp_src(&bindAddress
);
9033 SetLastError(0xdeadbeef);
9035 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9036 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9038 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
9039 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
9040 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
9042 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9043 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9045 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9046 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9049 dup
= INVALID_SOCKET
;
9051 SetLastError(0xdeadbeef);
9053 num_bytes
= 0xdeadbeef;
9054 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9055 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9056 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9057 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9058 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9059 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9060 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9062 SetLastError(0xdeadbeef);
9064 num_bytes
= 0xdeadbeef;
9065 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9066 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9067 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9068 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9069 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9070 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9071 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9074 src
= INVALID_SOCKET
;
9076 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9077 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9078 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
9079 ok(key
== 125, "Key is %lu\n", key
);
9080 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9081 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9082 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9084 SetLastError(0xdeadbeef);
9086 num_bytes
= 0xdeadbeef;
9087 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9088 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9089 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9090 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9091 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9092 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9093 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9095 /* Test IOCP with duplicated handle (closing original handle) */
9097 src
= setup_iocp_src(&bindAddress
);
9099 SetLastError(0xdeadbeef);
9101 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9102 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9104 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
9105 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
9106 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
9108 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9109 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9111 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9112 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9115 src
= INVALID_SOCKET
;
9117 SetLastError(0xdeadbeef);
9119 num_bytes
= 0xdeadbeef;
9120 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9121 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9122 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9123 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9124 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9125 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9126 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9129 dup
= INVALID_SOCKET
;
9131 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9132 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9133 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
9134 ok(key
== 125, "Key is %lu\n", key
);
9135 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9136 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9137 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9139 SetLastError(0xdeadbeef);
9141 num_bytes
= 0xdeadbeef;
9142 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9143 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9144 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9145 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9146 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9147 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9148 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9150 /* Test IOCP without AcceptEx */
9152 src
= setup_iocp_src(&bindAddress
);
9154 SetLastError(0xdeadbeef);
9156 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9157 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9160 src
= INVALID_SOCKET
;
9162 SetLastError(0xdeadbeef);
9164 num_bytes
= 0xdeadbeef;
9165 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9166 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9167 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9168 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9169 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9170 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9171 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9175 src
= setup_iocp_src(&bindAddress
);
9177 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9178 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
9180 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9181 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9183 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
9184 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9186 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9187 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9189 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9190 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9192 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9193 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9195 closesocket(connector
);
9196 connector
= INVALID_SOCKET
;
9198 SetLastError(0xdeadbeef);
9200 num_bytes
= 0xdeadbeef;
9201 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9203 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9204 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
9205 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9206 ok(key
== 125, "Key is %lu\n", key
);
9207 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9208 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9209 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9211 SetLastError(0xdeadbeef);
9213 num_bytes
= 0xdeadbeef;
9214 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9215 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9216 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9217 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9218 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9219 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9220 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9222 if (dest
!= INVALID_SOCKET
)
9224 if (src
!= INVALID_SOCKET
)
9229 src
= setup_iocp_src(&bindAddress
);
9231 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
9232 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
9234 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9235 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
9237 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9238 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9240 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
9241 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9243 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9244 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9246 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9247 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9249 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9250 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9252 iret
= send(connector
, buf
, 1, 0);
9253 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
9258 dest
= INVALID_SOCKET
;
9260 SetLastError(0xdeadbeef);
9262 num_bytes
= 0xdeadbeef;
9263 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9265 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9266 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
9267 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9268 ok(key
== 125, "Key is %lu\n", key
);
9269 ok(num_bytes
== 1, "Number of bytes transferred is %u\n", num_bytes
);
9270 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9271 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9273 SetLastError(0xdeadbeef);
9275 num_bytes
= 0xdeadbeef;
9276 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9277 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9278 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9279 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9280 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9281 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9282 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9284 if (src
!= INVALID_SOCKET
)
9286 if (connector
!= INVALID_SOCKET
)
9287 closesocket(connector
);
9291 src
= setup_iocp_src(&bindAddress
);
9293 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
9294 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
9296 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9297 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
9299 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
9300 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9302 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
9303 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9305 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9306 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9308 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9309 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9311 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9312 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9316 SetLastError(0xdeadbeef);
9318 num_bytes
= 0xdeadbeef;
9319 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9321 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9322 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9323 ok(GetLastError() == ERROR_OPERATION_ABORTED
9324 || GetLastError() == ERROR_CONNECTION_ABORTED
, "got error %u\n", GetLastError());
9325 ok(key
== 125, "Key is %lu\n", key
);
9326 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9327 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9328 ok((NTSTATUS
)olp
->Internal
== STATUS_CANCELLED
9329 || (NTSTATUS
)olp
->Internal
== STATUS_CONNECTION_ABORTED
, "got status %#lx\n", olp
->Internal
);
9331 SetLastError(0xdeadbeef);
9333 num_bytes
= 0xdeadbeef;
9334 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9335 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9336 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9337 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9338 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9339 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9340 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9343 closesocket(connector
);
9344 CloseHandle(io_port
);
9347 static void test_connect_completion_port(void)
9349 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
9350 GUID connectex_guid
= WSAID_CONNECTEX
;
9351 SOCKET connector
, listener
, acceptor
;
9352 struct sockaddr_in addr
, destaddr
;
9353 LPFN_CONNECTEX pConnectEx
;
9359 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
9361 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9362 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9364 memset(&addr
, 0, sizeof(addr
));
9365 addr
.sin_family
= AF_INET
;
9366 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9367 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
9368 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9369 addrlen
= sizeof(destaddr
);
9370 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &addrlen
);
9371 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
9373 ret
= listen(listener
, 1);
9374 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
9376 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9377 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9379 ret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
9380 &pConnectEx
, sizeof(pConnectEx
), &size
, NULL
, NULL
);
9381 ok(!ret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
9383 /* connect() does not queue completion. */
9385 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9386 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9388 ret
= connect(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9389 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9390 acceptor
= accept(listener
, NULL
, NULL
);
9391 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9392 closesocket(acceptor
);
9394 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9395 ok(!ret
, "expected failure\n");
9396 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9398 closesocket(connector
);
9401 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9402 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9403 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9404 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9405 set_blocking(connector
, FALSE
);
9407 ret
= connect(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9408 ok(ret
== -1, "expected failure\n");
9409 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
9410 acceptor
= accept(listener
, NULL
, NULL
);
9411 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9412 closesocket(acceptor
);
9414 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9415 ok(!ret
, "expected failure\n");
9416 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9418 closesocket(connector
);
9421 /* ConnectEx() queues completion. */
9423 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9424 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9425 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9426 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9427 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
9428 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9430 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
9431 NULL
, 0, &size
, &overlapped
);
9432 ok(!ret
, "expected failure\n");
9433 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9434 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9435 ok(!ret
, "wait failed\n");
9436 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
9437 ok(ret
, "got error %u\n", GetLastError());
9438 ok(!size
, "got %u bytes\n", size
);
9439 acceptor
= accept(listener
, NULL
, NULL
);
9440 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9441 closesocket(acceptor
);
9445 overlapped_ptr
= NULL
;
9446 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9447 ok(ret
, "got error %u\n", GetLastError());
9448 ok(!key
, "got key %#Ix\n", key
);
9449 ok(!size
, "got %u bytes\n", size
);
9450 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9452 closesocket(connector
);
9455 /* Test ConnectEx() with a non-empty buffer. */
9457 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9458 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9459 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9460 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9461 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
9462 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9464 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
9465 (void *)"one", 3, &size
, &overlapped
);
9466 ok(!ret
, "expected failure\n");
9467 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9468 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9469 ok(!ret
, "wait failed\n");
9470 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
9471 ok(ret
, "got error %u\n", GetLastError());
9472 ok(size
== 3, "got %u bytes\n", size
);
9473 acceptor
= accept(listener
, NULL
, NULL
);
9474 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9475 closesocket(acceptor
);
9479 overlapped_ptr
= NULL
;
9480 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9481 ok(ret
, "got error %u\n", GetLastError());
9482 ok(!key
, "got key %#Ix\n", key
);
9483 ok(size
== 3, "got %u bytes\n", size
);
9484 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9486 closesocket(connector
);
9489 /* Suppress completion by setting the low bit. */
9491 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9492 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9493 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9494 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9495 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
9496 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9498 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
| 1);
9500 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
9501 NULL
, 0, &size
, &overlapped
);
9502 ok(!ret
, "expected failure\n");
9503 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9504 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9505 ok(!ret
, "wait failed\n");
9506 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
9507 ok(ret
, "got error %u\n", GetLastError());
9508 ok(!size
, "got %u bytes\n", size
);
9509 acceptor
= accept(listener
, NULL
, NULL
);
9510 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9511 closesocket(acceptor
);
9513 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9514 ok(!ret
, "expected failure\n");
9515 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9517 closesocket(connector
);
9520 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
& ~1);
9522 /* Skip completion on success. */
9524 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9525 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9526 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9527 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9528 ret
= SetFileCompletionNotificationModes((HANDLE
)connector
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
9529 ok(ret
, "got error %u\n", GetLastError());
9530 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
9531 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9533 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
9534 NULL
, 0, &size
, &overlapped
);
9535 ok(!ret
, "expected failure\n");
9536 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9537 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9538 ok(!ret
, "wait failed\n");
9539 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
9540 ok(ret
, "got error %u\n", GetLastError());
9541 ok(!size
, "got %u bytes\n", size
);
9542 acceptor
= accept(listener
, NULL
, NULL
);
9543 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9544 closesocket(acceptor
);
9548 overlapped_ptr
= NULL
;
9549 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9550 ok(ret
, "got error %u\n", GetLastError());
9551 ok(!key
, "got key %#Ix\n", key
);
9552 ok(!size
, "got %u bytes\n", size
);
9553 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9555 closesocket(connector
);
9558 closesocket(listener
);
9560 /* Connect to an invalid address. */
9562 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9563 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9564 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
9565 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9566 ret
= SetFileCompletionNotificationModes((HANDLE
)connector
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
9567 ok(ret
, "got error %u\n", GetLastError());
9568 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
9569 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9571 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
9572 NULL
, 0, &size
, &overlapped
);
9573 ok(!ret
, "expected failure\n");
9574 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9575 ret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
9576 ok(!ret
, "wait failed\n");
9577 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
9578 ok(!ret
, "expected failure\n");
9579 ok(GetLastError() == ERROR_CONNECTION_REFUSED
, "got error %u\n", GetLastError());
9580 ok(!size
, "got %u bytes\n", size
);
9584 overlapped_ptr
= NULL
;
9585 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9586 ok(!ret
, "expected failure\n");
9587 ok(GetLastError() == ERROR_CONNECTION_REFUSED
, "got error %u\n", GetLastError());
9588 ok(!key
, "got key %#Ix\n", key
);
9589 ok(!size
, "got %u bytes\n", size
);
9590 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9592 closesocket(connector
);
9596 static void test_shutdown_completion_port(void)
9598 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
9599 GUID disconnectex_guid
= WSAID_DISCONNECTEX
;
9600 struct sockaddr_in addr
, destaddr
;
9601 LPFN_DISCONNECTEX pDisconnectEx
;
9602 SOCKET listener
, server
, client
;
9608 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
9610 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9611 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9613 memset(&addr
, 0, sizeof(addr
));
9614 addr
.sin_family
= AF_INET
;
9615 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9616 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
9617 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9618 addrlen
= sizeof(destaddr
);
9619 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &addrlen
);
9620 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
9622 ret
= listen(listener
, 1);
9623 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
9625 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9626 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9628 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &disconnectex_guid
, sizeof(disconnectex_guid
),
9629 &pDisconnectEx
, sizeof(pDisconnectEx
), &size
, NULL
, NULL
);
9630 ok(!ret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
9632 /* shutdown() does not queue completion. */
9634 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
9635 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9636 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9637 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9638 server
= accept(listener
, NULL
, NULL
);
9639 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9641 ret
= shutdown(client
, SD_BOTH
);
9642 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
9644 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9645 ok(!ret
, "expected failure\n");
9646 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9648 closesocket(server
);
9649 closesocket(client
);
9652 /* WSASendDisconnect() and WSARecvDisconnect() do not queue completion. */
9654 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9655 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9656 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
9657 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9658 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9659 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9660 server
= accept(listener
, NULL
, NULL
);
9661 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9663 ret
= WSASendDisconnect(client
, NULL
);
9664 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
9666 ret
= WSARecvDisconnect(client
, NULL
);
9667 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
9669 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9670 ok(!ret
, "expected failure\n");
9671 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9673 closesocket(server
);
9674 closesocket(client
);
9677 /* DisconnectEx() queues completion. */
9679 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9680 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9681 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
9682 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9683 ret
= SetFileCompletionNotificationModes((HANDLE
)client
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
9684 ok(ret
, "got error %u\n", GetLastError());
9685 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9686 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9687 server
= accept(listener
, NULL
, NULL
);
9688 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9690 SetLastError(0xdeadbeef);
9691 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
9692 ok(!ret
, "expected failure\n");
9693 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9695 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9696 ok(!ret
, "wait failed\n");
9699 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, TRUE
);
9700 ok(ret
, "got error %u\n", GetLastError());
9701 ok(!size
, "got %u bytes\n", size
);
9705 overlapped_ptr
= NULL
;
9706 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9707 todo_wine
ok(ret
, "got error %u\n", GetLastError());
9708 todo_wine
ok(!key
, "got key %#Ix\n", key
);
9709 todo_wine
ok(!size
, "got %u bytes\n", size
);
9710 todo_wine
ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9712 closesocket(server
);
9713 closesocket(client
);
9716 /* Test passing a NULL overlapped structure to DisconnectEx(). */
9718 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9719 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9720 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
9721 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9722 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9723 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9724 server
= accept(listener
, NULL
, NULL
);
9725 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9727 SetLastError(0xdeadbeef);
9728 ret
= pDisconnectEx(client
, NULL
, 0, 0);
9729 ok(ret
, "expected success\n");
9730 ok(!GetLastError() || GetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", GetLastError());
9732 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9733 ok(!ret
, "expected failure\n");
9734 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9736 closesocket(server
);
9737 closesocket(client
);
9740 /* Suppress completion by setting the low bit. */
9742 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9743 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9744 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
9745 ok(!!port
, "failed to create port, error %u\n", GetLastError());
9746 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
9747 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9748 server
= accept(listener
, NULL
, NULL
);
9749 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9751 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
| 1);
9753 SetLastError(0xdeadbeef);
9754 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
9755 ok(!ret
, "expected failure\n");
9756 ok(GetLastError() == ERROR_IO_PENDING
, "got error %u\n", GetLastError());
9758 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9759 ok(!ret
, "wait failed\n");
9762 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, TRUE
);
9763 ok(ret
, "got error %u\n", GetLastError());
9764 ok(!size
, "got %u bytes\n", size
);
9766 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9767 ok(!ret
, "expected failure\n");
9768 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", GetLastError());
9770 closesocket(server
);
9771 closesocket(client
);
9774 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
& ~1);
9776 CloseHandle(overlapped
.hEvent
);
9779 static void test_address_list_query(void)
9782 SOCKET_ADDRESS_LIST
*address_list
= (SOCKET_ADDRESS_LIST
*)buffer
;
9783 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
9784 DWORD size
, expect_size
;
9791 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9792 ok(s
!= INVALID_SOCKET
, "Failed to create socket, error %d.\n", WSAGetLastError());
9793 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
9796 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, 0, &size
, NULL
, NULL
);
9797 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9798 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9799 ok(size
>= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), "Got unexpected size %u.\n", size
);
9803 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, NULL
, NULL
);
9804 ok(!ret
, "Got unexpected ret %d.\n", ret
);
9805 ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
9806 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9808 expect_size
= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[address_list
->iAddressCount
]);
9809 for (i
= 0; i
< address_list
->iAddressCount
; ++i
)
9811 expect_size
+= address_list
->Address
[i
].iSockaddrLength
;
9813 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9815 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, NULL
, NULL
);
9816 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9817 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9820 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, sizeof(buffer
), &size
, NULL
, NULL
);
9821 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9822 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9823 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9826 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 0, &size
, NULL
, NULL
);
9827 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9828 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9829 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9832 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 1, &size
, NULL
, NULL
);
9833 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9834 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
9835 ok(!size
, "Got size %u.\n", size
);
9838 memset(buffer
, 0xcc, sizeof(buffer
));
9839 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
,
9840 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &size
, NULL
, NULL
);
9841 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9842 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9843 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9844 ok(address_list
->iAddressCount
== 0xcccccccc, "Got %u addresses.\n", address_list
->iAddressCount
);
9846 WSASetLastError(0xdeadbeef);
9847 overlapped
.Internal
= 0xdeadbeef;
9848 overlapped
.InternalHigh
= 0xdeadbeef;
9850 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 0, &size
, &overlapped
, NULL
);
9851 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
9852 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9853 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9854 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
9855 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
9857 overlapped
.Internal
= 0xdeadbeef;
9858 overlapped
.InternalHigh
= 0xdeadbeef;
9860 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 1, &size
, &overlapped
, NULL
);
9861 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
9862 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
9863 ok(!size
, "Expected size %u, got %u.\n", expect_size
, size
);
9864 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
9865 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
9867 overlapped
.Internal
= 0xdeadbeef;
9868 overlapped
.InternalHigh
= 0xdeadbeef;
9870 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
,
9871 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &size
, &overlapped
, NULL
);
9872 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
9873 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9874 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9875 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
9876 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
9877 ok(address_list
->iAddressCount
== 0xcccccccc, "Got %u addresses.\n", address_list
->iAddressCount
);
9879 overlapped
.Internal
= 0xdeadbeef;
9880 overlapped
.InternalHigh
= 0xdeadbeef;
9882 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, NULL
);
9883 ok(!ret
, "Got unexpected ret %d.\n", ret
);
9884 ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
9885 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
9887 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9888 ok(ret
, "Got error %u.\n", GetLastError());
9889 ok(!size
, "Got size %u.\n", size
);
9890 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
9891 ok(!overlapped
.Internal
, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
9892 ok(!overlapped
.InternalHigh
, "Got size %Iu.\n", overlapped
.InternalHigh
);
9894 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9895 ok(!ret
, "Expected failure.\n");
9896 ok(GetLastError() == WAIT_TIMEOUT
, "Got error %u.\n", GetLastError());
9901 /* Test with an APC. */
9903 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9905 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, &overlapped
, socket_apc
);
9906 ok(ret
== -1, "expected failure\n");
9907 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9911 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, socket_apc
);
9912 ok(!ret
, "expected success\n");
9913 ok(size
== expect_size
, "got size %u\n", size
);
9915 ret
= SleepEx(0, TRUE
);
9916 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
9917 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
9918 ok(!apc_error
, "got APC error %u\n", apc_error
);
9919 ok(!apc_size
, "got APC size %u\n", apc_size
);
9920 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
9925 static void sync_read(SOCKET src
, SOCKET dst
)
9930 ret
= send(dst
, "Hello World!", 12, 0);
9931 ok(ret
== 12, "send returned %d\n", ret
);
9933 memset(data
, 0, sizeof(data
));
9934 ret
= recv(src
, data
, sizeof(data
), 0);
9935 ok(ret
== 12, "expected 12, got %d\n", ret
);
9936 ok(!memcmp(data
, "Hello World!", 12), "got %u bytes (%*s)\n", ret
, ret
, data
);
9939 static void iocp_async_read(SOCKET src
, SOCKET dst
)
9942 WSAOVERLAPPED ovl
, *ovl_iocp
;
9949 memset(data
, 0, sizeof(data
));
9950 memset(&ovl
, 0, sizeof(ovl
));
9952 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
9953 ok(port
!= 0, "CreateIoCompletionPort error %u\n", GetLastError());
9955 buf
.len
= sizeof(data
);
9959 SetLastError(0xdeadbeef);
9960 ret
= WSARecv(src
, &buf
, 1, &bytes
, &flags
, &ovl
, NULL
);
9961 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
9962 ok(GetLastError() == ERROR_IO_PENDING
, "got %u\n", GetLastError());
9963 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
9967 ovl_iocp
= (void *)0xdeadbeef;
9968 SetLastError(0xdeadbeef);
9969 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
9970 ok(!ret
, "got %d\n", ret
);
9971 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
9972 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
9973 ok(key
== 0xdeadbeef, "got key %#lx\n", key
);
9974 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
9976 ret
= send(dst
, "Hello World!", 12, 0);
9977 ok(ret
== 12, "send returned %d\n", ret
);
9982 SetLastError(0xdeadbeef);
9983 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
9984 ok(ret
, "got %d\n", ret
);
9985 ok(bytes
== 12, "got bytes %u\n", bytes
);
9986 ok(key
== 0x12345678, "got key %#lx\n", key
);
9987 ok(ovl_iocp
== &ovl
, "got ovl %p\n", ovl_iocp
);
9990 ok(ovl_iocp
->InternalHigh
== 12, "got %#lx\n", ovl_iocp
->InternalHigh
);
9991 ok(!ovl_iocp
->Internal
, "got %#lx\n", ovl_iocp
->Internal
);
9992 ok(!memcmp(data
, "Hello World!", 12), "got %u bytes (%*s)\n", bytes
, bytes
, data
);
9997 ovl_iocp
= (void *)0xdeadbeef;
9998 SetLastError(0xdeadbeef);
9999 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10000 ok(!ret
, "got %d\n", ret
);
10001 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10002 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10003 ok(key
== 0xdeadbeef, "got key %#lx\n", key
);
10004 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10009 static void iocp_async_read_closesocket(SOCKET src
, int how_to_close
)
10012 WSAOVERLAPPED ovl
, *ovl_iocp
;
10016 DWORD flags
, bytes
;
10021 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
10022 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
10023 ok(hwnd
!= 0, "CreateWindowEx failed\n");
10025 ret
= WSAAsyncSelect(src
, hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
10026 ok(!ret
, "got %d\n", ret
);
10029 memset(&msg
, 0, sizeof(msg
));
10030 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10031 ok(ret
, "got %d\n", ret
);
10032 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10033 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10034 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10035 ok(msg
.lParam
== 2, "got %08lx\n", msg
.lParam
);
10037 memset(data
, 0, sizeof(data
));
10038 memset(&ovl
, 0, sizeof(ovl
));
10040 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
10041 ok(port
!= 0, "CreateIoCompletionPort error %u\n", GetLastError());
10044 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10045 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10047 buf
.len
= sizeof(data
);
10049 bytes
= 0xdeadbeef;
10051 SetLastError(0xdeadbeef);
10052 ret
= WSARecv(src
, &buf
, 1, &bytes
, &flags
, &ovl
, NULL
);
10053 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
10054 ok(GetLastError() == ERROR_IO_PENDING
, "got %u\n", GetLastError());
10055 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10058 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10059 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10061 bytes
= 0xdeadbeef;
10063 ovl_iocp
= (void *)0xdeadbeef;
10064 SetLastError(0xdeadbeef);
10065 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10066 ok(!ret
, "got %d\n", ret
);
10067 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10068 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10069 ok(key
== 0xdeadbeef, "got key %#lx\n", key
);
10070 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10073 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10074 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10076 switch (how_to_close
)
10082 CloseHandle((HANDLE
)src
);
10085 pNtClose((HANDLE
)src
);
10088 ok(0, "wrong value %d\n", how_to_close
);
10093 memset(&msg
, 0, sizeof(msg
));
10094 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10095 switch (how_to_close
)
10098 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10104 ok(ret
, "got %d\n", ret
);
10105 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10106 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10107 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10108 ok(msg
.lParam
== 0x20, "got %08lx\n", msg
.lParam
);
10112 ok(0, "wrong value %d\n", how_to_close
);
10116 bytes
= 0xdeadbeef;
10119 SetLastError(0xdeadbeef);
10120 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10121 ok(!ret
, "got %d\n", ret
);
10123 ok(GetLastError() == ERROR_CONNECTION_ABORTED
|| GetLastError() == ERROR_NETNAME_DELETED
/* XP */, "got %u\n", GetLastError());
10124 ok(!bytes
, "got bytes %u\n", bytes
);
10125 ok(key
== 0x12345678, "got key %#lx\n", key
);
10126 ok(ovl_iocp
== &ovl
, "got ovl %p\n", ovl_iocp
);
10129 ok(!ovl_iocp
->InternalHigh
, "got %#lx\n", ovl_iocp
->InternalHigh
);
10131 ok(ovl_iocp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
|| ovl_iocp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
/* XP */, "got %#lx\n", ovl_iocp
->Internal
);
10134 bytes
= 0xdeadbeef;
10136 ovl_iocp
= (void *)0xdeadbeef;
10137 SetLastError(0xdeadbeef);
10138 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10139 ok(!ret
, "got %d\n", ret
);
10140 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10141 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10142 ok(key
== 0xdeadbeef, "got key %#lx\n", key
);
10143 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10147 DestroyWindow(hwnd
);
10150 static void iocp_async_closesocket(SOCKET src
)
10153 WSAOVERLAPPED
*ovl_iocp
;
10160 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
10161 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
10162 ok(hwnd
!= 0, "CreateWindowEx failed\n");
10164 ret
= WSAAsyncSelect(src
, hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
10165 ok(!ret
, "got %d\n", ret
);
10168 memset(&msg
, 0, sizeof(msg
));
10169 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10170 ok(ret
, "got %d\n", ret
);
10171 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10172 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10173 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10174 ok(msg
.lParam
== 2, "got %08lx\n", msg
.lParam
);
10176 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
10177 ok(port
!= 0, "CreateIoCompletionPort error %u\n", GetLastError());
10180 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10181 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10183 bytes
= 0xdeadbeef;
10185 ovl_iocp
= (void *)0xdeadbeef;
10186 SetLastError(0xdeadbeef);
10187 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10188 ok(!ret
, "got %d\n", ret
);
10189 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10190 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10191 ok(key
== 0xdeadbeef, "got key %lu\n", key
);
10192 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10195 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10196 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10201 memset(&msg
, 0, sizeof(msg
));
10202 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10203 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10205 bytes
= 0xdeadbeef;
10207 ovl_iocp
= (void *)0xdeadbeef;
10208 SetLastError(0xdeadbeef);
10209 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10210 ok(!ret
, "got %d\n", ret
);
10211 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10212 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10213 ok(key
== 0xdeadbeef, "got key %lu\n", key
);
10214 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10218 DestroyWindow(hwnd
);
10221 struct wsa_async_select_info
10227 static DWORD WINAPI
wsa_async_select_thread(void *param
)
10229 struct wsa_async_select_info
*info
= param
;
10232 ret
= WSAAsyncSelect(info
->sock
, info
->hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
10233 ok(!ret
, "got %d\n", ret
);
10238 struct wsa_recv_info
10245 static DWORD WINAPI
wsa_recv_thread(void *param
)
10247 struct wsa_recv_info
*info
= param
;
10249 DWORD flags
, bytes
;
10251 bytes
= 0xdeadbeef;
10253 SetLastError(0xdeadbeef);
10254 ret
= WSARecv(info
->sock
, &info
->wsa_buf
, 1, &bytes
, &flags
, &info
->ovl
, NULL
);
10255 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
10256 ok(GetLastError() == ERROR_IO_PENDING
, "got %u\n", GetLastError());
10257 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10262 static void iocp_async_read_thread_closesocket(SOCKET src
)
10264 struct wsa_async_select_info select_info
;
10265 struct wsa_recv_info recv_info
;
10266 HANDLE port
, thread
;
10267 WSAOVERLAPPED
*ovl_iocp
;
10275 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
10276 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
10277 ok(hwnd
!= 0, "CreateWindowEx failed\n");
10279 select_info
.sock
= src
;
10280 select_info
.hwnd
= hwnd
;
10281 thread
= CreateThread(NULL
, 0, wsa_async_select_thread
, &select_info
, 0, &tid
);
10282 ok(thread
!= 0, "CreateThread error %u\n", GetLastError());
10283 ret
= WaitForSingleObject(thread
, 10000);
10284 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
10287 memset(&msg
, 0, sizeof(msg
));
10288 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10289 ok(ret
, "got %d\n", ret
);
10290 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10291 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10292 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10293 ok(msg
.lParam
== 2, "got %08lx\n", msg
.lParam
);
10295 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
10296 ok(port
!= 0, "CreateIoCompletionPort error %u\n", GetLastError());
10299 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10300 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10302 memset(data
, 0, sizeof(data
));
10303 memset(&recv_info
.ovl
, 0, sizeof(recv_info
.ovl
));
10304 recv_info
.sock
= src
;
10305 recv_info
.wsa_buf
.len
= sizeof(data
);
10306 recv_info
.wsa_buf
.buf
= data
;
10307 thread
= CreateThread(NULL
, 0, wsa_recv_thread
, &recv_info
, 0, &tid
);
10308 ok(thread
!= 0, "CreateThread error %u\n", GetLastError());
10309 ret
= WaitForSingleObject(thread
, 10000);
10310 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
10313 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10314 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10316 bytes
= 0xdeadbeef;
10318 ovl_iocp
= (void *)0xdeadbeef;
10319 SetLastError(0xdeadbeef);
10320 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10321 ok(!ret
, "got %d\n", ret
);
10322 ok(GetLastError() == WAIT_TIMEOUT
|| broken(GetLastError() == ERROR_OPERATION_ABORTED
) /* XP */,
10323 "got %u\n", GetLastError());
10324 if (GetLastError() == WAIT_TIMEOUT
)
10326 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10327 ok(key
== 0xdeadbeef, "got key %lx\n", key
);
10328 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10330 else /* document XP behaviour */
10332 ok(!bytes
, "got bytes %u\n", bytes
);
10333 ok(key
== 0x12345678, "got key %#lx\n", key
);
10334 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
10337 ok(!ovl_iocp
->InternalHigh
, "got %#lx\n", ovl_iocp
->InternalHigh
);
10338 ok(ovl_iocp
->Internal
== STATUS_CANCELLED
, "got %#lx\n", ovl_iocp
->Internal
);
10346 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10347 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10352 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10353 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10355 bytes
= 0xdeadbeef;
10358 SetLastError(0xdeadbeef);
10359 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10360 ok(!ret
, "got %d\n", ret
);
10362 ok(GetLastError() == ERROR_CONNECTION_ABORTED
|| GetLastError() == ERROR_NETNAME_DELETED
/* XP */, "got %u\n", GetLastError());
10363 ok(!bytes
, "got bytes %u\n", bytes
);
10364 ok(key
== 0x12345678, "got key %#lx\n", key
);
10365 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
10368 ok(!ovl_iocp
->InternalHigh
, "got %#lx\n", ovl_iocp
->InternalHigh
);
10370 ok(ovl_iocp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
|| ovl_iocp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
/* XP */, "got %#lx\n", ovl_iocp
->Internal
);
10374 bytes
= 0xdeadbeef;
10376 ovl_iocp
= (void *)0xdeadbeef;
10377 SetLastError(0xdeadbeef);
10378 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10379 ok(!ret
, "got %d\n", ret
);
10380 ok(GetLastError() == WAIT_TIMEOUT
, "got %u\n", GetLastError());
10381 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10382 ok(key
== 0xdeadbeef, "got key %lu\n", key
);
10383 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10387 DestroyWindow(hwnd
);
10390 static void iocp_async_read_thread(SOCKET src
, SOCKET dst
)
10392 struct wsa_async_select_info select_info
;
10393 struct wsa_recv_info recv_info
;
10394 HANDLE port
, thread
;
10395 WSAOVERLAPPED
*ovl_iocp
;
10403 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
10404 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
10405 ok(hwnd
!= 0, "CreateWindowEx failed\n");
10407 select_info
.sock
= src
;
10408 select_info
.hwnd
= hwnd
;
10409 thread
= CreateThread(NULL
, 0, wsa_async_select_thread
, &select_info
, 0, &tid
);
10410 ok(thread
!= 0, "CreateThread error %u\n", GetLastError());
10411 ret
= WaitForSingleObject(thread
, 10000);
10412 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
10415 memset(&msg
, 0, sizeof(msg
));
10416 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10417 ok(ret
, "got %d\n", ret
);
10418 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10419 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10420 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10421 ok(msg
.lParam
== 2, "got %08lx\n", msg
.lParam
);
10423 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
10424 ok(port
!= 0, "CreateIoCompletionPort error %u\n", GetLastError());
10427 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10428 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10430 memset(data
, 0, sizeof(data
));
10431 memset(&recv_info
.ovl
, 0, sizeof(recv_info
.ovl
));
10432 recv_info
.sock
= src
;
10433 recv_info
.wsa_buf
.len
= sizeof(data
);
10434 recv_info
.wsa_buf
.buf
= data
;
10435 thread
= CreateThread(NULL
, 0, wsa_recv_thread
, &recv_info
, 0, &tid
);
10436 ok(thread
!= 0, "CreateThread error %u\n", GetLastError());
10437 ret
= WaitForSingleObject(thread
, 10000);
10438 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
10441 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10442 ok(!ret
, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10444 bytes
= 0xdeadbeef;
10446 ovl_iocp
= (void *)0xdeadbeef;
10447 SetLastError(0xdeadbeef);
10448 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10449 ok(!ret
, "got %d\n", ret
);
10450 ok(GetLastError() == WAIT_TIMEOUT
|| broken(GetLastError() == ERROR_OPERATION_ABORTED
) /* XP */, "got %u\n", GetLastError());
10451 if (GetLastError() == WAIT_TIMEOUT
)
10453 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10454 ok(key
== 0xdeadbeef, "got key %lu\n", key
);
10455 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10457 else /* document XP behaviour */
10459 ok(bytes
== 0, "got bytes %u\n", bytes
);
10460 ok(key
== 0x12345678, "got key %#lx\n", key
);
10461 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
10464 ok(!ovl_iocp
->InternalHigh
, "got %#lx\n", ovl_iocp
->InternalHigh
);
10465 ok(ovl_iocp
->Internal
== STATUS_CANCELLED
, "got %#lx\n", ovl_iocp
->Internal
);
10470 memset(&msg
, 0, sizeof(msg
));
10471 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10472 ok(!ret
|| broken(msg
.hwnd
== hwnd
) /* XP */, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10473 if (ret
) /* document XP behaviour */
10475 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10476 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10477 ok(msg
.lParam
== 1, "got %08lx\n", msg
.lParam
);
10480 ret
= send(dst
, "Hello World!", 12, 0);
10481 ok(ret
== 12, "send returned %d\n", ret
);
10484 memset(&msg
, 0, sizeof(msg
));
10485 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
10486 ok(!ret
|| broken(msg
.hwnd
== hwnd
) /* XP */, "got %04x,%08lx,%08lx\n", msg
.message
, msg
.wParam
, msg
.lParam
);
10487 if (ret
) /* document XP behaviour */
10489 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
10490 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
10491 ok(msg
.wParam
== src
, "got %08lx\n", msg
.wParam
);
10492 ok(msg
.lParam
== 1, "got %08lx\n", msg
.lParam
);
10495 bytes
= 0xdeadbeef;
10497 ovl_iocp
= (void *)0xdeadbeef;
10498 SetLastError(0xdeadbeef);
10499 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
10500 ok(ret
|| broken(GetLastError() == WAIT_TIMEOUT
) /* XP */, "got %u\n", GetLastError());
10503 ok(bytes
== 12, "got bytes %u\n", bytes
);
10504 ok(key
== 0x12345678, "got key %#lx\n", key
);
10505 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
10508 ok(ovl_iocp
->InternalHigh
== 12, "got %#lx\n", ovl_iocp
->InternalHigh
);
10509 ok(!ovl_iocp
->Internal
, "got %#lx\n", ovl_iocp
->Internal
);
10510 ok(!memcmp(data
, "Hello World!", 12), "got %u bytes (%*s)\n", bytes
, bytes
, data
);
10513 else /* document XP behaviour */
10515 ok(bytes
== 0xdeadbeef, "got bytes %u\n", bytes
);
10516 ok(key
== 0xdeadbeef, "got key %lu\n", key
);
10517 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
10522 DestroyWindow(hwnd
);
10525 static void test_iocp(void)
10530 tcp_socketpair(&src
, &dst
);
10531 sync_read(src
, dst
);
10532 iocp_async_read(src
, dst
);
10536 tcp_socketpair(&src
, &dst
);
10537 iocp_async_read_thread(src
, dst
);
10541 for (i
= 0; i
<= 2; i
++)
10543 tcp_socketpair(&src
, &dst
);
10544 iocp_async_read_closesocket(src
, i
);
10548 tcp_socketpair(&src
, &dst
);
10549 iocp_async_closesocket(src
);
10552 tcp_socketpair(&src
, &dst
);
10553 iocp_async_read_thread_closesocket(src
);
10557 static void test_get_interface_list(void)
10559 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
10560 DWORD size
, expect_size
;
10561 unsigned int i
, count
;
10562 INTERFACE_INFO
*info
;
10563 BOOL loopback_found
;
10570 s
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10571 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10572 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
10575 WSASetLastError(0xdeadbeef);
10576 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), &size
, NULL
, NULL
);
10577 ok(!ret
, "Got unexpected ret %d.\n", ret
);
10578 ok(!WSAGetLastError(), "Got error %u.\n", WSAGetLastError());
10579 ok(size
&& size
!= 0xdeadbeef && !(size
% sizeof(INTERFACE_INFO
)), "Got unexpected size %u.\n", size
);
10580 expect_size
= size
;
10583 overlapped
.Internal
= 0xdeadbeef;
10584 overlapped
.InternalHigh
= 0xdeadbeef;
10585 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, NULL
);
10586 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
10587 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
10588 ok(size
== 0xdeadbeef, "Got size %u.\n", size
);
10590 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 100);
10591 ok(ret
, "Got error %u.\n", GetLastError());
10592 ok(size
== expect_size
, "Expected size %u, got %u.\n", expect_size
, size
);
10593 ok(key
== 123, "Got key %Iu.\n", key
);
10594 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
10595 ok(!overlapped
.Internal
, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
10596 ok(overlapped
.InternalHigh
== expect_size
, "Expected size %u, got %Iu.\n", expect_size
, overlapped
.InternalHigh
);
10598 info
= (INTERFACE_INFO
*)buffer
;
10599 count
= size
/ sizeof(INTERFACE_INFO
);
10600 loopback_found
= FALSE
;
10601 for (i
= 0; i
< count
; ++i
)
10603 if (info
[i
].iiFlags
& IFF_LOOPBACK
)
10604 loopback_found
= TRUE
;
10606 ok(info
[i
].iiAddress
.AddressIn
.sin_family
== AF_INET
, "Got unexpected sin_family %#x.\n",
10607 info
[i
].iiAddress
.AddressIn
.sin_family
);
10608 ok(info
[i
].iiNetmask
.AddressIn
.sin_family
== AF_INET
, "Got unexpected sin_family %#x.\n",
10609 info
[i
].iiNetmask
.AddressIn
.sin_family
);
10610 ok(info
[i
].iiBroadcastAddress
.AddressIn
.sin_family
10611 == (info
[i
].iiFlags
& IFF_BROADCAST
) ? AF_INET
: 0, "Got unexpected sin_family %#x.\n",
10612 info
[i
].iiBroadcastAddress
.AddressIn
.sin_family
);
10613 ok(info
[i
].iiAddress
.AddressIn
.sin_addr
.S_un
.S_addr
, "Got zero iiAddress.\n");
10614 ok(info
[i
].iiNetmask
.AddressIn
.sin_addr
.S_un
.S_addr
, "Got zero iiNetmask.\n");
10615 ok((info
[i
].iiFlags
& IFF_BROADCAST
) ? info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
.S_un
.S_addr
10616 : !info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
.S_un
.S_addr
,
10617 "Got unexpected iiBroadcastAddress %s.\n", inet_ntoa(info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
));
10620 ok(loopback_found
, "Loopback interface not found.\n");
10623 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(INTERFACE_INFO
) - 1, &size
, NULL
, NULL
);
10624 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
10625 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
10626 ok(!size
, "Got unexpected size %u.\n", size
);
10629 overlapped
.Internal
= 0xdeadbeef;
10630 overlapped
.InternalHigh
= 0xdeadbeef;
10631 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(INTERFACE_INFO
) - 1, &size
, &overlapped
, NULL
);
10632 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
10633 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
10634 ok(size
== 0xdeadbeef, "Got size %u.\n", size
);
10636 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 100);
10637 ok(!ret
, "Expected failure.\n");
10638 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "Got error %u.\n", GetLastError());
10639 ok(!size
, "Got size %u.\n", size
);
10640 ok(key
== 123, "Got key %Iu.\n", key
);
10641 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
10642 ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "Got status %#x.\n", (NTSTATUS
)overlapped
.Internal
);
10643 ok(!overlapped
.InternalHigh
, "Got size %Iu.\n", overlapped
.InternalHigh
);
10645 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, NULL
, NULL
);
10646 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
10647 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
10652 /* Test with an APC. */
10654 s
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10655 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10659 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
,
10660 sizeof(INTERFACE_INFO
) - 1, &size
, &overlapped
, socket_apc
);
10661 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
10662 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
10663 ok(size
== 0xdeadbeef, "Got size %u.\n", size
);
10665 ret
= SleepEx(100, TRUE
);
10666 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
10667 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
10668 ok(apc_error
== WSAEFAULT
, "got APC error %u\n", apc_error
);
10669 ok(!apc_size
, "got APC size %u\n", apc_size
);
10670 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
10675 static void test_bind(void)
10677 const struct sockaddr_in invalid_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= inet_addr("192.0.2.0")};
10678 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
10679 IP_ADAPTER_ADDRESSES
*adapters
= NULL
, *adapter
;
10680 ULONG ip_addrs_size
= 0;
10681 struct sockaddr addr
;
10685 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10687 WSASetLastError(0xdeadbeef);
10688 ret
= bind(s
, NULL
, 0);
10689 ok(ret
== -1, "expected failure\n");
10690 todo_wine
ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
10692 addr
.sa_family
= 0xdead;
10693 WSASetLastError(0xdeadbeef);
10694 ret
= bind(s
, &addr
, sizeof(addr
));
10695 ok(ret
== -1, "expected failure\n");
10696 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
10698 WSASetLastError(0xdeadbeef);
10699 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
) - 1);
10700 ok(ret
== -1, "expected failure\n");
10701 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
10703 WSASetLastError(0xdeadbeef);
10704 ret
= bind(s
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
10705 ok(ret
== -1, "expected failure\n");
10706 ok(WSAGetLastError() == WSAEADDRNOTAVAIL
, "got error %u\n", WSAGetLastError());
10708 WSASetLastError(0xdeadbeef);
10709 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
10710 ok(!ret
, "expected success\n");
10711 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* win <7 */, "got error %u\n", WSAGetLastError());
10713 WSASetLastError(0xdeadbeef);
10714 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
10715 ok(ret
== -1, "expected failure\n");
10716 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
10718 len
= sizeof(addr
);
10719 ret
= getsockname(s
, &addr
, &len
);
10720 ok(!ret
, "got error %u\n", WSAGetLastError());
10722 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10724 WSASetLastError(0xdeadbeef);
10725 ret
= bind(s2
, &addr
, sizeof(addr
));
10726 ok(ret
== -1, "expected failure\n");
10727 ok(WSAGetLastError() == WSAEADDRINUSE
, "got error %u\n", WSAGetLastError());
10732 s
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
10734 WSASetLastError(0xdeadbeef);
10735 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
10736 ok(!ret
, "expected success\n");
10737 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* win <7 */, "got error %u\n", WSAGetLastError());
10741 ret
= GetAdaptersAddresses(AF_UNSPEC
, 0, NULL
, adapters
, &ip_addrs_size
);
10742 ok(ret
== ERROR_BUFFER_OVERFLOW
, "got error %u\n", ret
);
10743 adapters
= malloc(ip_addrs_size
);
10744 ret
= GetAdaptersAddresses(AF_UNSPEC
, 0, NULL
, adapters
, &ip_addrs_size
);
10745 ok(!ret
, "got error %u\n", ret
);
10747 for (adapter
= adapters
; adapter
!= NULL
; adapter
= adapter
->Next
)
10749 const IP_ADAPTER_UNICAST_ADDRESS
*unicast_addr
;
10751 for (unicast_addr
= adapter
->FirstUnicastAddress
; unicast_addr
!= NULL
; unicast_addr
= unicast_addr
->Next
)
10753 short family
= unicast_addr
->Address
.lpSockaddr
->sa_family
;
10755 s
= socket(family
, SOCK_STREAM
, IPPROTO_TCP
);
10756 ok(s
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
10758 ret
= bind(s
, unicast_addr
->Address
.lpSockaddr
, unicast_addr
->Address
.iSockaddrLength
);
10759 ok(!ret
, "got error %u\n", WSAGetLastError());
10763 if (family
== AF_INET6
)
10765 struct sockaddr_in6 addr6
, ret_addr6
;
10767 memcpy(&addr6
, unicast_addr
->Address
.lpSockaddr
, sizeof(addr6
));
10769 ok(unicast_addr
->Address
.iSockaddrLength
== sizeof(struct sockaddr_in6
),
10770 "got unexpected length %u\n", unicast_addr
->Address
.iSockaddrLength
);
10772 s
= socket(family
, SOCK_STREAM
, IPPROTO_TCP
);
10773 ok(s
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
10775 ret
= bind(s
, unicast_addr
->Address
.lpSockaddr
, sizeof(struct sockaddr_in6_old
));
10776 ok(ret
== -1, "expected failure\n");
10777 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
10779 addr6
.sin6_scope_id
= 0xabacab;
10780 ret
= bind(s
, (struct sockaddr
*)&addr6
, sizeof(addr6
));
10781 todo_wine_if (!((const struct sockaddr_in6
*)unicast_addr
->Address
.lpSockaddr
)->sin6_scope_id
)
10783 ok(ret
== -1, "expected failure\n");
10784 ok(WSAGetLastError() == WSAEADDRNOTAVAIL
, "got error %u\n", WSAGetLastError());
10787 addr6
.sin6_scope_id
= 0;
10788 ret
= bind(s
, (struct sockaddr
*)&addr6
, sizeof(addr6
));
10789 todo_wine_if (!((const struct sockaddr_in6
*)unicast_addr
->Address
.lpSockaddr
)->sin6_scope_id
)
10790 ok(!ret
, "got error %u\n", WSAGetLastError());
10792 memcpy(&addr6
, unicast_addr
->Address
.lpSockaddr
, sizeof(addr6
));
10794 len
= sizeof(struct sockaddr_in6_old
);
10795 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr6
, &len
);
10796 ok(ret
== -1, "expected failure\n");
10797 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
10799 len
= sizeof(ret_addr6
);
10800 memset(&ret_addr6
, 0, sizeof(ret_addr6
));
10801 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr6
, &len
);
10802 ok(!ret
, "got error %u\n", WSAGetLastError());
10803 ok(ret_addr6
.sin6_family
== AF_INET6
, "got family %u\n", ret_addr6
.sin6_family
);
10804 ok(ret_addr6
.sin6_port
!= 0, "expected nonzero port\n");
10805 ok(!memcmp(&ret_addr6
.sin6_addr
, &addr6
.sin6_addr
, sizeof(addr6
.sin6_addr
)), "address didn't match\n");
10806 ok(ret_addr6
.sin6_scope_id
== addr6
.sin6_scope_id
, "got scope %u\n", ret_addr6
.sin6_scope_id
);
10816 /* Test calling methods on a socket which is currently connecting. */
10817 static void test_connecting_socket(void)
10819 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_ANY
)};
10820 const struct sockaddr_in invalid_addr
=
10822 .sin_family
= AF_INET
,
10823 .sin_addr
.s_addr
= inet_addr("192.0.2.0"),
10826 OVERLAPPED overlapped
= {0}, overlapped2
= {0};
10827 GUID connectex_guid
= WSAID_CONNECTEX
;
10828 LPFN_CONNECTEX pConnectEx
;
10829 struct sockaddr_in addr
;
10835 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10836 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
10837 set_blocking(client
, FALSE
);
10839 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
10840 ok(!ret
, "expected success\n");
10841 ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
10843 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
10844 ok(ret
== -1, "got %d\n", ret
);
10845 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got %u\n", WSAGetLastError());
10847 /* Mortal Kombat 11 connects to the same address twice and expects the
10848 * second to return WSAEALREADY. */
10849 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
10850 ok(ret
== -1, "got %d\n", ret
);
10851 ok(WSAGetLastError() == WSAEALREADY
, "got %u\n", WSAGetLastError());
10853 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
10854 &pConnectEx
, sizeof(pConnectEx
), &size
, NULL
, NULL
);
10855 ok(!ret
, "failed to get ConnectEx, error %u\n", WSAGetLastError());
10856 overlapped
.Internal
= 0xdeadbeef;
10857 overlapped
.InternalHigh
= 0xdeadbeef;
10858 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped
);
10859 ok(!ret
, "got %d\n", ret
);
10860 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
10861 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
10862 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
10864 len
= sizeof(addr
);
10865 ret
= getsockname(client
, (struct sockaddr
*)&addr
, &len
);
10866 ok(!ret
, "got error %u\n", WSAGetLastError());
10867 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
10868 ok(addr
.sin_port
, "expected nonzero port\n");
10870 len
= sizeof(addr
);
10871 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &len
);
10872 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
10875 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
10876 ok(addr
.sin_addr
.s_addr
== inet_addr("192.0.2.0"), "got address %#08x\n", addr
.sin_addr
.s_addr
);
10877 ok(addr
.sin_port
== 255, "expected nonzero port\n");
10880 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
10881 ok(ret
== -1, "got %d\n", ret
);
10882 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
10884 ret
= send(client
, "data", 5, 0);
10885 ok(ret
== -1, "got %d\n", ret
);
10886 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
10888 closesocket(client
);
10890 /* Test with ConnectEx(). */
10892 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10893 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
10894 set_blocking(client
, FALSE
);
10896 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
10897 ok(!ret
, "expected success\n");
10898 ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
10900 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped2
);
10901 ok(!ret
, "got %d\n", ret
);
10902 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
10904 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
10905 ok(ret
== -1, "got %d\n", ret
);
10906 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
10908 overlapped
.Internal
= 0xdeadbeef;
10909 overlapped
.InternalHigh
= 0xdeadbeef;
10910 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped
);
10911 ok(!ret
, "got %d\n", ret
);
10912 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
10913 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
10914 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
10916 len
= sizeof(addr
);
10917 ret
= getsockname(client
, (struct sockaddr
*)&addr
, &len
);
10918 ok(!ret
, "got error %u\n", WSAGetLastError());
10919 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
10920 ok(addr
.sin_port
, "expected nonzero port\n");
10922 len
= sizeof(addr
);
10923 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &len
);
10924 ok(ret
== -1, "got %d\n", ret
);
10925 ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
10927 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
10928 ok(ret
== -1, "got %d\n", ret
);
10929 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
10931 ret
= send(client
, "data", 5, 0);
10932 ok(ret
== -1, "got %d\n", ret
);
10933 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
10935 closesocket(client
);
10938 static DWORD
map_status( NTSTATUS status
)
10940 static const struct
10947 {STATUS_PENDING
, ERROR_IO_INCOMPLETE
},
10949 {STATUS_BUFFER_OVERFLOW
, WSAEMSGSIZE
},
10951 {STATUS_NOT_IMPLEMENTED
, WSAEOPNOTSUPP
},
10952 {STATUS_ACCESS_VIOLATION
, WSAEFAULT
},
10953 {STATUS_PAGEFILE_QUOTA
, WSAENOBUFS
},
10954 {STATUS_INVALID_HANDLE
, WSAENOTSOCK
},
10955 {STATUS_NO_SUCH_DEVICE
, WSAENETDOWN
},
10956 {STATUS_NO_SUCH_FILE
, WSAENETDOWN
},
10957 {STATUS_NO_MEMORY
, WSAENOBUFS
},
10958 {STATUS_CONFLICTING_ADDRESSES
, WSAENOBUFS
},
10959 {STATUS_ACCESS_DENIED
, WSAEACCES
},
10960 {STATUS_BUFFER_TOO_SMALL
, WSAEFAULT
},
10961 {STATUS_OBJECT_TYPE_MISMATCH
, WSAENOTSOCK
},
10962 {STATUS_OBJECT_NAME_NOT_FOUND
, WSAENETDOWN
},
10963 {STATUS_OBJECT_PATH_NOT_FOUND
, WSAENETDOWN
},
10964 {STATUS_SHARING_VIOLATION
, WSAEADDRINUSE
},
10965 {STATUS_QUOTA_EXCEEDED
, WSAENOBUFS
},
10966 {STATUS_TOO_MANY_PAGING_FILES
, WSAENOBUFS
},
10967 {STATUS_INSUFFICIENT_RESOURCES
, WSAENOBUFS
},
10968 {STATUS_WORKING_SET_QUOTA
, WSAENOBUFS
},
10969 {STATUS_DEVICE_NOT_READY
, WSAEWOULDBLOCK
},
10970 {STATUS_PIPE_DISCONNECTED
, WSAESHUTDOWN
},
10971 {STATUS_IO_TIMEOUT
, WSAETIMEDOUT
},
10972 {STATUS_NOT_SUPPORTED
, WSAEOPNOTSUPP
},
10973 {STATUS_REMOTE_NOT_LISTENING
, WSAECONNREFUSED
},
10974 {STATUS_BAD_NETWORK_PATH
, WSAENETUNREACH
},
10975 {STATUS_NETWORK_BUSY
, WSAENETDOWN
},
10976 {STATUS_INVALID_NETWORK_RESPONSE
, WSAENETDOWN
},
10977 {STATUS_UNEXPECTED_NETWORK_ERROR
, WSAENETDOWN
},
10978 {STATUS_REQUEST_NOT_ACCEPTED
, WSAEWOULDBLOCK
},
10979 {STATUS_CANCELLED
, ERROR_OPERATION_ABORTED
},
10980 {STATUS_COMMITMENT_LIMIT
, WSAENOBUFS
},
10981 {STATUS_LOCAL_DISCONNECT
, WSAECONNABORTED
},
10982 {STATUS_REMOTE_DISCONNECT
, WSAECONNRESET
},
10983 {STATUS_REMOTE_RESOURCES
, WSAENOBUFS
},
10984 {STATUS_LINK_FAILED
, WSAECONNRESET
},
10985 {STATUS_LINK_TIMEOUT
, WSAETIMEDOUT
},
10986 {STATUS_INVALID_CONNECTION
, WSAENOTCONN
},
10987 {STATUS_INVALID_ADDRESS
, WSAEADDRNOTAVAIL
},
10988 {STATUS_INVALID_BUFFER_SIZE
, WSAEMSGSIZE
},
10989 {STATUS_INVALID_ADDRESS_COMPONENT
, WSAEADDRNOTAVAIL
},
10990 {STATUS_TOO_MANY_ADDRESSES
, WSAENOBUFS
},
10991 {STATUS_ADDRESS_ALREADY_EXISTS
, WSAEADDRINUSE
},
10992 {STATUS_CONNECTION_DISCONNECTED
, WSAECONNRESET
},
10993 {STATUS_CONNECTION_RESET
, WSAECONNRESET
},
10994 {STATUS_TRANSACTION_ABORTED
, WSAECONNABORTED
},
10995 {STATUS_CONNECTION_REFUSED
, WSAECONNREFUSED
},
10996 {STATUS_GRACEFUL_DISCONNECT
, WSAEDISCON
},
10997 {STATUS_CONNECTION_ACTIVE
, WSAEISCONN
},
10998 {STATUS_NETWORK_UNREACHABLE
, WSAENETUNREACH
},
10999 {STATUS_HOST_UNREACHABLE
, WSAEHOSTUNREACH
},
11000 {STATUS_PROTOCOL_UNREACHABLE
, WSAENETUNREACH
},
11001 {STATUS_PORT_UNREACHABLE
, WSAECONNRESET
},
11002 {STATUS_REQUEST_ABORTED
, WSAEINTR
},
11003 {STATUS_CONNECTION_ABORTED
, WSAECONNABORTED
},
11004 {STATUS_DATATYPE_MISALIGNMENT_ERROR
,WSAEFAULT
},
11005 {STATUS_HOST_DOWN
, WSAEHOSTDOWN
},
11006 {0x80070000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
11007 {0xc0010000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
11008 {0xc0070000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
11013 for (i
= 0; i
< ARRAY_SIZE(errors
); ++i
)
11015 if (errors
[i
].status
== status
)
11016 return errors
[i
].error
;
11019 return NT_SUCCESS(status
) ? RtlNtStatusToDosErrorNoTeb(status
) : WSAEINVAL
;
11022 static void test_WSAGetOverlappedResult(void)
11024 OVERLAPPED overlapped
= {0};
11031 static const NTSTATUS ranges
[][2] =
11034 {0x40000000, 0x40001000},
11035 {0x80000000, 0x80001000},
11036 {0x80070000, 0x80080000},
11037 {0xc0000000, 0xc0001000},
11038 {0xc0070000, 0xc0080000},
11039 {0xd0000000, 0xd0001000},
11040 {0xd0070000, 0xd0080000},
11043 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11045 for (i
= 0; i
< ARRAY_SIZE(ranges
); ++i
)
11047 for (status
= ranges
[i
][0]; status
< ranges
[i
][1]; ++status
)
11049 BOOL expect_ret
= NT_SUCCESS(status
) && status
!= STATUS_PENDING
;
11050 DWORD expect
= map_status(status
);
11052 overlapped
.Internal
= status
;
11053 WSASetLastError(0xdeadbeef);
11054 ret
= WSAGetOverlappedResult(s
, &overlapped
, &size
, FALSE
, &flags
);
11055 ok(ret
== expect_ret
, "status %#x: expected %d, got %d\n", status
, expect_ret
, ret
);
11058 ok(WSAGetLastError() == expect
/* >= win10 1809 */
11059 || !WSAGetLastError() /* < win10 1809 */
11060 || WSAGetLastError() == 0xdeadbeef, /* < win7 */
11061 "status %#x: expected error %u, got %u\n", status
, expect
, WSAGetLastError());
11065 ok(WSAGetLastError() == expect
11066 || (status
== (0xc0070000 | ERROR_IO_INCOMPLETE
) && WSAGetLastError() == WSAEINVAL
), /* < win8 */
11067 "status %#x: expected error %u, got %u\n", status
, expect
, WSAGetLastError());
11075 struct nonblocking_async_recv_params
11081 static DWORD CALLBACK
nonblocking_async_recv_thread(void *arg
)
11083 const struct nonblocking_async_recv_params
*params
= arg
;
11084 OVERLAPPED overlapped
= {0};
11085 DWORD flags
= 0, size
;
11090 overlapped
.hEvent
= params
->event
;
11091 wsabuf
.buf
= buffer
;
11092 wsabuf
.len
= sizeof(buffer
);
11093 memset(buffer
, 0, sizeof(buffer
));
11094 ret
= WSARecv(params
->client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11095 ok(!ret
, "got %d\n", ret
);
11096 ret
= GetOverlappedResult((HANDLE
)params
->client
, &overlapped
, &size
, FALSE
);
11097 ok(ret
, "got error %u\n", GetLastError());
11098 ok(size
== 4, "got size %u\n", size
);
11099 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
11104 static void test_nonblocking_async_recv(void)
11106 struct nonblocking_async_recv_params params
;
11107 OVERLAPPED overlapped
= {0};
11108 SOCKET client
, server
;
11109 DWORD flags
= 0, size
;
11110 HANDLE thread
, event
;
11115 event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
11116 wsabuf
.buf
= buffer
;
11117 wsabuf
.len
= sizeof(buffer
);
11119 tcp_socketpair(&client
, &server
);
11120 set_blocking(client
, FALSE
);
11121 set_blocking(server
, FALSE
);
11123 WSASetLastError(0xdeadbeef);
11124 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
11125 ok(ret
== -1, "got %d\n", ret
);
11126 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
11128 WSASetLastError(0xdeadbeef);
11129 overlapped
.Internal
= 0xdeadbeef;
11130 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
11131 ok(ret
== -1, "got %d\n", ret
);
11132 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
11133 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
11135 /* Overlapped, with a NULL event. */
11137 overlapped
.hEvent
= NULL
;
11139 memset(buffer
, 0, sizeof(buffer
));
11140 WSASetLastError(0xdeadbeef);
11141 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11142 ok(ret
== -1, "got %d\n", ret
);
11143 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
11144 ret
= WaitForSingleObject((HANDLE
)client
, 0);
11145 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
11147 ret
= send(server
, "data", 4, 0);
11148 ok(ret
== 4, "got %d\n", ret
);
11150 ret
= WaitForSingleObject((HANDLE
)client
, 1000);
11151 ok(!ret
, "wait timed out\n");
11152 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11153 ok(ret
, "got error %u\n", GetLastError());
11154 ok(size
== 4, "got size %u\n", size
);
11155 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
11157 /* Overlapped, with a non-NULL event. */
11159 overlapped
.hEvent
= event
;
11161 memset(buffer
, 0, sizeof(buffer
));
11162 WSASetLastError(0xdeadbeef);
11163 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11164 ok(ret
== -1, "got %d\n", ret
);
11165 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
11166 ret
= WaitForSingleObject(event
, 0);
11167 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
11169 ret
= send(server
, "data", 4, 0);
11170 ok(ret
== 4, "got %d\n", ret
);
11172 ret
= WaitForSingleObject(event
, 1000);
11173 ok(!ret
, "wait timed out\n");
11174 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11175 ok(ret
, "got error %u\n", GetLastError());
11176 ok(size
== 4, "got size %u\n", size
);
11177 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
11179 /* With data already in the pipe; usually this does return 0 (but not
11182 ret
= send(server
, "data", 4, 0);
11183 ok(ret
== 4, "got %d\n", ret
);
11185 memset(buffer
, 0, sizeof(buffer
));
11186 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11187 ok(!ret
|| WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
11188 ret
= WaitForSingleObject(event
, 1000);
11189 ok(!ret
, "wait timed out\n");
11190 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11191 ok(ret
, "got error %u\n", GetLastError());
11192 ok(size
== 4, "got size %u\n", size
);
11193 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
11195 closesocket(client
);
11196 closesocket(server
);
11198 /* With a non-overlapped socket, WSARecv() always blocks when passed an
11199 * overlapped structure, but returns WSAEWOULDBLOCK otherwise. */
11201 tcp_socketpair_flags(&client
, &server
, 0);
11202 set_blocking(client
, FALSE
);
11203 set_blocking(server
, FALSE
);
11205 WSASetLastError(0xdeadbeef);
11206 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
11207 ok(ret
== -1, "got %d\n", ret
);
11208 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
11210 WSASetLastError(0xdeadbeef);
11211 overlapped
.Internal
= 0xdeadbeef;
11212 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
11213 ok(ret
== -1, "got %d\n", ret
);
11214 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
11215 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#x\n", (NTSTATUS
)overlapped
.Internal
);
11217 /* Overlapped, with a NULL event. */
11219 params
.client
= client
;
11220 params
.event
= NULL
;
11221 thread
= CreateThread(NULL
, 0, nonblocking_async_recv_thread
, ¶ms
, 0, NULL
);
11223 ret
= WaitForSingleObject(thread
, 200);
11224 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
11226 ret
= send(server
, "data", 4, 0);
11227 ok(ret
== 4, "got %d\n", ret
);
11229 ret
= WaitForSingleObject(thread
, 200);
11230 ok(!ret
, "wait timed out\n");
11231 CloseHandle(thread
);
11233 /* Overlapped, with a non-NULL event. */
11235 params
.client
= client
;
11236 params
.event
= event
;
11237 thread
= CreateThread(NULL
, 0, nonblocking_async_recv_thread
, ¶ms
, 0, NULL
);
11239 ret
= WaitForSingleObject(thread
, 200);
11240 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
11242 ret
= send(server
, "data", 4, 0);
11243 ok(ret
== 4, "got %d\n", ret
);
11245 ret
= WaitForSingleObject(thread
, 200);
11246 ok(!ret
, "wait timed out\n");
11247 CloseHandle(thread
);
11249 /* With data already in the pipe. */
11251 ret
= send(server
, "data", 4, 0);
11252 ok(ret
== 4, "got %d\n", ret
);
11254 memset(buffer
, 0, sizeof(buffer
));
11255 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11256 ok(!ret
, "got %d\n", ret
);
11257 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11258 ok(ret
, "got error %u\n", GetLastError());
11259 ok(size
== 4, "got size %u\n", size
);
11260 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
11262 closesocket(client
);
11263 closesocket(server
);
11265 CloseHandle(overlapped
.hEvent
);
11268 static void test_empty_recv(void)
11270 OVERLAPPED overlapped
= {0};
11271 SOCKET client
, server
;
11272 DWORD size
, flags
= 0;
11277 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
11278 tcp_socketpair(&client
, &server
);
11280 WSASetLastError(0xdeadbeef);
11281 ret
= WSARecv(client
, NULL
, 0, NULL
, &flags
, &overlapped
, NULL
);
11282 ok(ret
== -1, "expected failure\n");
11283 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
11285 wsabuf
.buf
= buffer
;
11287 WSASetLastError(0xdeadbeef);
11288 ret
= WSARecv(client
, &wsabuf
, 0, NULL
, &flags
, &overlapped
, NULL
);
11289 ok(ret
== -1, "expected failure\n");
11290 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
11292 WSASetLastError(0xdeadbeef);
11293 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
11294 ok(ret
== -1, "expected failure\n");
11295 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
11297 ret
= send(server
, "data", 5, 0);
11298 ok(ret
== 5, "got %d\n", ret
);
11300 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11301 ok(!ret
, "wait failed\n");
11302 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11303 ok(ret
, "got error %u\n", GetLastError());
11304 ok(!size
, "got size %u\n", size
);
11306 WSASetLastError(0xdeadbeef);
11307 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
11308 ok(!ret
, "got error %u\n", WSAGetLastError());
11309 ok(!size
, "got size %u\n", size
);
11311 ret
= recv(client
, NULL
, 0, 0);
11312 ok(!ret
, "got %d\n", ret
);
11314 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
11315 ok(ret
== 5, "got %d\n", ret
);
11316 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, ret
));
11318 closesocket(client
);
11319 closesocket(server
);
11320 CloseHandle(overlapped
.hEvent
);
11323 static void test_timeout(void)
11325 DWORD timeout
, flags
= 0, size
;
11326 OVERLAPPED overlapped
= {0};
11327 SOCKET client
, server
;
11332 tcp_socketpair(&client
, &server
);
11333 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
11335 timeout
= 0xdeadbeef;
11336 len
= sizeof(timeout
);
11337 WSASetLastError(0xdeadbeef);
11338 ret
= getsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, &len
);
11339 ok(!ret
, "expected success\n");
11340 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11341 ok(len
== sizeof(timeout
), "got size %u\n", len
);
11342 ok(!timeout
, "got timeout %u\n", timeout
);
11345 WSASetLastError(0xdeadbeef);
11346 ret
= setsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, sizeof(timeout
));
11347 ok(!ret
, "expected success\n");
11348 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11350 timeout
= 0xdeadbeef;
11351 len
= sizeof(timeout
);
11352 WSASetLastError(0xdeadbeef);
11353 ret
= getsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, &len
);
11354 ok(!ret
, "expected success\n");
11355 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11356 ok(timeout
== 100, "got timeout %u\n", timeout
);
11358 WSASetLastError(0xdeadbeef);
11359 ret
= recv(client
, &buffer
, 1, 0);
11360 ok(ret
== -1, "got %d\n", ret
);
11361 ok(WSAGetLastError() == WSAETIMEDOUT
, "got error %u\n", WSAGetLastError());
11363 wsabuf
.buf
= &buffer
;
11365 WSASetLastError(0xdeadbeef);
11367 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
11368 ok(ret
== -1, "got %d\n", ret
);
11369 ok(WSAGetLastError() == WSAETIMEDOUT
, "got error %u\n", WSAGetLastError());
11370 ok(size
== 0xdeadbeef, "got size %u\n", size
);
11372 wsabuf
.buf
= &buffer
;
11374 WSASetLastError(0xdeadbeef);
11376 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
11377 ok(ret
== -1, "got %d\n", ret
);
11378 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
11380 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
11381 ok(ret
== WAIT_TIMEOUT
, "got %d\n", ret
);
11383 ret
= send(server
, "a", 1, 0);
11384 ok(ret
== 1, "got %d\n", ret
);
11386 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
11387 ok(!ret
, "got %d\n", ret
);
11388 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
11389 ok(ret
, "got error %u\n", GetLastError());
11390 ok(size
== 1, "got size %u\n", size
);
11392 closesocket(client
);
11393 closesocket(server
);
11394 CloseHandle(overlapped
.hEvent
);
11397 static void test_so_debug(void)
11403 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11405 len
= sizeof(debug
);
11406 WSASetLastError(0xdeadbeef);
11407 debug
= 0xdeadbeef;
11408 ret
= getsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, &len
);
11409 ok(!ret
, "got %d\n", ret
);
11410 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11411 ok(len
== sizeof(debug
), "got len %u\n", len
);
11412 ok(!debug
, "got debug %u\n", debug
);
11414 WSASetLastError(0xdeadbeef);
11416 ret
= setsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, sizeof(debug
));
11417 ok(!ret
, "got %d\n", ret
);
11418 todo_wine
ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11420 len
= sizeof(debug
);
11421 WSASetLastError(0xdeadbeef);
11422 debug
= 0xdeadbeef;
11423 ret
= getsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, &len
);
11424 ok(!ret
, "got %d\n", ret
);
11425 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
11426 ok(len
== sizeof(debug
), "got len %u\n", len
);
11427 todo_wine
ok(debug
== 1, "got debug %u\n", debug
);
11432 struct sockopt_validity_test
11440 static void do_sockopt_validity_tests(const char *type
, SOCKET sock
, int level
,
11441 const struct sockopt_validity_test
*tests
)
11444 int count
, rc
, expected_rc
, i
;
11446 for (i
= 0; tests
[i
].opt
; i
++)
11448 winetest_push_context("%s option %i", type
, tests
[i
].opt
);
11449 memset(value
, 0, sizeof(value
));
11450 count
= sizeof(value
);
11452 WSASetLastError(0);
11453 rc
= getsockopt(sock
, level
, tests
[i
].opt
, value
, &count
);
11454 expected_rc
= tests
[i
].get_error
? SOCKET_ERROR
: 0;
11455 todo_wine_if(!tests
[i
].get_error
&& tests
[i
].todo
)
11456 ok(rc
== expected_rc
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
11457 "expected getsockopt to return %i, got %i\n", expected_rc
, rc
);
11458 todo_wine_if(tests
[i
].todo
)
11459 ok(WSAGetLastError() == tests
[i
].get_error
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
11460 "expected getsockopt to set error %i, got %i\n", tests
[i
].get_error
, WSAGetLastError());
11462 if (tests
[i
].get_error
)
11464 winetest_pop_context();
11468 WSASetLastError(0);
11469 rc
= setsockopt(sock
, level
, tests
[i
].opt
, value
, count
);
11470 expected_rc
= tests
[i
].set_error
? SOCKET_ERROR
: 0;
11471 todo_wine_if(!tests
[i
].set_error
&& tests
[i
].todo
)
11472 ok(rc
== expected_rc
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
11473 "expected setsockopt to return %i, got %i\n", expected_rc
, rc
);
11474 todo_wine_if(tests
[i
].todo
)
11475 ok(WSAGetLastError() == tests
[i
].set_error
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
11476 "expected setsockopt to set error %i, got %i\n", tests
[i
].set_error
, WSAGetLastError());
11478 winetest_pop_context();
11482 static void test_sockopt_validity(void)
11484 static const struct sockopt_validity_test ipv4_tcp_tests
[] =
11486 { -1, WSAENOPROTOOPT
},
11488 { IP_HDRINCL
, WSAEINVAL
},
11491 { IP_MULTICAST_IF
, WSAEINVAL
},
11492 { IP_MULTICAST_TTL
, WSAEINVAL
},
11493 { IP_MULTICAST_LOOP
, WSAEINVAL
},
11494 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11495 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11496 { IP_DONTFRAGMENT
},
11497 { IP_PKTINFO
, WSAEINVAL
},
11498 { IP_RECVTTL
, WSAEINVAL
, 0, TRUE
},
11499 { IP_RECEIVE_BROADCAST
, WSAEINVAL
, 0, TRUE
},
11500 { IP_RECVIF
, WSAEINVAL
, 0, TRUE
},
11501 { IP_RECVDSTADDR
, WSAEINVAL
, 0, TRUE
},
11502 { IP_IFLIST
, 0, 0, TRUE
},
11504 { IP_RTHDR
, 0, 0, TRUE
},
11505 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11506 { IP_RECVRTHDR
, WSAEINVAL
, 0, TRUE
},
11507 { IP_RECVTCLASS
, WSAEINVAL
, 0, TRUE
},
11508 { IP_ORIGINAL_ARRIVAL_IF
, WSAEINVAL
, 0, TRUE
},
11509 { IP_ECN
, WSAEINVAL
, 0, TRUE
},
11510 { IP_PKTINFO_EX
, WSAEINVAL
, 0, TRUE
},
11511 { IP_WFP_REDIRECT_RECORDS
, WSAEINVAL
, 0, TRUE
},
11512 { IP_WFP_REDIRECT_CONTEXT
, WSAEINVAL
, 0, TRUE
},
11513 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11514 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
11515 { IP_RECVERR
, WSAEINVAL
, 0, TRUE
},
11516 { IP_USER_MTU
, 0, 0, TRUE
},
11519 static const struct sockopt_validity_test ipv4_udp_tests
[] =
11521 { -1, WSAENOPROTOOPT
},
11523 { IP_HDRINCL
, WSAEINVAL
},
11526 { IP_MULTICAST_IF
},
11527 { IP_MULTICAST_TTL
},
11528 { IP_MULTICAST_LOOP
},
11529 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11530 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11531 { IP_DONTFRAGMENT
},
11533 { IP_RECVTTL
, 0, 0, TRUE
},
11534 { IP_RECEIVE_BROADCAST
, 0, 0, TRUE
},
11535 { IP_RECVIF
, 0, 0, TRUE
},
11536 { IP_RECVDSTADDR
, 0, 0, TRUE
},
11537 { IP_IFLIST
, 0, 0, TRUE
},
11539 { IP_RTHDR
, 0, 0, TRUE
},
11540 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11541 { IP_RECVRTHDR
, 0, 0, TRUE
},
11542 { IP_RECVTCLASS
, 0, 0, TRUE
},
11543 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
11544 { IP_ECN
, 0, 0, TRUE
},
11545 { IP_PKTINFO_EX
, 0, 0, TRUE
},
11546 { IP_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
11547 { IP_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
11548 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11549 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
11550 { IP_RECVERR
, 0, 0, TRUE
},
11551 { IP_USER_MTU
, 0, 0, TRUE
},
11554 static const struct sockopt_validity_test ipv4_raw_tests
[] =
11556 { -1, WSAENOPROTOOPT
},
11561 { IP_MULTICAST_IF
},
11562 { IP_MULTICAST_TTL
},
11563 { IP_MULTICAST_LOOP
},
11564 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11565 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11566 { IP_DONTFRAGMENT
},
11568 { IP_RECVTTL
, 0, 0, TRUE
},
11569 { IP_RECEIVE_BROADCAST
, 0, 0, TRUE
},
11570 { IP_RECVIF
, 0, 0, TRUE
},
11571 { IP_RECVDSTADDR
, 0, 0, TRUE
},
11572 { IP_IFLIST
, 0, 0, TRUE
},
11574 { IP_RTHDR
, 0, 0, TRUE
},
11575 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11576 { IP_RECVRTHDR
, 0, 0, TRUE
},
11577 { IP_RECVTCLASS
, 0, 0, TRUE
},
11578 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
11579 { IP_ECN
, 0, 0, TRUE
},
11580 { IP_PKTINFO_EX
, 0, 0, TRUE
},
11581 { IP_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
11582 { IP_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
11583 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11584 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
11585 { IP_RECVERR
, WSAEINVAL
, 0, TRUE
},
11586 { IP_USER_MTU
, 0, 0, TRUE
},
11589 static const struct sockopt_validity_test ipv6_tcp_tests
[] =
11591 { -1, WSAENOPROTOOPT
},
11592 { IPV6_HOPOPTS
, 0, 0, TRUE
},
11593 { IPV6_HDRINCL
, WSAEINVAL
, 0, TRUE
},
11594 { IPV6_UNICAST_HOPS
},
11595 { IPV6_MULTICAST_IF
, WSAEINVAL
},
11596 { IPV6_MULTICAST_HOPS
, WSAEINVAL
},
11597 { IPV6_MULTICAST_LOOP
, WSAEINVAL
},
11598 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11599 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11601 { IPV6_PKTINFO
, WSAEINVAL
},
11602 { IPV6_HOPLIMIT
, WSAEINVAL
},
11603 { IPV6_PROTECTION_LEVEL
},
11604 { IPV6_RECVIF
, WSAEINVAL
, 0, TRUE
},
11605 { IPV6_RECVDSTADDR
, WSAEINVAL
, 0, TRUE
},
11607 { IPV6_IFLIST
, 0, 0, TRUE
},
11608 { IPV6_UNICAST_IF
},
11609 { IPV6_RTHDR
, 0, 0, TRUE
},
11610 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11611 { IPV6_RECVRTHDR
, WSAEINVAL
, 0, TRUE
},
11612 { IPV6_RECVTCLASS
, WSAEINVAL
},
11613 { IP_ORIGINAL_ARRIVAL_IF
, WSAEINVAL
, 0, TRUE
},
11614 { IPV6_ECN
, WSAEINVAL
, 0, TRUE
},
11615 { IPV6_PKTINFO_EX
, WSAEINVAL
, 0, TRUE
},
11616 { IPV6_WFP_REDIRECT_RECORDS
, WSAEINVAL
, 0, TRUE
},
11617 { IPV6_WFP_REDIRECT_CONTEXT
, WSAEINVAL
, 0, TRUE
},
11618 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11619 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
11620 { IPV6_RECVERR
, WSAEINVAL
, 0, TRUE
},
11621 { IPV6_USER_MTU
, 0, 0, TRUE
},
11624 static const struct sockopt_validity_test ipv6_udp_tests
[] =
11626 { -1, WSAENOPROTOOPT
},
11627 { IPV6_HOPOPTS
, 0, 0, TRUE
},
11628 { IPV6_HDRINCL
, WSAEINVAL
, 0, TRUE
},
11629 { IPV6_UNICAST_HOPS
},
11630 { IPV6_MULTICAST_IF
},
11631 { IPV6_MULTICAST_HOPS
},
11632 { IPV6_MULTICAST_LOOP
},
11633 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11634 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11638 { IPV6_PROTECTION_LEVEL
},
11639 { IPV6_RECVIF
, 0, 0, TRUE
},
11640 { IPV6_RECVDSTADDR
, 0, 0, TRUE
},
11642 { IPV6_IFLIST
, 0, 0, TRUE
},
11643 { IPV6_UNICAST_IF
},
11644 { IPV6_RTHDR
, 0, 0, TRUE
},
11645 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11646 { IPV6_RECVRTHDR
, 0, 0, TRUE
},
11647 { IPV6_RECVTCLASS
},
11648 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
11649 { IPV6_ECN
, 0, 0, TRUE
},
11650 { IPV6_PKTINFO_EX
, 0, 0, TRUE
},
11651 { IPV6_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
11652 { IPV6_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
11653 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11654 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
11655 { IPV6_RECVERR
, 0, 0, TRUE
},
11656 { IPV6_USER_MTU
, 0, 0, TRUE
},
11659 static const struct sockopt_validity_test ipv6_raw_tests
[] =
11661 { -1, WSAENOPROTOOPT
},
11662 { IPV6_HOPOPTS
, 0, 0, TRUE
},
11663 { IPV6_HDRINCL
, 0, 0, TRUE
},
11664 { IPV6_UNICAST_HOPS
},
11665 { IPV6_MULTICAST_IF
},
11666 { IPV6_MULTICAST_HOPS
},
11667 { IPV6_MULTICAST_LOOP
},
11668 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
11669 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
11673 { IPV6_PROTECTION_LEVEL
},
11674 { IPV6_RECVIF
, 0, 0, TRUE
},
11675 { IPV6_RECVDSTADDR
, 0, 0, TRUE
},
11677 { IPV6_IFLIST
, 0, 0, TRUE
},
11678 { IPV6_UNICAST_IF
},
11679 { IPV6_RTHDR
, 0, 0, TRUE
},
11680 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
11681 { IPV6_RECVRTHDR
, 0, 0, TRUE
},
11682 { IPV6_RECVTCLASS
},
11683 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
11684 { IPV6_ECN
, 0, 0, TRUE
},
11685 { IPV6_PKTINFO_EX
, 0, 0, TRUE
},
11686 { IPV6_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
11687 { IPV6_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
11688 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
11689 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
11690 { IPV6_RECVERR
, WSAEINVAL
, 0, TRUE
},
11691 { IPV6_USER_MTU
, 0, 0, TRUE
},
11694 static const struct sockopt_validity_test file_handle_tests
[] =
11696 { -1, WSAENOTSOCK
, 0, TRUE
},
11697 { SO_TYPE
, WSAENOTSOCK
, 0, TRUE
},
11701 char path
[MAX_PATH
];
11705 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11706 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11707 do_sockopt_validity_tests("IPv4 TCP", sock
, IPPROTO_IP
, ipv4_tcp_tests
);
11710 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
11711 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11712 do_sockopt_validity_tests("IPv4 UDP", sock
, IPPROTO_IP
, ipv4_udp_tests
);
11715 sock
= socket(AF_INET
, SOCK_RAW
, IPPROTO_RAW
);
11716 if (sock
== INVALID_SOCKET
&& WSAGetLastError() == WSAEACCES
)
11718 skip("Raw IPv4 sockets are not available\n");
11722 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11723 do_sockopt_validity_tests("IPv4 raw", sock
, IPPROTO_IP
, ipv4_raw_tests
);
11727 sock
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
11728 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11729 do_sockopt_validity_tests("IPv6 TCP", sock
, IPPROTO_IPV6
, ipv6_tcp_tests
);
11732 sock
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
11733 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11734 do_sockopt_validity_tests("IPv6 UDP", sock
, IPPROTO_IPV6
, ipv6_udp_tests
);
11737 sock
= socket(AF_INET6
, SOCK_RAW
, IPPROTO_RAW
);
11738 if (sock
== INVALID_SOCKET
&& WSAGetLastError() == WSAEACCES
)
11740 skip("Raw IPv6 sockets are not available\n");
11744 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
11745 do_sockopt_validity_tests("IPv6 raw", sock
, IPPROTO_IPV6
, ipv6_raw_tests
);
11749 GetSystemWindowsDirectoryA(path
, ARRAY_SIZE(path
));
11750 strcat(path
, "\\system.ini");
11751 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
11752 do_sockopt_validity_tests("file", (SOCKET
)file
, SOL_SOCKET
, file_handle_tests
);
11760 /* Leave these tests at the beginning. They depend on WSAStartup not having been
11761 * called, which is done by Init() below. */
11762 test_WithoutWSAStartup();
11763 test_WithWSAStartup();
11767 test_set_getsockopt();
11768 test_so_reuseaddr();
11771 test_extendedSocketOptions();
11773 test_sockopt_validity();
11775 for (i
= 0; i
< ARRAY_SIZE(tests
); i
++)
11776 do_test(&tests
[i
]);
11781 test_WSADuplicateSocket();
11782 test_WSAEnumNetworkEvents();
11788 test_getpeername();
11789 test_getsockname();
11791 test_address_list_query();
11793 test_fionread_siocatmark();
11794 test_get_extension_func();
11795 test_get_interface_list();
11796 test_keepalive_vals();
11797 test_sioRoutingInterfaceQuery();
11798 test_sioAddressListChange();
11799 test_base_handle();
11800 test_unsupported_ioctls();
11806 test_write_watch();
11812 test_TransmitFile();
11816 test_DisconnectEx();
11818 test_completion_port();
11819 test_connect_completion_port();
11820 test_shutdown_completion_port();
11822 test_connecting_socket();
11823 test_WSAGetOverlappedResult();
11824 test_nonblocking_async_recv();
11828 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */