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
);
164 static int sync_recv(SOCKET s
, void *buffer
, int len
, DWORD flags
);
166 static void tcp_socketpair_flags(SOCKET
*src
, SOCKET
*dst
, DWORD flags
)
168 SOCKET server
= INVALID_SOCKET
;
169 struct sockaddr_in addr
;
172 *src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, flags
);
173 ok(*src
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
175 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, flags
);
176 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
178 memset(&addr
, 0, sizeof(addr
));
179 addr
.sin_family
= AF_INET
;
180 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
181 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
182 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
185 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
186 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
188 ret
= listen(server
, 1);
189 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
191 ret
= connect(*src
, (struct sockaddr
*)&addr
, sizeof(addr
));
192 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
195 *dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
196 ok(*dst
!= INVALID_SOCKET
, "failed to accept socket, error %u\n", WSAGetLastError());
201 static void tcp_socketpair(SOCKET
*src
, SOCKET
*dst
)
203 tcp_socketpair_flags(src
, dst
, WSA_FLAG_OVERLAPPED
);
206 static void WINAPI
apc_func(ULONG_PTR apc_count
)
208 ++*(unsigned int *)apc_count
;
211 /* Set the linger timeout to zero and close the socket. This will trigger an
212 * RST on the connection on Windows as well as on Unix systems. */
213 static void close_with_rst(SOCKET s
)
215 static const struct linger linger
= {.l_onoff
= 1};
218 SetLastError(0xdeadbeef);
219 ret
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, (const char *)&linger
, sizeof(linger
));
220 ok(!ret
, "got %d\n", ret
);
221 ok(!GetLastError(), "got error %lu\n", GetLastError());
226 #define check_poll(a, b) check_poll_(__LINE__, a, POLLRDNORM | POLLRDBAND | POLLWRNORM, b, FALSE)
227 #define check_poll_todo(a, b) check_poll_(__LINE__, a, POLLRDNORM | POLLRDBAND | POLLWRNORM, b, TRUE)
228 #define check_poll_mask(a, b, c) check_poll_(__LINE__, a, b, c, FALSE)
229 #define check_poll_mask_todo(a, b, c) check_poll_(__LINE__, a, b, c, TRUE)
230 static void check_poll_(int line
, SOCKET s
, short mask
, short expect
, BOOL todo
)
236 pollfd
.events
= mask
;
237 pollfd
.revents
= 0xdead;
238 ret
= pWSAPoll(&pollfd
, 1, 1000);
239 ok_(__FILE__
, line
)(ret
== (pollfd
.revents
? 1 : 0), "WSAPoll() returned %d\n", ret
);
240 todo_wine_if (todo
) ok_(__FILE__
, line
)(pollfd
.revents
== expect
, "got wrong events %#x\n", pollfd
.revents
);
243 static DWORD WINAPI
poll_async_thread(void *arg
)
245 WSAPOLLFD
*pollfd
= arg
;
248 ret
= pWSAPoll(pollfd
, 1, 500);
249 ok(ret
== (pollfd
->revents
? 1 : 0), "WSAPoll() returned %d\n", ret
);
254 static void set_so_opentype ( BOOL overlapped
)
256 int optval
= !overlapped
, newval
, len
= sizeof (int);
258 ok ( setsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
259 (LPVOID
) &optval
, sizeof (optval
) ) == 0,
260 "setting SO_OPENTYPE failed\n" );
261 ok ( getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
262 (LPVOID
) &newval
, &len
) == 0,
263 "getting SO_OPENTYPE failed\n" );
264 ok ( optval
== newval
, "failed to set SO_OPENTYPE\n" );
267 static int set_blocking ( SOCKET s
, BOOL blocking
)
269 u_long val
= !blocking
;
270 return ioctlsocket ( s
, FIONBIO
, &val
);
273 static void fill_buffer ( char *buf
, int chunk_size
, int n_chunks
)
276 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
277 memset ( p
, c
, chunk_size
);
280 static int test_buffer ( char *buf
, int chunk_size
, int n_chunks
)
284 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
286 for ( i
= 0; i
< chunk_size
; i
++ )
287 if ( p
[i
] != c
) return i
;
293 * This routine is called when a client / server does not expect any more data,
294 * but needs to acknowledge the closing of the connection (by reading 0 bytes).
296 static void read_zero_bytes ( SOCKET s
)
300 while ( ( tmp
= recv ( s
, buf
, 256, 0 ) ) > 0 )
302 ok ( n
<= 0, "garbage data received: %d bytes\n", n
);
305 static int do_synchronous_send ( SOCKET s
, char *buf
, int buflen
, int flags
, int sendlen
)
307 char* last
= buf
+ buflen
, *p
;
309 for ( p
= buf
; n
> 0 && p
< last
; )
311 n
= send ( s
, p
, min ( sendlen
, last
- p
), flags
);
314 wsa_ok ( n
, 0 <=, "do_synchronous_send (%lx): error %d\n" );
318 static int do_synchronous_recv ( SOCKET s
, char *buf
, int buflen
, int flags
, int recvlen
)
320 char* last
= buf
+ buflen
, *p
;
322 for ( p
= buf
; n
> 0 && p
< last
; )
324 n
= recv ( s
, p
, min ( recvlen
, last
- p
), flags
);
327 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%lx): error %d:\n" );
331 static int do_synchronous_recvfrom ( SOCKET s
, char *buf
, int buflen
, int flags
, struct sockaddr
*from
, int *fromlen
, int recvlen
)
333 char* last
= buf
+ buflen
, *p
;
335 for ( p
= buf
; n
> 0 && p
< last
; )
337 n
= recvfrom ( s
, p
, min ( recvlen
, last
- p
), flags
, from
, fromlen
);
340 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%lx): error %d:\n" );
345 * Call this routine right after thread startup.
346 * SO_OPENTYPE must by 0, regardless what the server did.
348 static void check_so_opentype (void)
352 getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
, (LPVOID
) &tmp
, &len
);
353 ok ( tmp
== 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp
);
356 /**************** Server utility functions ***************/
359 * Even if we have closed our server socket cleanly,
360 * the OS may mark the address "in use" for some time -
361 * this happens with native Linux apps, too.
363 static void do_bind ( SOCKET s
, struct sockaddr
* addr
, int addrlen
)
365 int err
, wsaerr
= 0, n_try
= BIND_TRIES
;
367 while ( ( err
= bind ( s
, addr
, addrlen
) ) != 0 &&
368 ( wsaerr
= WSAGetLastError () ) == WSAEADDRINUSE
&&
371 trace ( "address in use, waiting ...\n" );
372 Sleep ( 1000 * BIND_SLEEP
);
374 ok ( err
== 0, "failed to bind: %d\n", wsaerr
);
377 static void server_start ( server_params
*par
)
380 test_params
*gen
= par
->general
;
381 server_memory
*mem
= LocalAlloc ( LPTR
, sizeof ( server_memory
) );
383 TlsSetValue ( tls
, mem
);
384 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
385 NULL
, 0, par
->sock_flags
);
386 ok ( mem
->s
!= INVALID_SOCKET
, "Server: WSASocket failed\n" );
388 mem
->addr
.sin_family
= AF_INET
;
389 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
390 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
392 for (i
= 0; i
< MAX_CLIENTS
; i
++)
394 mem
->sock
[i
].s
= INVALID_SOCKET
;
395 mem
->sock
[i
].buf
= LocalAlloc ( LPTR
, gen
->n_chunks
* gen
->chunk_size
);
396 mem
->sock
[i
].n_recvd
= 0;
397 mem
->sock
[i
].n_sent
= 0;
400 if ( gen
->sock_type
== SOCK_STREAM
)
401 do_bind ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof (mem
->addr
) );
404 static void server_stop (void)
407 server_memory
*mem
= TlsGetValue ( tls
);
409 for (i
= 0; i
< MAX_CLIENTS
; i
++ )
411 LocalFree ( mem
->sock
[i
].buf
);
412 if ( mem
->sock
[i
].s
!= INVALID_SOCKET
)
413 closesocket ( mem
->sock
[i
].s
);
415 ok ( closesocket ( mem
->s
) == 0, "closesocket failed\n" );
417 ExitThread ( GetCurrentThreadId () );
420 /**************** Client utilitiy functions ***************/
422 static void client_start ( client_params
*par
)
424 test_params
*gen
= par
->general
;
425 client_memory
*mem
= LocalAlloc (LPTR
, sizeof (client_memory
));
427 TlsSetValue ( tls
, mem
);
429 WaitForSingleObject ( server_ready
, INFINITE
);
431 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
432 NULL
, 0, par
->sock_flags
);
434 mem
->addr
.sin_family
= AF_INET
;
435 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
436 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
438 ok ( mem
->s
!= INVALID_SOCKET
, "Client: WSASocket failed\n" );
440 mem
->send_buf
= LocalAlloc ( LPTR
, 2 * gen
->n_chunks
* gen
->chunk_size
);
441 mem
->recv_buf
= mem
->send_buf
+ gen
->n_chunks
* gen
->chunk_size
;
442 fill_buffer ( mem
->send_buf
, gen
->chunk_size
, gen
->n_chunks
);
444 SetEvent ( client_ready
[client_id
] );
445 /* Wait for the other clients to come up */
446 WaitForMultipleObjects ( min ( gen
->n_clients
, MAX_CLIENTS
), client_ready
, TRUE
, INFINITE
);
449 static void client_stop (void)
451 client_memory
*mem
= TlsGetValue ( tls
);
452 wsa_ok ( closesocket ( mem
->s
), 0 ==, "closesocket error (%lx): %d\n" );
453 LocalFree ( mem
->send_buf
);
458 /**************** Servers ***************/
461 * simple_server: A very basic server doing synchronous IO.
463 static VOID WINAPI
simple_server ( server_params
*par
)
465 test_params
*gen
= par
->general
;
467 int pos
, n_recvd
, n_sent
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
468 id
= GetCurrentThreadId();
470 set_so_opentype ( FALSE
); /* non-overlapped */
471 server_start ( par
);
472 mem
= TlsGetValue ( tls
);
474 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "simple_server (%lx): failed to set blocking mode: %d\n");
475 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "simple_server (%lx): listen failed: %d\n");
477 SetEvent ( server_ready
); /* notify clients */
479 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
481 /* accept a single connection */
482 tmp
= sizeof ( mem
->sock
[0].peer
);
483 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
484 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "simple_server (%lx): accept failed: %d\n" );
486 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
487 "simple_server (%x): strange peer address\n", id
);
489 /* Receive data & check it */
490 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
491 ok ( n_recvd
== n_expected
,
492 "simple_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
493 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
494 ok ( pos
== -1, "simple_server (%x): test pattern error: %d\n", id
, pos
);
497 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
498 ok ( n_sent
== n_expected
,
499 "simple_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
502 read_zero_bytes ( mem
->sock
[0].s
);
503 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "simple_server (%lx): closesocket error: %d\n" );
504 mem
->sock
[0].s
= INVALID_SOCKET
;
511 * oob_server: A very basic server receiving out-of-band data.
513 static VOID WINAPI
oob_server ( server_params
*par
)
515 test_params
*gen
= par
->general
;
518 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
,
519 id
= GetCurrentThreadId();
521 set_so_opentype ( FALSE
); /* non-overlapped */
522 server_start ( par
);
523 mem
= TlsGetValue ( tls
);
525 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "oob_server (%lx): failed to set blocking mode: %d\n");
526 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "oob_server (%lx): listen failed: %d\n");
528 SetEvent ( server_ready
); /* notify clients */
530 /* accept a single connection */
531 tmp
= sizeof ( mem
->sock
[0].peer
);
532 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
533 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "oob_server (%lx): accept failed: %d\n" );
535 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
536 "oob_server (%x): strange peer address\n", id
);
538 /* check initial atmark state */
539 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
540 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %li\n", id
, atmark
);
542 /* Receive normal data */
543 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
544 ok ( n_recvd
== n_expected
,
545 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
546 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
547 ok ( pos
== -1, "oob_server (%x): test pattern error: %d\n", id
, pos
);
549 /* check atmark state */
550 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
551 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %li\n", id
, atmark
);
554 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
555 ok ( n_sent
== n_expected
,
556 "oob_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
558 /* Receive a part of the out-of-band data and print atmark state */
559 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, 8, 0, par
->buflen
);
561 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, 8 );
564 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
566 /* Receive the rest of the out-of-band data and check atmark state */
567 do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
569 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
570 todo_wine
ok ( atmark
== 0, "oob_server (%x): not at the OOB mark: %li\n", id
, atmark
);
573 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "oob_server (%lx): closesocket error: %d\n" );
574 mem
->sock
[0].s
= INVALID_SOCKET
;
580 * select_server: A non-blocking server.
582 static VOID WINAPI
select_server ( server_params
*par
)
584 test_params
*gen
= par
->general
;
586 int n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
587 id
= GetCurrentThreadId(), n_connections
= 0, n_sent
, n_recvd
,
588 n_set
, delta
, n_ready
;
589 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
590 fd_set fds_recv
, fds_send
, fds_openrecv
, fds_opensend
;
592 set_so_opentype ( FALSE
); /* non-overlapped */
593 server_start ( par
);
594 mem
= TlsGetValue ( tls
);
596 wsa_ok ( set_blocking ( mem
->s
, FALSE
), 0 ==, "select_server (%lx): failed to set blocking mode: %d\n");
597 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "select_server (%lx): listen failed: %d\n");
599 SetEvent ( server_ready
); /* notify clients */
601 FD_ZERO ( &fds_openrecv
);
602 FD_ZERO ( &fds_recv
);
603 FD_ZERO ( &fds_send
);
604 FD_ZERO ( &fds_opensend
);
606 FD_SET ( mem
->s
, &fds_openrecv
);
610 fds_recv
= fds_openrecv
;
611 fds_send
= fds_opensend
;
615 wsa_ok ( ( n_ready
= select ( 0, &fds_recv
, &fds_send
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
616 "select_server (%lx): select() failed: %d\n" );
618 /* check for incoming requests */
619 if ( FD_ISSET ( mem
->s
, &fds_recv
) ) {
622 /* accept a single connection */
623 tmp
= sizeof ( mem
->sock
[n_connections
].peer
);
624 mem
->sock
[n_connections
].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[n_connections
].peer
, &tmp
);
625 wsa_ok ( mem
->sock
[n_connections
].s
, INVALID_SOCKET
!=, "select_server (%lx): accept() failed: %d\n" );
627 ok ( mem
->sock
[n_connections
].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
628 "select_server (%x): strange peer address\n", id
);
630 /* add to list of open connections */
631 FD_SET ( mem
->sock
[n_connections
].s
, &fds_openrecv
);
632 FD_SET ( mem
->sock
[n_connections
].s
, &fds_opensend
);
637 /* handle open requests */
639 for ( i
= 0; i
< n_connections
; i
++ )
641 if ( FD_ISSET( mem
->sock
[i
].s
, &fds_recv
) ) {
644 if ( mem
->sock
[i
].n_recvd
< n_expected
) {
645 /* Receive data & check it */
646 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 );
647 ok ( n_recvd
!= SOCKET_ERROR
, "select_server (%x): error in recv(): %d\n", id
, WSAGetLastError() );
648 mem
->sock
[i
].n_recvd
+= n_recvd
;
650 if ( mem
->sock
[i
].n_recvd
== n_expected
) {
651 int pos
= test_buffer ( mem
->sock
[i
].buf
, gen
->chunk_size
, gen
->n_chunks
);
652 ok ( pos
== -1, "select_server (%x): test pattern error: %d\n", id
, pos
);
653 FD_CLR ( mem
->sock
[i
].s
, &fds_openrecv
);
656 ok ( mem
->sock
[i
].n_recvd
<= n_expected
, "select_server (%x): received too many bytes: %d\n", id
, mem
->sock
[i
].n_recvd
);
660 /* only echo back what we've received */
661 delta
= mem
->sock
[i
].n_recvd
- mem
->sock
[i
].n_sent
;
663 if ( FD_ISSET ( mem
->sock
[i
].s
, &fds_send
) ) {
666 if ( ( delta
> 0 ) && ( mem
->sock
[i
].n_sent
< n_expected
) ) {
668 n_sent
= send ( mem
->sock
[i
].s
, mem
->sock
[i
].buf
+ mem
->sock
[i
].n_sent
, min ( delta
, par
->buflen
), 0 );
669 ok ( n_sent
!= SOCKET_ERROR
, "select_server (%x): error in send(): %d\n", id
, WSAGetLastError() );
670 mem
->sock
[i
].n_sent
+= n_sent
;
672 if ( mem
->sock
[i
].n_sent
== n_expected
) {
673 FD_CLR ( mem
->sock
[i
].s
, &fds_opensend
);
676 ok ( mem
->sock
[i
].n_sent
<= n_expected
, "select_server (%x): sent too many bytes: %d\n", id
, mem
->sock
[i
].n_sent
);
681 /* check that select returned the correct number of ready sockets */
682 ok ( ( n_set
== n_ready
), "select_server (%x): select() returns wrong number of ready sockets\n", id
);
684 /* check if all clients are done */
685 if ( ( fds_opensend
.fd_count
== 0 )
686 && ( fds_openrecv
.fd_count
== 1 ) /* initial socket that accepts clients */
687 && ( n_connections
== min ( gen
->n_clients
, MAX_CLIENTS
) ) ) {
692 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
695 read_zero_bytes ( mem
->sock
[i
].s
);
696 wsa_ok ( closesocket ( mem
->sock
[i
].s
), 0 ==, "select_server (%lx): closesocket error: %d\n" );
697 mem
->sock
[i
].s
= INVALID_SOCKET
;
703 /**************** Clients ***************/
706 * simple_client: A very basic client doing synchronous IO.
708 static VOID WINAPI
simple_client ( client_params
*par
)
710 test_params
*gen
= par
->general
;
712 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
714 id
= GetCurrentThreadId();
715 /* wait here because we want to call set_so_opentype before creating a socket */
716 WaitForSingleObject ( server_ready
, INFINITE
);
718 check_so_opentype ();
719 set_so_opentype ( FALSE
); /* non-overlapped */
720 client_start ( par
);
721 mem
= TlsGetValue ( tls
);
724 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
725 0 ==, "simple_client (%lx): connect error: %d\n" );
726 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
727 "simple_client (%x): failed to set blocking mode\n", id
);
729 /* send data to server */
730 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
731 ok ( n_sent
== n_expected
,
732 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
734 /* shutdown send direction */
735 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%lx): shutdown failed: %d\n" );
737 /* Receive data echoed back & check it */
738 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
739 ok ( n_recvd
== n_expected
,
740 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
743 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
744 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
747 read_zero_bytes ( mem
->s
);
752 * oob_client: A very basic client sending out-of-band data.
754 static VOID WINAPI
oob_client ( client_params
*par
)
756 test_params
*gen
= par
->general
;
758 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
760 id
= GetCurrentThreadId();
761 /* wait here because we want to call set_so_opentype before creating a socket */
762 WaitForSingleObject ( server_ready
, INFINITE
);
764 check_so_opentype ();
765 set_so_opentype ( FALSE
); /* non-overlapped */
766 client_start ( par
);
767 mem
= TlsGetValue ( tls
);
770 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
771 0 ==, "oob_client (%lx): connect error: %d\n" );
772 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
773 "oob_client (%x): failed to set blocking mode\n", id
);
775 /* send data to server */
776 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
777 ok ( n_sent
== n_expected
,
778 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
780 /* Receive data echoed back & check it */
781 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
782 ok ( n_recvd
== n_expected
,
783 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
784 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
785 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
787 /* send out-of-band data to server */
788 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, MSG_OOB
, par
->buflen
);
789 ok ( n_sent
== n_expected
,
790 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
792 /* shutdown send direction */
793 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%lx): shutdown failed: %d\n" );
796 read_zero_bytes ( mem
->s
);
801 * simple_mixed_client: mixing send and recvfrom
803 static VOID WINAPI
simple_mixed_client ( client_params
*par
)
805 test_params
*gen
= par
->general
;
807 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
808 int fromLen
= sizeof(mem
->addr
);
809 struct sockaddr test
;
811 id
= GetCurrentThreadId();
812 /* wait here because we want to call set_so_opentype before creating a socket */
813 WaitForSingleObject ( server_ready
, INFINITE
);
815 check_so_opentype ();
816 set_so_opentype ( FALSE
); /* non-overlapped */
817 client_start ( par
);
818 mem
= TlsGetValue ( tls
);
821 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
822 0 ==, "simple_client (%lx): connect error: %d\n" );
823 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
824 "simple_client (%x): failed to set blocking mode\n", id
);
826 /* send data to server */
827 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
828 ok ( n_sent
== n_expected
,
829 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
831 /* shutdown send direction */
832 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%lx): shutdown failed: %d\n" );
834 /* this shouldn't change, since lpFrom, is not updated on
835 connection oriented sockets - exposed by bug 11640
837 ((struct sockaddr_in
*)&test
)->sin_addr
.s_addr
= inet_addr("0.0.0.0");
839 /* Receive data echoed back & check it */
840 n_recvd
= do_synchronous_recvfrom ( mem
->s
, mem
->recv_buf
, n_expected
, 0, &test
, &fromLen
,
842 ok ( n_recvd
== n_expected
,
843 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
845 /* check that lpFrom was not updated */
848 inet_ntoa(((struct sockaddr_in
*)&test
)->sin_addr
),
849 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
852 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
853 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
856 read_zero_bytes ( mem
->s
);
861 * event_client: An event-driven client
863 static void WINAPI
event_client ( client_params
*par
)
865 test_params
*gen
= par
->general
;
867 int id
= GetCurrentThreadId(), n_expected
= gen
->n_chunks
* gen
->chunk_size
,
870 WSANETWORKEVENTS wsa_events
;
871 char *send_last
, *recv_last
, *send_p
, *recv_p
;
872 LONG mask
= FD_READ
| FD_WRITE
| FD_CLOSE
;
874 client_start ( par
);
876 mem
= TlsGetValue ( tls
);
878 /* Prepare event notification for connect, makes socket nonblocking */
879 event
= WSACreateEvent ();
880 WSAEventSelect ( mem
->s
, event
, FD_CONNECT
);
881 tmp
= connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) );
883 err
= WSAGetLastError ();
884 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): connect error: %d\n", id
, err
);
885 tmp
= WaitForSingleObject ( event
, INFINITE
);
886 ok ( tmp
== WAIT_OBJECT_0
, "event_client (%x): wait for connect event failed: %d\n", id
, tmp
);
887 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
888 ok ( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
889 err
= wsa_events
.iErrorCode
[ FD_CONNECT_BIT
];
890 ok ( err
== 0, "event_client (%x): connect error: %d\n", id
, err
);
894 WSAEventSelect ( mem
->s
, event
, mask
);
896 recv_p
= mem
->recv_buf
;
897 recv_last
= mem
->recv_buf
+ n_expected
;
898 send_p
= mem
->send_buf
;
899 send_last
= mem
->send_buf
+ n_expected
;
903 err
= WaitForSingleObject ( event
, INFINITE
);
904 ok ( err
== WAIT_OBJECT_0
, "event_client (%x): wait failed\n", id
);
906 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
907 ok( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
909 if ( wsa_events
.lNetworkEvents
& FD_WRITE
)
911 err
= wsa_events
.iErrorCode
[ FD_WRITE_BIT
];
912 ok ( err
== 0, "event_client (%x): FD_WRITE error code: %d\n", id
, err
);
917 n
= send ( mem
->s
, send_p
, min ( send_last
- send_p
, par
->buflen
), 0 );
920 err
= WSAGetLastError ();
921 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): send error: %d\n", id
, err
);
926 while ( n
>= 0 && send_p
< send_last
);
928 if ( send_p
== send_last
)
930 shutdown ( mem
->s
, SD_SEND
);
932 WSAEventSelect ( mem
->s
, event
, mask
);
935 if ( wsa_events
.lNetworkEvents
& FD_READ
)
937 err
= wsa_events
.iErrorCode
[ FD_READ_BIT
];
938 ok ( err
== 0, "event_client (%x): FD_READ error code: %d\n", id
, err
);
939 if ( err
!= 0 ) break;
941 /* First read must succeed */
942 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
943 wsa_ok ( n
, 0 <=, "event_client (%lx): recv error: %d\n" );
947 if ( recv_p
== recv_last
)
950 WSAEventSelect ( mem
->s
, event
, mask
);
953 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
954 ok(n
>= 0 || WSAGetLastError() == WSAEWOULDBLOCK
,
955 "event_client (%x): got error %u\n", id
, WSAGetLastError());
959 if ( wsa_events
.lNetworkEvents
& FD_CLOSE
)
961 err
= wsa_events
.iErrorCode
[ FD_CLOSE_BIT
];
962 ok ( err
== 0, "event_client (%x): FD_CLOSE error code: %d\n", id
, err
);
967 n
= send_p
- mem
->send_buf
;
968 ok ( send_p
== send_last
,
969 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n
, n_expected
);
970 n
= recv_p
- mem
->recv_buf
;
971 ok ( recv_p
== recv_last
,
972 "simple_client (%x): received less data than expected: %d of %d\n", id
, n
, n_expected
);
973 n
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
974 ok ( n
== -1, "event_client (%x): test pattern error: %d\n", id
, n
);
977 WSACloseEvent ( event
);
981 /* Tests for WSAStartup */
982 static void test_WithoutWSAStartup(void)
986 WSASetLastError(0xdeadbeef);
987 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
, "WSASocketA should have failed\n");
988 err
= WSAGetLastError();
989 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %ld\n", err
);
991 WSASetLastError(0xdeadbeef);
992 ok(gethostbyname("localhost") == NULL
, "gethostbyname() succeeded unexpectedly\n");
993 err
= WSAGetLastError();
994 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %ld\n", err
);
997 static void test_WithWSAStartup(void)
1000 WORD version
= MAKEWORD( 2, 2 );
1001 INT res
, socks
, i
, j
;
1006 SOCKET src
, dst
, dup_src
, dup_dst
;
1010 res
= WSAStartup( version
, &data
);
1011 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1013 ptr
= gethostbyname("localhost");
1014 ok(ptr
!= NULL
, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
1016 /* Alloc some sockets to check if they are destroyed on WSACleanup */
1017 for (socks
= 0; socks
< ARRAY_SIZE(pairs
); socks
++)
1019 WSAPROTOCOL_INFOA info
;
1020 tcp_socketpair(&pairs
[socks
].src
, &pairs
[socks
].dst
);
1022 memset(&info
, 0, sizeof(info
));
1023 ok(!WSADuplicateSocketA(pairs
[socks
].src
, GetCurrentProcessId(), &info
),
1024 "WSADuplicateSocketA should have worked\n");
1025 pairs
[socks
].dup_src
= WSASocketA(0, 0, 0, &info
, 0, 0);
1026 ok(pairs
[socks
].dup_src
!= SOCKET_ERROR
, "expected != -1\n");
1028 memset(&info
, 0, sizeof(info
));
1029 ok(!WSADuplicateSocketA(pairs
[socks
].dst
, GetCurrentProcessId(), &info
),
1030 "WSADuplicateSocketA should have worked\n");
1031 pairs
[socks
].dup_dst
= WSASocketA(0, 0, 0, &info
, 0, 0);
1032 ok(pairs
[socks
].dup_dst
!= SOCKET_ERROR
, "expected != -1\n");
1035 res
= send(pairs
[0].src
, "TEST", 4, 0);
1036 ok(res
== 4, "send failed with error %d\n", WSAGetLastError());
1040 res
= WSAStartup( version
, &data
);
1041 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1043 /* show that sockets are destroyed automatically after WSACleanup */
1044 SetLastError(0xdeadbeef);
1045 res
= send(pairs
[0].src
, "TEST", 4, 0);
1046 error
= WSAGetLastError();
1047 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1048 ok(error
== WSAENOTSOCK
, "expected 10038, got %ld\n", error
);
1050 SetLastError(0xdeadbeef);
1051 res
= send(pairs
[0].dst
, "TEST", 4, 0);
1052 error
= WSAGetLastError();
1053 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1054 ok(error
== WSAENOTSOCK
, "expected 10038, got %ld\n", error
);
1056 /* Check that all sockets were destroyed */
1057 for (i
= 0; i
< socks
; i
++)
1059 for (j
= 0; j
< 4; j
++)
1061 struct sockaddr_in saddr
;
1062 int size
= sizeof(saddr
);
1065 case 0: sock
= pairs
[i
].src
; break;
1066 case 1: sock
= pairs
[i
].dup_src
; break;
1067 case 2: sock
= pairs
[i
].dst
; break;
1068 case 3: sock
= pairs
[i
].dup_dst
; break;
1071 SetLastError(0xdeadbeef);
1072 res
= getsockname(sock
, (struct sockaddr
*)&saddr
, &size
);
1073 error
= WSAGetLastError();
1074 ok(res
== SOCKET_ERROR
, "Test[%d]: getsockname should have failed\n", i
);
1075 if (res
== SOCKET_ERROR
)
1076 ok(error
== WSAENOTSOCK
, "Test[%d]: expected 10038, got %ld\n", i
, error
);
1080 /* While wine is not fixed, close all sockets manually */
1081 for (i
= 0; i
< socks
; i
++)
1083 closesocket(pairs
[i
].src
);
1084 closesocket(pairs
[i
].dst
);
1085 closesocket(pairs
[i
].dup_src
);
1086 closesocket(pairs
[i
].dup_dst
);
1090 ok(res
== 0, "expected 0, got %d\n", res
);
1091 WSASetLastError(0xdeadbeef);
1093 error
= WSAGetLastError();
1094 ok ( res
== SOCKET_ERROR
&& error
== WSANOTINITIALISED
,
1095 "WSACleanup returned %d WSAGetLastError is %ld\n", res
, error
);
1098 /**************** Main program utility functions ***************/
1100 static void Init (void)
1102 WORD ver
= MAKEWORD (2, 2);
1104 HMODULE hws2_32
= GetModuleHandleA("ws2_32.dll"), ntdll
;
1106 pWSAPoll
= (void *)GetProcAddress(hws2_32
, "WSAPoll");
1108 ntdll
= LoadLibraryA("ntdll.dll");
1110 pNtClose
= (void *)GetProcAddress(ntdll
, "NtClose");
1112 ok ( WSAStartup ( ver
, &data
) == 0, "WSAStartup failed\n" );
1116 static void Exit (void)
1121 err
= WSAGetLastError();
1122 ok ( ret
== 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret
, err
);
1125 static void StartServer (LPTHREAD_START_ROUTINE routine
,
1126 test_params
*general
, server_params
*par
)
1128 par
->general
= general
;
1129 thread
[0] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[0] );
1130 ok ( thread
[0] != NULL
, "Failed to create server thread\n" );
1133 static void StartClients (LPTHREAD_START_ROUTINE routine
,
1134 test_params
*general
, client_params
*par
)
1137 par
->general
= general
;
1138 for ( i
= 1; i
<= min ( general
->n_clients
, MAX_CLIENTS
); i
++ )
1141 thread
[i
] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[i
] );
1142 ok ( thread
[i
] != NULL
, "Failed to create client thread\n" );
1143 /* Make sure the client is up and running */
1144 WaitForSingleObject ( client_ready
[client_id
], INFINITE
);
1148 static void do_test( test_setup
*test
)
1150 DWORD i
, n
= min (test
->general
.n_clients
, MAX_CLIENTS
);
1153 server_ready
= CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1154 for (i
= 0; i
<= n
; i
++)
1155 client_ready
[i
] = CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1157 StartServer ( test
->srv
, &test
->general
, &test
->srv_params
);
1158 StartClients ( test
->clt
, &test
->general
, &test
->clt_params
);
1159 WaitForSingleObject ( server_ready
, INFINITE
);
1161 wait
= WaitForMultipleObjects ( 1 + n
, thread
, TRUE
, 1000 * TEST_TIMEOUT
);
1162 ok(!wait
, "wait failed, error %lu\n", wait
);
1164 CloseHandle ( server_ready
);
1165 for (i
= 0; i
<= n
; i
++)
1166 CloseHandle ( client_ready
[i
] );
1169 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1170 /* optname = SO_LINGER */
1171 static const LINGER linger_testvals
[] = {
1178 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1179 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1180 bug in the linux kernel (fixed in 2.6.8) */
1181 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1183 static void test_set_getsockopt(void)
1191 BOOL accepts_short_len
;
1192 unsigned int sizes
[3];
1194 BOOL accepts_large_value
;
1199 {AF_INET
, SOCK_DGRAM
, SOL_SOCKET
, SO_BROADCAST
, TRUE
, {1, 1, 4}, {0, 0xdead0001, 0}, TRUE
, TRUE
},
1200 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_DONTLINGER
, TRUE
, {1, 1, 4}, {0, 0xdead0001, 0}, TRUE
, TRUE
},
1201 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_LINGER
, FALSE
, {1, 2, 4}, {0xdeadbe00, 0xdead0000}, TRUE
},
1202 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_OOBINLINE
, TRUE
, {1, 1, 4}, {0, 0xdead0001, 0}, TRUE
, TRUE
},
1203 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_RCVBUF
, FALSE
, {1, 2, 4}, {0xdeadbe00, 0xdead0000}, TRUE
},
1204 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_KEEPALIVE
, TRUE
, {1, 1, 1}, {0}, TRUE
},
1205 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_DONTROUTE
, TRUE
, {1, 1, 1}, {0}, TRUE
},
1206 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_RCVTIMEO
, FALSE
, {1, 2, 4}, {0}, TRUE
},
1207 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_REUSEADDR
, TRUE
, {1, 1, 4}, {0, 0xdead0001, 0}, TRUE
, TRUE
},
1208 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, TRUE
, {1, 1, 4}, {0, 0xdead0001, 0}, TRUE
, TRUE
},
1209 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_SNDBUF
, FALSE
, {1, 2, 4}, {0xdeadbe00, 0xdead0000}, TRUE
},
1210 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_SNDTIMEO
, FALSE
, {1, 2, 4}, {0}, TRUE
},
1211 {AF_INET
, SOCK_STREAM
, SOL_SOCKET
, SO_OPENTYPE
, FALSE
, {1, 2, 4}, {0}, TRUE
},
1212 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, TCP_NODELAY
, TRUE
, {1, 1, 1}, {0}, TRUE
},
1213 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_MULTICAST_LOOP
, TRUE
, {1, 1, 4}, {0}, TRUE
, TRUE
},
1214 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_MULTICAST_TTL
, TRUE
, {1, 1, 4}, {0}, FALSE
},
1215 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_PKTINFO
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1216 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_RECVTOS
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1217 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_RECVTTL
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1218 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_TOS
, TRUE
, {1, 1, 4}, {0}, FALSE
},
1219 {AF_INET
, SOCK_DGRAM
, IPPROTO_IP
, IP_TTL
, TRUE
, {1, 1, 4}, {0}, FALSE
},
1220 {AF_INET6
, SOCK_STREAM
, IPPROTO_IPV6
, IPV6_DONTFRAG
, TRUE
, {1, 1, 4}, {0}, TRUE
, TRUE
},
1221 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1222 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, TRUE
, {1, 1, 4}, {0}, FALSE
},
1223 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, TRUE
, {1, 1, 4}, {0}, TRUE
, TRUE
},
1224 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_PKTINFO
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1225 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, FALSE
, {0, 0, 4}, {0}, TRUE
, TRUE
},
1226 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, TRUE
, {1, 1, 4}, {0}, FALSE
},
1227 {AF_INET6
, SOCK_DGRAM
, IPPROTO_IPV6
, IPV6_V6ONLY
, TRUE
, {1, 1, 1}, {0}, TRUE
},
1229 SOCKET s
, s2
, src
, dst
;
1230 int i
, j
, err
, lasterr
;
1234 WSAPROTOCOL_INFOA infoA
;
1235 WSAPROTOCOL_INFOW infoW
;
1236 char providername
[WSAPROTOCOL_LEN
+ 1];
1237 DWORD expected_last_error
, expected_value
;
1238 int expected_err
, expected_size
;
1239 DWORD value
, save_value
;
1245 int family
, type
, proto
;
1247 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
1248 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
1249 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
1250 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
}
1258 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1259 ok(s
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1260 if( s
== INVALID_SOCKET
) return;
1262 timeout
= SOCKTIMEOUT1
;
1263 size
= sizeof(timeout
);
1264 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1266 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1267 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1268 ok( timeout
== SOCKTIMEOUT1
, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1271 size
= sizeof(timeout
);
1272 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1274 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1275 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1276 ok( timeout
== 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1279 timeout
= SOCKTIMEOUT2
; /* 997 seconds. See remark above */
1280 size
= sizeof(timeout
);
1281 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, size
);
1283 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, &size
);
1284 ok( !err
, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1285 ok( timeout
== SOCKTIMEOUT2
, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout
);
1289 size
= sizeof(value
);
1290 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, size
);
1291 ok( !err
, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1293 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, &size
);
1294 ok( !err
, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1295 ok( value
== 4096, "expected 4096, got %lu\n", value
);
1299 size
= sizeof(value
);
1300 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, size
);
1301 ok( !err
, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1303 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1304 ok( !err
, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1305 ok( value
== 4096, "expected 4096, got %lu\n", value
);
1308 size
= sizeof(value
);
1309 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, size
);
1310 ok( !err
, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1312 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1313 ok( !err
, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1314 ok( value
== 0, "expected 0, got %lu\n", value
);
1316 /* Test non-blocking receive with too short SO_RCVBUF. */
1317 tcp_socketpair(&src
, &dst
);
1318 set_blocking(src
, FALSE
);
1319 set_blocking(dst
, FALSE
);
1322 size
= sizeof(value
);
1323 err
= setsockopt(src
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, size
);
1324 ok( !err
, "got %d, error %u.\n", err
, WSAGetLastError() );
1327 err
= getsockopt(dst
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1328 ok( !err
, "got %d, error %u.\n", err
, WSAGetLastError() );
1329 if (value
>= sizeof(buffer
) * 3)
1332 size
= sizeof(value
);
1333 err
= setsockopt(dst
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, size
);
1334 ok( !err
, "got %d, error %u.\n", err
, WSAGetLastError() );
1336 err
= getsockopt(dst
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1337 ok( !err
, "got %d, error %u.\n", err
, WSAGetLastError() );
1338 ok( value
== 1024, "expected 0, got %lu\n", value
);
1340 err
= send(src
, buffer
, sizeof(buffer
), 0);
1341 ok(err
== sizeof(buffer
), "got %d\n", err
);
1342 err
= send(src
, buffer
, sizeof(buffer
), 0);
1343 ok(err
== sizeof(buffer
), "got %d\n", err
);
1344 err
= send(src
, buffer
, sizeof(buffer
), 0);
1345 ok(err
== sizeof(buffer
), "got %d\n", err
);
1347 err
= sync_recv(dst
, buffer
, sizeof(buffer
), 0);
1348 ok(err
== sizeof(buffer
), "got %d, error %u\n", err
, WSAGetLastError());
1349 err
= sync_recv(dst
, buffer
, sizeof(buffer
), 0);
1350 ok(err
== sizeof(buffer
), "got %d, error %u\n", err
, WSAGetLastError());
1351 err
= sync_recv(dst
, buffer
, sizeof(buffer
), 0);
1352 ok(err
== sizeof(buffer
), "got %d, error %u\n", err
, WSAGetLastError());
1356 skip("Default SO_RCVBUF %lu is too small, skipping test.\n", value
);
1363 for( i
= 0; i
< ARRAY_SIZE(linger_testvals
);i
++) {
1364 size
= sizeof(lingval
);
1365 lingval
= linger_testvals
[i
];
1366 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *)&lingval
, size
);
1367 ok(!err
, "Test %u: failed to set SO_LINGER, error %u\n", i
, WSAGetLastError());
1368 err
= getsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *)&lingval
, &size
);
1369 ok(!err
, "Test %u: failed to get SO_LINGER, error %u\n", i
, WSAGetLastError());
1370 ok(!lingval
.l_onoff
== !linger_testvals
[i
].l_onoff
, "Test %u: expected %d, got %d\n",
1371 i
, linger_testvals
[i
].l_onoff
, lingval
.l_onoff
);
1372 if (lingval
.l_onoff
)
1373 ok(lingval
.l_linger
== linger_testvals
[i
].l_linger
, "Test %u: expected %d, got %d\n",
1374 i
, linger_testvals
[i
].l_linger
, lingval
.l_linger
);
1377 size
= sizeof(lingval
);
1378 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, size
);
1379 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1380 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1381 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, 0);
1382 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1383 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1385 size
= sizeof(BOOL
);
1386 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, size
);
1387 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1388 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1389 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, 0);
1390 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1391 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1393 /* TCP_NODELAY: optlen doesn't matter on windows, it should work with any positive value */
1394 size
= sizeof(value
);
1397 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, 1);
1398 ok (!err
, "setsockopt TCP_NODELAY failed with optlen == 1\n");
1400 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1401 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1402 ok(value
== 1, "TCP_NODELAY should be 1\n");
1404 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, sizeof(value
));
1405 ok(!err
, "Failed to reset TCP_NODELAY to 0\n");
1408 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, 4);
1409 ok (!err
, "setsockopt TCP_NODELAY failed with optlen == 4\n");
1411 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1412 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1413 ok(value
== 1, "TCP_NODELAY should be 1\n");
1415 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, sizeof(value
));
1416 ok(!err
, "Failed to reset TCP_NODELAY to 0\n");
1419 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, 42);
1420 ok (!err
, "setsockopt TCP_NODELAY failed with optlen == 42\n");
1422 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1423 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1424 ok(value
== 1, "TCP_NODELAY should be 1\n");
1426 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, sizeof(value
));
1427 ok(!err
, "Failed to reset TCP_NODELAY to 0\n");
1430 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, 0);
1431 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1432 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1434 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1435 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1436 ok(!value
, "TCP_NODELAY should be 0\n");
1439 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, -1);
1440 /* On win 10 pro, this sets the error to WSAENOBUFS instead of WSAEFAULT */
1441 ok(err
== SOCKET_ERROR
&& (WSAGetLastError() == WSAEFAULT
|| WSAGetLastError() == WSAENOBUFS
),
1442 "got %d with %d (expected SOCKET_ERROR with either WSAEFAULT or WSAENOBUFS)\n", err
, WSAGetLastError());
1444 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1445 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1446 ok(!value
, "TCP_NODELAY should be 0\n");
1449 err
= setsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, 4);
1450 ok (!err
, "setsockopt TCP_NODELAY failed with optlen == 4 and optvalue = 0x100\n");
1452 err
= getsockopt(s
, IPPROTO_TCP
, TCP_NODELAY
, (char*)&value
, &size
);
1453 ok(!err
, "getsockopt TCP_NODELAY failed\n");
1454 ok(!value
, "TCP_NODELAY should be 0\n");
1456 /* Test for erroneously passing a value instead of a pointer as optval */
1457 size
= sizeof(char);
1458 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTROUTE
, (char *)1, size
);
1459 ok(err
== SOCKET_ERROR
, "setsockopt with optval being a value passed "
1460 "instead of failing.\n");
1461 lasterr
= WSAGetLastError();
1462 ok(lasterr
== WSAEFAULT
, "setsockopt with optval being a value "
1463 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1464 lasterr
, WSAEFAULT
);
1466 /* SO_RCVTIMEO with invalid values for level */
1467 size
= sizeof(timeout
);
1468 timeout
= SOCKTIMEOUT1
;
1469 SetLastError(0xdeadbeef);
1470 err
= setsockopt(s
, 0xffffffff, SO_RCVTIMEO
, (char *) &timeout
, size
);
1471 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1472 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1473 err
, WSAGetLastError());
1475 timeout
= SOCKTIMEOUT1
;
1476 SetLastError(0xdeadbeef);
1477 err
= setsockopt(s
, 0x00008000, SO_RCVTIMEO
, (char *) &timeout
, size
);
1478 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1479 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1480 err
, WSAGetLastError());
1482 /* Test SO_ERROR set/get */
1483 SetLastError(0xdeadbeef);
1485 err
= setsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, size
);
1486 ok( !err
&& !WSAGetLastError(),
1487 "got %d with %d (expected 0 with 0)\n",
1488 err
, WSAGetLastError());
1490 SetLastError(0xdeadbeef);
1492 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1493 ok( !err
&& !WSAGetLastError(),
1494 "got %d with %d (expected 0 with 0)\n",
1495 err
, WSAGetLastError());
1497 ok (i
== 1234, "got %d (expected 1234)\n", i
);
1499 /* Test invalid optlen */
1500 SetLastError(0xdeadbeef);
1502 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1503 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEFAULT
),
1504 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1505 err
, WSAGetLastError());
1509 /* Test option length. */
1510 for (i
= 0; i
< ARRAY_SIZE(test_optsize
); ++i
)
1512 winetest_push_context("i %u, level %d, optname %d",
1513 i
, test_optsize
[i
].level
, test_optsize
[i
].optname
);
1515 s2
= socket( test_optsize
[i
].af
, test_optsize
[i
].type
, 0 );
1516 ok(s2
!= INVALID_SOCKET
, "socket() failed error %d\n", WSAGetLastError());
1518 size
= sizeof(save_value
);
1519 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&save_value
, &size
);
1520 ok(!err
, "Unexpected getsockopt result %d.\n", err
);
1522 value64
= 0xffffffff00000001;
1523 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char *)&value64
, sizeof(value64
));
1524 ok(!err
, "Unexpected setsockopt result %d.\n", err
);
1525 ok(!WSAGetLastError(), "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1527 size
= sizeof(value64
);
1528 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value64
, &size
);
1529 ok(!err
, "Unexpected getsockopt result %d.\n", err
);
1530 ok(size
== test_optsize
[i
].sizes
[2], "Got unexpected size %d.\n", size
);
1531 /* The behaviour regarding filling the high dword is different between options without the obvious
1532 * pattern, it is either left untouched (more often) or zeroed. Wine doesn't touch the high dword. */
1534 if (test_optsize
[i
].sizes
[2] == 1 || test_optsize
[i
].level
!= SOL_SOCKET
)
1537 expected_last_error
= WSAENOBUFS
;
1542 expected_last_error
= 0;
1546 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char *)&value
, -1);
1547 ok(err
== expected_err
, "Unexpected setsockopt result %d.\n", err
);
1548 /* Broken between Win7 and Win10 21H1. */
1549 ok(WSAGetLastError() == expected_last_error
|| broken(expected_last_error
&& WSAGetLastError() == WSAEFAULT
),
1550 "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1554 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, &size
);
1555 if (test_optsize
[i
].optname
== SO_OPENTYPE
)
1557 ok(!err
, "Unexpected getsockopt result %d.\n", err
);
1558 ok(!WSAGetLastError(), "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1562 ok(err
== -1, "Unexpected getsockopt result %d.\n", err
);
1563 ok(WSAGetLastError() == WSAEFAULT
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1565 ok(size
== (test_optsize
[i
].optname
== SO_OPENTYPE
? 4 : -1), "Got unexpected size %d.\n", size
);
1567 if (test_optsize
[i
].level
== SOL_SOCKET
&& test_optsize
[i
].bool_value
)
1570 expected_last_error
= 0;
1575 expected_last_error
= WSAEFAULT
;
1578 SetLastError(0xdeadbeef);
1579 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, 0);
1580 ok(err
== expected_err
, "Unexpected setsockopt result %d.\n", err
);
1581 ok(WSAGetLastError() == expected_last_error
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1584 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, &size
);
1585 ok(err
== -1, "Unexpected getsockopt result %d.\n", err
);
1586 ok(WSAGetLastError() == WSAEFAULT
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1588 expected_size
= test_optsize
[i
].sizes
[2];
1589 if (expected_size
== 1)
1590 expected_value
= 0xdeadbe00;
1592 expected_value
= test_optsize
[i
].bool_value
? 0x1 : 0x100;
1593 if (test_optsize
[i
].accepts_large_value
)
1596 expected_last_error
= 0;
1601 expected_last_error
= WSAEINVAL
;
1605 SetLastError(0xdeadbeef);
1606 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, 4);
1607 ok(err
== expected_err
, "Unexpected setsockopt result %d.\n", err
);
1608 ok(WSAGetLastError() == expected_last_error
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1610 if (test_optsize
[i
].accepts_large_value
)
1613 SetLastError(0xdeadbeef);
1615 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, &size
);
1616 ok(err
== expected_err
, "Unexpected getsockopt result %d.\n", err
);
1617 ok(WSAGetLastError() == expected_last_error
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1618 todo_wine_if(test_optsize
[i
].optname
== SO_DONTROUTE
|| test_optsize
[i
].optname
== SO_LINGER
)
1619 ok(value
== expected_value
, "Got unexpected value %#lx, expected %#lx.\n", value
, expected_value
);
1620 ok(size
== expected_size
, "Got unexpected size %u, expected %u.\n", size
, expected_size
);
1623 winetest_pop_context();
1625 for (j
= 0; j
< ARRAY_SIZE(test_optsize
[i
].sizes
); ++j
)
1628 winetest_push_context("i %u, level %d, optname %d, len %u",
1629 i
, test_optsize
[i
].level
, test_optsize
[i
].optname
, size
);
1632 if (test_optsize
[i
].values
[j
])
1633 expected_value
= test_optsize
[i
].values
[j
];
1635 expected_value
= 0xdeadbeef;
1637 if (test_optsize
[i
].accepts_short_len
|| size
== 4)
1640 expected_last_error
= 0;
1641 expected_size
= test_optsize
[i
].sizes
[j
];
1643 if (!test_optsize
[i
].values
[j
])
1644 memcpy(&expected_value
, &value
, expected_size
);
1649 expected_last_error
= WSAEFAULT
;
1650 expected_size
= test_optsize
[i
].sizes
[j
];
1653 SetLastError(0xdeadbeef);
1654 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, size
);
1655 ok(err
== expected_err
, "Unexpected setsockopt result %d.\n", err
);
1656 ok(WSAGetLastError() == expected_last_error
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1659 SetLastError(0xdeadbeef);
1660 err
= getsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
, (char*)&value
, &size
);
1661 ok(err
== expected_err
, "Unexpected getsockopt result %d.\n", err
);
1662 ok(WSAGetLastError() == expected_last_error
, "Unexpected WSAGetLastError() %u.\n", WSAGetLastError());
1663 ok(value
== expected_value
, "Got unexpected value %#lx, expected %#lx.\n", value
, expected_value
);
1664 ok(size
== expected_size
, "Got unexpected size %d, expected %d.\n", size
, expected_size
);
1666 winetest_pop_context();
1669 err
= setsockopt(s2
, test_optsize
[i
].level
, test_optsize
[i
].optname
,
1670 (char*)&save_value
, sizeof(save_value
));
1671 ok(!err
, "Unexpected getsockopt result %d.\n", err
);
1675 /* Test with the closed socket */
1676 SetLastError(0xdeadbeef);
1679 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1680 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOTSOCK
),
1681 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1682 err
, WSAGetLastError());
1683 ok (i
== 1234, "expected 1234, got %d\n", i
);
1685 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1686 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
1687 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1690 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &i
, size
);
1693 for (i
= 0; i
< 4; i
++)
1696 const int tests
[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1697 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &tests
[i
], i
+ 1);
1698 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1699 err
= getsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &k
, &size
);
1700 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1701 j
= i
!= 3 ? tests
[i
] & ((1 << (i
+ 1) * 8) - 1) : tests
[i
];
1702 ok(k
== j
, "Test [%d] Expected 0x%x, got 0x%x\n", i
, j
, k
);
1706 win_skip("IP_MULTICAST_TTL is unsupported\n");
1709 /* test SO_PROTOCOL_INFOA invalid parameters */
1710 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1711 "getsockopt should have failed\n");
1712 err
= WSAGetLastError();
1713 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1714 size
= sizeof(WSAPROTOCOL_INFOA
);
1715 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1716 "getsockopt should have failed\n");
1717 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1718 err
= WSAGetLastError();
1719 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1720 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1721 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1722 "getsockopt should have failed\n");
1723 err
= WSAGetLastError();
1724 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1725 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, NULL
),
1726 "getsockopt should have failed\n");
1727 err
= WSAGetLastError();
1728 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1729 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, &size
),
1730 "getsockopt should have failed\n");
1731 err
= WSAGetLastError();
1732 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1733 size
= sizeof(WSAPROTOCOL_INFOA
) / 2;
1734 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1735 "getsockopt should have failed\n");
1736 err
= WSAGetLastError();
1737 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1738 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1739 size
= sizeof(WSAPROTOCOL_INFOA
) * 2;
1740 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1741 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1742 ok(size
== sizeof(WSAPROTOCOL_INFOA
) * 2, "got size %d\n", size
);
1746 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1747 for (i
= 0; i
< ARRAY_SIZE(prottest
); i
++)
1751 s
= socket(prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1752 if (s
== INVALID_SOCKET
&& prottest
[i
].family
== AF_INET6
) continue;
1754 ok(s
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
1757 /* compare both A and W version */
1758 infoA
.szProtocol
[0] = 0;
1759 size
= sizeof(WSAPROTOCOL_INFOA
);
1760 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1761 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1762 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1764 infoW
.szProtocol
[0] = 0;
1765 size
= sizeof(WSAPROTOCOL_INFOW
);
1766 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOW
, (char *) &infoW
, &size
);
1767 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1768 ok(size
== sizeof(WSAPROTOCOL_INFOW
), "got size %d\n", size
);
1770 ok(infoA
.szProtocol
[0], "WSAPROTOCOL_INFOA was not filled\n");
1771 ok(infoW
.szProtocol
[0], "WSAPROTOCOL_INFOW was not filled\n");
1773 WideCharToMultiByte(CP_ACP
, 0, infoW
.szProtocol
, -1,
1774 providername
, sizeof(providername
), NULL
, NULL
);
1775 ok(!strcmp(infoA
.szProtocol
,providername
),
1776 "different provider names '%s' != '%s'\n", infoA
.szProtocol
, providername
);
1778 ok(!memcmp(&infoA
, &infoW
, FIELD_OFFSET(WSAPROTOCOL_INFOA
, szProtocol
)),
1779 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1781 /* Remove IF when WSAEnumProtocols support IPV6 data */
1782 ok(infoA
.iAddressFamily
== prottest
[i
].family
, "socket family invalid, expected %d received %d\n",
1783 prottest
[i
].family
, infoA
.iAddressFamily
);
1784 ok(infoA
.iSocketType
== prottest
[i
].type
, "socket type invalid, expected %d received %d\n",
1785 prottest
[i
].type
, infoA
.iSocketType
);
1786 ok(infoA
.iProtocol
== prottest
[i
].proto
, "socket protocol invalid, expected %d received %d\n",
1787 prottest
[i
].proto
, infoA
.iProtocol
);
1789 /* IP_HDRINCL is supported only on SOCK_RAW but passed to SOCK_DGRAM by Impossible Creatures */
1792 SetLastError(0xdeadbeef);
1793 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1794 if (err
== -1) /* >= Vista */
1796 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %ld\n", GetLastError());
1798 SetLastError(0xdeadbeef);
1799 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1800 ok(err
== -1, "Expected -1, got %d\n", err
);
1801 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %ld\n", GetLastError());
1802 ok(k
== 99, "Expected 99, got %d\n", k
);
1806 SetLastError(0xdeadbeef);
1807 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1808 ok(err
== -1, "Expected -1, got %d\n", err
);
1809 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %ld\n", GetLastError());
1811 SetLastError(0xdeadbeef);
1812 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1813 ok(err
== -1, "Expected -1, got %d\n", err
);
1814 ok(GetLastError() == WSAEINVAL
, "Expected 10022, got %ld\n", GetLastError());
1815 ok(k
== 99, "Expected 99, got %d\n", k
);
1817 else /* <= 2003 the tests differ between TCP and UDP, UDP silently accepts */
1819 SetLastError(0xdeadbeef);
1821 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1822 if (prottest
[i
].type
== SOCK_DGRAM
)
1824 ok(err
== 0, "Expected 0, got %d\n", err
);
1825 ok(k
== 1, "Expected 1, got %d\n", k
);
1829 /* contratry to what we could expect the function returns error but k is changed */
1830 ok(err
== -1, "Expected -1, got %d\n", err
);
1831 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %ld\n", GetLastError());
1832 ok(k
== 0, "Expected 0, got %d\n", k
);
1836 err
= setsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, size
);
1837 ok(err
== 0, "Expected 0, got %d\n", err
);
1840 err
= getsockopt(s
, IPPROTO_IP
, IP_HDRINCL
, (char *) &k
, &size
);
1841 if (prottest
[i
].type
== SOCK_DGRAM
)
1843 ok(err
== 0, "Expected 0, got %d\n", err
);
1844 ok(k
== 0, "Expected 0, got %d\n", k
);
1848 /* contratry to what we could expect the function returns error but k is changed */
1849 ok(err
== -1, "Expected -1, got %d\n", err
);
1850 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %ld\n", GetLastError());
1851 ok(k
== 0, "Expected 0, got %d\n", k
);
1858 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1859 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1860 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1861 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1862 ok(s2
!= INVALID_SOCKET
, "Failed to create socket\n");
1864 SetLastError(0xdeadbeef);
1865 size
= sizeof(csinfoA
);
1866 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1869 struct sockaddr_in saddr
;
1870 memset(&saddr
, 0, sizeof(saddr
));
1871 saddr
.sin_family
= AF_INET
;
1872 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1874 /* Socket is not bound, no information provided */
1875 ok(!csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1876 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1877 /* Socket is not connected, no information provided */
1878 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1879 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.RemoteAddr
.lpSockaddr
);
1881 err
= bind(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1882 ok(!err
, "Expected 0, got %d\n", err
);
1883 size
= sizeof(csinfoA
);
1884 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1885 ok(!err
, "Expected 0, got %d\n", err
);
1887 /* Socket is bound */
1888 ok(csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected non-zero\n");
1889 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
!= NULL
, "Expected non-null\n");
1890 /* Socket is not connected, no information provided */
1891 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1892 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.RemoteAddr
.lpSockaddr
);
1894 err
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1895 ok(!err
, "Expected 0, got %d\n", err
);
1896 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1897 ok(!err
, "Expected 0, got %d\n", err
);
1898 err
= listen(s2
, 1);
1899 ok(!err
, "Expected 0, got %d\n", err
);
1900 err
= connect(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1901 ok(!err
, "Expected 0, got %d\n", err
);
1902 size
= sizeof(saddr
);
1903 err
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1904 ok(err
!= INVALID_SOCKET
, "Failed to accept socket\n");
1908 size
= sizeof(csinfoA
);
1909 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1910 ok(!err
, "Expected 0, got %d\n", err
);
1911 err
= getsockopt(s2
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoB
, &size
);
1912 ok(!err
, "Expected 0, got %d\n", err
);
1913 ok(size
== sizeof(csinfoA
), "Got %d\n", size
);
1914 size
= sizeof(saddr
);
1915 ok(size
== csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1916 csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1917 ok(size
== csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1918 csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1919 ok(!memcmp(csinfoA
.cs
.LocalAddr
.lpSockaddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
),
1920 "Expected matching addresses\n");
1921 ok(!memcmp(csinfoB
.cs
.LocalAddr
.lpSockaddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
),
1922 "Expected matching addresses\n");
1923 ok(csinfoA
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1924 ok(csinfoB
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1925 ok(csinfoA
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1926 ok(csinfoB
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1928 err
= getpeername(s
, (struct sockaddr
*)&saddr
, &size
);
1929 ok(!err
, "Expected 0, got %d\n", err
);
1930 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1931 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1932 err
= getpeername(s2
, (struct sockaddr
*)&saddr
, &size
);
1933 ok(!err
, "Expected 0, got %d\n", err
);
1934 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1935 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1936 err
= getsockname(s
, (struct sockaddr
*)&saddr
, &size
);
1937 ok(!err
, "Expected 0, got %d\n", err
);
1938 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1939 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1940 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1941 ok(!err
, "Expected 0, got %d\n", err
);
1942 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1943 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1945 SetLastError(0xdeadbeef);
1946 size
= sizeof(CSADDR_INFO
);
1947 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1948 ok(err
, "Expected non-zero\n");
1949 ok(size
== sizeof(CSADDR_INFO
), "Got %d\n", size
);
1950 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %ld\n", GetLastError());
1952 /* At least for IPv4 the size is exactly 56 bytes */
1953 size
= sizeof(*csinfoA
.cs
.LocalAddr
.lpSockaddr
) * 2 + sizeof(csinfoA
.cs
);
1954 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1955 ok(!err
, "Expected 0, got %d\n", err
);
1957 SetLastError(0xdeadbeef);
1958 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1959 ok(err
, "Expected non-zero\n");
1960 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %ld\n", GetLastError());
1963 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %ld\n", GetLastError());
1968 for (i
= 0; i
< 2; i
++)
1975 level
= IPPROTO_IPV6
;
1983 s
= socket(family
, SOCK_DGRAM
, 0);
1984 if (s
== INVALID_SOCKET
&& i
)
1986 skip("IPv6 is not supported\n");
1989 ok(s
!= INVALID_SOCKET
, "socket failed with error %ld\n", GetLastError());
1991 size
= sizeof(value
);
1993 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
1994 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
1995 ok(value
== 0, "Expected 0, got %ld\n", value
);
1997 size
= sizeof(value
);
1999 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
2000 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2003 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2004 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2005 ok(value
== 1, "Expected 1, got %ld\n", value
);
2007 size
= sizeof(value
);
2009 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
2010 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2012 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2013 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2014 ok(value
== 1, "Expected 1, got %ld\n", value
);
2018 s
= socket(family
, SOCK_STREAM
, 0);
2019 ok(s
!= INVALID_SOCKET
, "socket failed with error %ld\n", GetLastError());
2021 size
= sizeof(value
);
2023 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2024 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2025 ok(value
== 1 || broken(value
== 0) /* < vista */, "Expected 1, got %ld\n", value
);
2027 size
= sizeof(value
);
2029 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
2030 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2033 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2034 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2035 ok(value
== 0, "Expected 0, got %ld\n", value
);
2039 s
= socket(family
, SOCK_RAW
, 0);
2040 if (s
== INVALID_SOCKET
)
2042 if (WSAGetLastError() == WSAEACCES
) skip("SOCK_RAW is not available\n");
2043 else if (i
) skip("IPv6 is not supported\n");
2046 ok(s
!= INVALID_SOCKET
, "socket failed with error %ld\n", GetLastError());
2048 size
= sizeof(value
);
2050 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2051 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2052 ok(value
== 0, "Expected 0, got %ld\n", value
);
2054 size
= sizeof(value
);
2056 err
= setsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, size
);
2057 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2060 err
= getsockopt(s
, level
, IP_DONTFRAGMENT
, (char *) &value
, &size
);
2061 ok(!err
, "Expected 0, got %d with error %ld\n", err
, GetLastError());
2062 ok(value
== 1, "Expected 1, got %ld\n", value
);
2068 static void test_reuseaddr(void)
2070 static struct sockaddr_in6 saddr_in6_any
, saddr_in6_loopback
;
2071 static struct sockaddr_in6 saddr_in6_any_v4mapped
, saddr_in6_loopback_v4mapped
;
2072 static struct sockaddr_in saddr_in_any
, saddr_in_loopback
;
2077 struct sockaddr
*addr_any
;
2078 struct sockaddr
*addr_loopback
;
2083 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_any
) },
2084 { AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, (struct sockaddr
*)&saddr_in6_loopback
, sizeof(saddr_in6_any
) },
2091 struct sockaddr
*addr
;
2101 {{ AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, },
2102 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, }},
2106 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, sizeof(saddr_in6_any
), TRUE
, },
2107 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, }},
2111 {{ AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, },
2112 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, }},
2116 {{ AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, },
2117 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, }},
2121 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, },
2122 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, }},
2126 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, },
2127 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, }},
2131 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, },
2132 { AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, sizeof(saddr_in6_any
), TRUE
, }},
2136 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback
, sizeof(saddr_in6_loopback
), FALSE
, },
2137 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, }},
2141 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback
, sizeof(saddr_in6_loopback
), TRUE
, },
2142 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, }},
2146 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback_v4mapped
, sizeof(saddr_in6_loopback_v4mapped
), FALSE
, },
2147 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, }},
2151 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, sizeof(saddr_in6_any
), TRUE
, },
2152 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, }},
2156 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, sizeof(saddr_in6_any
), FALSE
, },
2157 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, }},
2161 {{ AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, },
2162 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), TRUE
, }},
2166 {{ AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, },
2167 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, }},
2171 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_any
, sizeof(saddr_in6_any
), FALSE
, },
2172 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, }},
2176 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_any_v4mapped
, sizeof(saddr_in6_any_v4mapped
), FALSE
, },
2177 { AF_INET
, (struct sockaddr
*)&saddr_in_any
, sizeof(saddr_in_any
), FALSE
, }},
2181 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback_v4mapped
, sizeof(saddr_in6_loopback_v4mapped
), FALSE
, },
2182 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, }},
2186 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, },
2187 { AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback_v4mapped
, sizeof(saddr_in6_loopback_v4mapped
), FALSE
, }},
2191 {{ AF_INET6
, (struct sockaddr
*)&saddr_in6_loopback
, sizeof(saddr_in6_loopback
), TRUE
, },
2192 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, }},
2196 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, },
2197 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, }},
2201 {{ AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), FALSE
, },
2202 { AF_INET
, (struct sockaddr
*)&saddr_in_loopback
, sizeof(saddr_in_loopback
), TRUE
, }},
2207 unsigned int rc
, reuse
, value
;
2208 struct sockaddr_storage saddr
;
2209 SOCKET s1
, s2
, s3
, s4
;
2213 saddr_in_any
.sin_family
= AF_INET
;
2214 saddr_in_any
.sin_port
= htons(SERVERPORT
+ 1);
2215 saddr_in_any
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
2216 saddr_in_loopback
= saddr_in_any
;
2217 saddr_in_loopback
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
2219 saddr_in6_any
.sin6_family
= AF_INET6
;
2220 saddr_in6_any
.sin6_port
= htons(SERVERPORT
+ 1);
2221 memset( &saddr_in6_any
.sin6_addr
, 0, sizeof(saddr_in6_any
.sin6_addr
) );
2222 saddr_in6_loopback
= saddr_in6_any
;
2223 inet_pton(AF_INET6
, "::1", &saddr_in6_loopback
.sin6_addr
);
2225 saddr_in6_loopback_v4mapped
= saddr_in6_any
;
2226 rc
= inet_pton(AF_INET6
, "::ffff:127.0.0.1", &saddr_in6_loopback_v4mapped
.sin6_addr
);
2227 ok(rc
, "got error %d.\n", WSAGetLastError());
2229 saddr_in6_any_v4mapped
= saddr_in6_any
;
2230 rc
= inet_pton(AF_INET6
, "::ffff:0.0.0.0", &saddr_in6_any_v4mapped
.sin6_addr
);
2231 ok(rc
, "got error %d.\n", WSAGetLastError());
2233 for (i
= 0; i
< ARRAY_SIZE(tests
); ++i
)
2235 winetest_push_context("test %u", i
);
2237 /* Test with SO_REUSEADDR on second socket only. */
2238 s1
=socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2239 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2241 rc
= bind(s1
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2242 ok(!rc
|| (tests
[i
].domain
== AF_INET6
&& WSAGetLastError() == WSAEADDRNOTAVAIL
), "got error %d.\n", WSAGetLastError());
2243 if (tests
[i
].domain
== AF_INET6
&& WSAGetLastError() == WSAEADDRNOTAVAIL
)
2245 skip("IPv6 not supported, skipping test\n");
2247 winetest_pop_context();
2251 s2
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2252 ok(s2
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2255 rc
= setsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
2256 ok(!rc
, "got error %d.\n", WSAGetLastError());
2258 rc
= bind(s2
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2259 ok(rc
== SOCKET_ERROR
, "got rc %d.\n", rc
);
2260 ok(WSAGetLastError() == WSAEACCES
, "got error %d.\n", WSAGetLastError());
2265 /* Test with SO_REUSEADDR on both sockets. */
2266 s1
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2267 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2270 rc
= setsockopt(s1
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
2271 ok(!rc
, "got error %d.\n", WSAGetLastError());
2273 rc
= bind(s1
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2274 ok(!rc
, "got error %d.\n", WSAGetLastError());
2276 s2
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2277 ok(s2
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2280 size
= sizeof(reuse
);
2281 rc
= getsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, &size
);
2282 ok(!rc
&& !reuse
,"got rc %d, reuse %d.\n", rc
, reuse
);
2284 rc
= bind(s2
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2285 ok(rc
== SOCKET_ERROR
, "got rc %d, error %d.\n", rc
, WSAGetLastError());
2288 rc
= setsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
2289 ok(!rc
, "got error %d.\n", WSAGetLastError());
2291 rc
= bind(s2
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2292 ok(!rc
, "got error %d.\n", WSAGetLastError());
2294 s3
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2295 ok(s3
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2297 /* Test if we can really connect to one of them. */
2299 ok(!rc
, "got error %d.\n", WSAGetLastError());
2301 todo_wine
ok(!rc
, "got error %d.\n", WSAGetLastError());
2302 rc
= connect(s3
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2303 ok(!rc
, "got error %d.\n", WSAGetLastError());
2305 /* The connection is delivered to the first socket. */
2306 size
= tests
[i
].addrlen
;
2307 s4
= accept(s1
, (struct sockaddr
*)&saddr
, &size
);
2308 ok(s4
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2315 /* Test binding and listening on any addr together with loopback, any addr first. */
2316 s1
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2317 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2319 rc
= bind(s1
, tests
[i
].addr_any
, tests
[i
].addrlen
);
2320 ok(!rc
, "got error %d.\n", WSAGetLastError());
2323 ok(!rc
, "got error %d.\n", WSAGetLastError());
2325 s2
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2326 ok(s2
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2328 rc
= bind(s2
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2329 todo_wine
ok(!rc
, "got error %d.\n", WSAGetLastError());
2332 todo_wine
ok(!rc
, "got error %d.\n", WSAGetLastError());
2334 s3
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2335 ok(s3
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2337 rc
= connect(s3
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2338 ok(!rc
, "got error %d.\n", WSAGetLastError());
2340 size
= tests
[i
].addrlen
;
2341 s4
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
2342 todo_wine
ok(s4
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2349 /* Test binding and listening on any addr together with loopback, loopback addr first. */
2351 s1
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2352 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2354 rc
= bind(s1
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2355 ok(!rc
, "got error %d.\n", WSAGetLastError());
2358 ok(!rc
, "got error %d.\n", WSAGetLastError());
2360 s2
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2361 ok(s2
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2363 rc
= bind(s2
, tests
[i
].addr_any
, tests
[i
].addrlen
);
2364 todo_wine
ok(!rc
, "got rc %d, error %d.\n", rc
, WSAGetLastError());
2367 todo_wine
ok(!rc
, "got error %d.\n", WSAGetLastError());
2369 s3
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2370 ok(s3
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2372 rc
= connect(s3
, tests
[i
].addr_loopback
, tests
[i
].addrlen
);
2373 ok(!rc
, "got error %d.\n", WSAGetLastError());
2374 size
= tests
[i
].addrlen
;
2375 s4
= accept(s1
, (struct sockaddr
*)&saddr
, &size
);
2377 ok(s4
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2384 /* Test binding to INADDR_ANY on two sockets. */
2385 s1
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2386 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2388 rc
= bind(s1
, tests
[i
].addr_any
, tests
[i
].addrlen
);
2389 ok(!rc
, "got error %d.\n", WSAGetLastError());
2391 s2
= socket(tests
[i
].domain
, SOCK_STREAM
, 0);
2392 ok(s2
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2394 rc
= bind(s2
, tests
[i
].addr_any
, tests
[i
].addrlen
);
2395 ok(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAEADDRINUSE
, "got rc %d, error %d.\n", rc
, WSAGetLastError());
2400 winetest_pop_context();
2403 /* SO_REUSEADDR and SO_EXCLUSIVEADDRUSE are mutually exclusive. */
2404 s1
= socket(AF_INET
, SOCK_STREAM
, 0);
2405 ok(s1
!= INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2408 rc
= setsockopt(s1
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&value
, sizeof(value
));
2409 ok(!rc
, "got error %d.\n", WSAGetLastError());
2412 rc
= setsockopt(s1
, SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, (char*)&value
, sizeof(value
));
2413 ok(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
, "got rc %d, error %d.\n", rc
, WSAGetLastError());
2416 rc
= setsockopt(s1
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&value
, sizeof(value
));
2419 rc
= setsockopt(s1
, SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, (char*)&value
, sizeof(value
));
2420 ok(!rc
, "got error %d.\n", WSAGetLastError());
2423 rc
= setsockopt(s1
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&value
, sizeof(value
));
2424 ok(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
, "got rc %d, error %d.\n", rc
, WSAGetLastError());
2428 /* Test SO_EXCLUSIVEADDRUSE. */
2429 for (i
= 0; i
< ARRAY_SIZE(tests_exclusive
); ++i
)
2433 winetest_push_context("test %u", i
);
2435 for (j
= 0; j
< 2; ++j
)
2437 s
[j
] = socket(tests_exclusive
[i
].s
[j
].domain
, SOCK_STREAM
, 0);
2438 ok(s
[j
] != INVALID_SOCKET
, "got error %d.\n", WSAGetLastError());
2440 if (tests_exclusive
[i
].s
[j
].exclusive
)
2443 rc
= setsockopt(s
[j
], SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, (char*)&value
, sizeof(value
));
2444 ok(!rc
, "got error %d.\n", WSAGetLastError());
2446 if (tests_exclusive
[i
].s
[j
].domain
== AF_INET6
)
2449 rc
= setsockopt(s
[j
], IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&value
, sizeof(value
));
2450 ok(!rc
, "got error %d.\n", WSAGetLastError());
2453 rc
= bind(s
[0], tests_exclusive
[i
].s
[0].addr
, tests_exclusive
[i
].s
[0].addrlen
);
2454 ok(!rc
|| (tests_exclusive
[i
].s
[0].domain
== AF_INET6
&& WSAGetLastError() == WSAEADDRNOTAVAIL
), "got error %d.\n", WSAGetLastError());
2456 rc
= bind(s
[1], tests_exclusive
[i
].s
[1].addr
, tests_exclusive
[i
].s
[1].addrlen
);
2458 if (tests_exclusive
[i
].error
)
2459 ok(rc
== SOCKET_ERROR
&& WSAGetLastError() == tests_exclusive
[i
].error
,
2460 "got rc %d, error %d, expected error %d.\n", rc
, WSAGetLastError(), tests_exclusive
[i
].error
);
2462 ok(!rc
, "got error %d.\n", WSAGetLastError());
2466 winetest_pop_context();
2470 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
2472 static unsigned int got_ip_pktinfo_apc
;
2474 static void WINAPI
ip_pktinfo_apc(DWORD error
, DWORD size
, OVERLAPPED
*overlapped
, DWORD flags
)
2476 ok(error
== WSAEMSGSIZE
, "got error %lu\n", error
);
2477 ok(size
== 6, "got size %lu\n", size
);
2478 ok(!flags
, "got flags %#lx\n", flags
);
2479 ++got_ip_pktinfo_apc
;
2482 static void test_ip_pktinfo(void)
2484 ULONG addresses
[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY
)};
2485 char recvbuf
[10], pktbuf
[512], msg
[] = "HELLO";
2486 struct sockaddr_in s1addr
, s2addr
, s3addr
;
2487 LPFN_WSARECVMSG pWSARecvMsg
= NULL
;
2488 unsigned int rc
, yes
= 1;
2490 DWORD dwBytes
, dwSize
, dwFlags
;
2499 memset(&ov
, 0, sizeof(ov
));
2500 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
2502 memset(&hdr
, 0x00, sizeof(hdr
));
2503 s1addr
.sin_family
= AF_INET
;
2504 s1addr
.sin_port
= htons(0);
2505 /* Note: s1addr.sin_addr is set below */
2506 iovec
[0].buf
= recvbuf
;
2507 iovec
[0].len
= sizeof(recvbuf
);
2508 hdr
.name
= (struct sockaddr
*)&s3addr
;
2509 hdr
.namelen
= sizeof(s3addr
);
2510 hdr
.lpBuffers
= &iovec
[0];
2511 hdr
.dwBufferCount
= 1;
2512 hdr
.Control
.buf
= pktbuf
;
2513 /* Note: hdr.Control.len is set below */
2516 for (i
=0;i
<ARRAY_SIZE(addresses
);i
++)
2518 s1addr
.sin_addr
.s_addr
= addresses
[i
];
2520 /* Build "server" side socket */
2521 s1
=socket(AF_INET
, SOCK_DGRAM
, 0);
2522 ok(s1
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2524 /* Obtain the WSARecvMsg function */
2525 rc
= WSAIoctl(s1
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
2526 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &dwBytes
, NULL
, NULL
);
2527 ok(!rc
, "failed to get WSARecvMsg, error %u\n", WSAGetLastError());
2529 /* Setup the server side socket */
2530 rc
=bind(s1
, (struct sockaddr
*)&s1addr
, sizeof(s1addr
));
2531 ok(rc
!= SOCKET_ERROR
, "bind() failed error: %d\n", WSAGetLastError());
2533 /* Build "client" side socket */
2534 addrlen
= sizeof(s2addr
);
2535 rc
= getsockname(s1
, (struct sockaddr
*) &s2addr
, &addrlen
);
2536 ok(!rc
, "failed to get address, error %u\n", WSAGetLastError());
2537 s2addr
.sin_addr
.s_addr
= addresses
[0]; /* Always target the local adapter address */
2538 s2
=socket(AF_INET
, SOCK_DGRAM
, 0);
2539 ok(s2
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2541 /* Test an empty message header */
2542 rc
=pWSARecvMsg(s1
, NULL
, NULL
, NULL
, NULL
);
2543 err
=WSAGetLastError();
2544 ok(rc
== SOCKET_ERROR
&& err
== WSAEFAULT
, "WSARecvMsg() failed error: %d (ret = %d)\n", err
, rc
);
2546 /* Test that when no control data arrives, a 0-length NULL-valued control buffer should succeed */
2547 SetLastError(0xdeadbeef);
2548 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
2549 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
2550 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
2551 hdr
.Control
.buf
= NULL
;
2552 hdr
.Control
.len
= 0;
2553 rc
=pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
2554 ok(rc
== 0, "WSARecvMsg() failed error: %d\n", WSAGetLastError());
2555 hdr
.Control
.buf
= pktbuf
;
2557 /* Now start IP_PKTINFO for future tests */
2558 rc
=setsockopt(s1
, IPPROTO_IP
, IP_PKTINFO
, (const char*)&yes
, sizeof(yes
));
2559 ok(rc
== 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
2562 * Send a packet from the client to the server and test for specifying
2563 * a short control header.
2565 SetLastError(0xdeadbeef);
2566 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
2567 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
2568 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
2569 hdr
.Control
.len
= 1;
2570 dwSize
= 0xdeadbeef;
2571 rc
= pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
2572 ok(rc
== -1, "expected failure\n");
2573 ok(WSAGetLastError() == WSAEMSGSIZE
, "got error %u\n", WSAGetLastError());
2574 todo_wine
ok(dwSize
== sizeof(msg
), "got size %lu\n", dwSize
);
2575 ok(hdr
.dwFlags
== MSG_CTRUNC
, "got flags %#lx\n", hdr
.dwFlags
);
2576 hdr
.dwFlags
= 0; /* Reset flags */
2578 /* Perform another short control header test, this time with an overlapped receive */
2579 hdr
.Control
.len
= 1;
2580 ov
.Internal
= 0xdead1;
2581 ov
.InternalHigh
= 0xdead2;
2582 ov
.Offset
= 0xdead3;
2583 ov
.OffsetHigh
= 0xdead4;
2584 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
2585 err
=WSAGetLastError();
2586 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
2587 SetLastError(0xdeadbeef);
2588 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
2589 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
2590 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
2591 ok(!WaitForSingleObject(ov
.hEvent
, 100), "wait failed\n");
2592 ok((NTSTATUS
)ov
.Internal
== STATUS_BUFFER_OVERFLOW
, "got status %#lx\n", (NTSTATUS
)ov
.Internal
);
2593 ok(ov
.InternalHigh
== sizeof(msg
), "got size %Iu\n", ov
.InternalHigh
);
2594 ok(ov
.Offset
== 0xdead3, "got Offset %lu\n", ov
.Offset
);
2595 ok(ov
.OffsetHigh
== 0xdead4, "got OffsetHigh %lu\n", ov
.OffsetHigh
);
2596 dwFlags
= 0xdeadbeef;
2597 rc
= WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, &dwFlags
);
2598 ok(!rc
, "expected failure\n");
2599 ok(WSAGetLastError() == WSAEMSGSIZE
, "got error %u\n", WSAGetLastError());
2600 ok(dwSize
== sizeof(msg
), "got size %lu\n", dwSize
);
2601 todo_wine
ok(dwFlags
== 0xdeadbeef, "got flags %#lx\n", dwFlags
);
2602 ok(hdr
.dwFlags
== MSG_CTRUNC
,
2603 "WSARecvMsg() overlapped operation set unexpected flags %ld.\n", hdr
.dwFlags
);
2604 hdr
.dwFlags
= 0; /* Reset flags */
2606 /* And with an APC. */
2608 SetLastError(0xdeadbeef);
2609 rc
= sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
2610 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
2611 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
2612 hdr
.Control
.len
= 1;
2614 ov
.Internal
= 0xdead1;
2615 ov
.InternalHigh
= 0xdead2;
2616 ov
.Offset
= 0xdead3;
2617 ov
.OffsetHigh
= 0xdead4;
2618 dwSize
= 0xdeadbeef;
2619 rc
= pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, ip_pktinfo_apc
);
2620 ok(rc
== -1, "expected failure\n");
2621 todo_wine
ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
2623 rc
= SleepEx(1000, TRUE
);
2624 ok(rc
== WAIT_IO_COMPLETION
, "got %d\n", rc
);
2625 ok(got_ip_pktinfo_apc
== 1, "apc was called %u times\n", got_ip_pktinfo_apc
);
2626 ok(hdr
.dwFlags
== MSG_CTRUNC
, "got flags %#lx\n", hdr
.dwFlags
);
2627 got_ip_pktinfo_apc
= 0;
2629 hdr
.dwFlags
= 0; /* Reset flags */
2632 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
2633 * on the server end and check that the returned packet matches what was sent.
2635 hdr
.Control
.len
= sizeof(pktbuf
);
2636 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
2637 err
=WSAGetLastError();
2638 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
2639 ok(hdr
.Control
.len
== sizeof(pktbuf
),
2640 "WSARecvMsg() control length mismatch (%ld != sizeof pktbuf).\n", hdr
.Control
.len
);
2641 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
2642 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
2643 ok(!WaitForSingleObject(ov
.hEvent
, 100), "wait failed\n");
2645 WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, NULL
);
2646 ok(dwSize
== sizeof(msg
),
2647 "WSARecvMsg() buffer length does not match transmitted data!\n");
2648 ok(strncmp(iovec
[0].buf
, msg
, sizeof(msg
)) == 0,
2649 "WSARecvMsg() buffer does not match transmitted data!\n");
2650 ok(hdr
.Control
.len
== IP_PKTINFO_LEN
,
2651 "WSARecvMsg() control length mismatch (%ld).\n", hdr
.Control
.len
);
2653 /* Test for the expected IP_PKTINFO return information. */
2655 for (cmsg
= WSA_CMSG_FIRSTHDR(&hdr
); cmsg
!= NULL
; cmsg
= WSA_CMSG_NXTHDR(&hdr
, cmsg
))
2657 if (cmsg
->cmsg_level
== IPPROTO_IP
&& cmsg
->cmsg_type
== IP_PKTINFO
)
2659 struct in_pktinfo
*pi
= (struct in_pktinfo
*)WSA_CMSG_DATA(cmsg
);
2661 ok(pi
->ipi_addr
.s_addr
== s2addr
.sin_addr
.s_addr
, "destination ip mismatch!\n");
2665 ok(foundhdr
, "IP_PKTINFO header information was not returned!\n");
2671 CloseHandle(ov
.hEvent
);
2674 static void test_ipv4_cmsg(void)
2676 static const DWORD off
= 0;
2677 static const DWORD on
= 1;
2678 SOCKADDR_IN localhost
= {0};
2679 SOCKET client
, server
;
2680 char payload
[] = "HELLO";
2682 WSABUF payload_buf
= {sizeof(payload
), payload
};
2683 WSAMSG msg
= {NULL
, 0, &payload_buf
, 1, {sizeof(control
), control
}, 0};
2684 WSACMSGHDR
*header
= (WSACMSGHDR
*)control
;
2685 LPFN_WSARECVMSG pWSARecvMsg
;
2686 INT
*int_data
= (INT
*)WSA_CMSG_DATA(header
);
2687 IN_PKTINFO
*pkt_info
= (IN_PKTINFO
*)WSA_CMSG_DATA(header
);
2691 localhost
.sin_family
= AF_INET
;
2692 localhost
.sin_port
= htons(SERVERPORT
);
2693 inet_pton(AF_INET
, "127.0.0.1", &localhost
.sin_addr
);
2695 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
2696 ok(client
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2697 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
2698 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2700 rc
= bind(server
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2701 ok(rc
!= SOCKET_ERROR
, "bind failed, error %u\n", WSAGetLastError());
2702 rc
= connect(client
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2703 ok(rc
!= SOCKET_ERROR
, "connect failed, error %u\n", WSAGetLastError());
2705 rc
= WSAIoctl(server
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
2706 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &count
, NULL
, NULL
);
2707 ok(!rc
, "failed to get WSARecvMsg, error %u\n", WSAGetLastError());
2709 memset(control
, 0, sizeof(control
));
2710 msg
.Control
.len
= sizeof(control
);
2711 rc
= setsockopt(server
, IPPROTO_IP
, IP_RECVTTL
, (const char *)&on
, sizeof(on
));
2712 ok(!rc
, "failed to set IP_RECVTTL, error %u\n", WSAGetLastError());
2714 count
= sizeof(state
);
2715 rc
= getsockopt(server
, IPPROTO_IP
, IP_RECVTTL
, (char *)&state
, (INT
*)&count
);
2716 ok(!rc
, "failed to get IP_RECVTTL, error %u\n", WSAGetLastError());
2717 ok(state
== 1, "expected 1, got %lu\n", state
);
2718 rc
= send(client
, payload
, sizeof(payload
), 0);
2719 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2720 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2721 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2722 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2723 ok(header
->cmsg_level
== IPPROTO_IP
, "expected IPPROTO_IP, got %i\n", header
->cmsg_level
);
2724 ok(header
->cmsg_type
== IP_TTL
|| broken(header
->cmsg_type
== IP_HOPLIMIT
) /* <= win10 v1607 */,
2725 "expected IP_TTL, got %i\n", header
->cmsg_type
);
2726 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2727 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(INT
), header
->cmsg_len
);
2728 ok(*int_data
>= 32, "expected at least 32, got %i\n", *int_data
);
2729 setsockopt(server
, IPPROTO_IP
, IP_RECVTTL
, (const char *)&off
, sizeof(off
));
2730 ok(!rc
, "failed to clear IP_RECVTTL, error %u\n", WSAGetLastError());
2732 memset(control
, 0, sizeof(control
));
2733 msg
.Control
.len
= sizeof(control
);
2734 rc
= setsockopt(server
, IPPROTO_IP
, IP_PKTINFO
, (const char *)&on
, sizeof(on
));
2735 ok(!rc
, "failed to set IP_PKTINFO, error %u\n", WSAGetLastError());
2737 count
= sizeof(state
);
2738 rc
= getsockopt(server
, IPPROTO_IP
, IP_PKTINFO
, (char *)&state
, (INT
*)&count
);
2739 ok(!rc
, "failed to get IP_PKTINFO, error %u\n", WSAGetLastError());
2740 ok(state
== 1, "expected 1, got %lu\n", state
);
2741 rc
= send(client
, payload
, sizeof(payload
), 0);
2742 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2743 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2744 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2745 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2746 ok(header
->cmsg_level
== IPPROTO_IP
, "expected IPPROTO_IP, got %i\n", header
->cmsg_level
);
2747 ok(header
->cmsg_type
== IP_PKTINFO
, "expected IP_PKTINFO, got %i\n", header
->cmsg_type
);
2748 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(IN_PKTINFO
),
2749 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(IN_PKTINFO
), header
->cmsg_len
);
2750 ok(!memcmp(&pkt_info
->ipi_addr
, &localhost
.sin_addr
, sizeof(IN_ADDR
)), "expected 127.0.0.1\n");
2751 rc
= setsockopt(server
, IPPROTO_IP
, IP_PKTINFO
, (const char *)&off
, sizeof(off
));
2752 ok(!rc
, "failed to clear IP_PKTINFO, error %u\n", WSAGetLastError());
2754 memset(control
, 0, sizeof(control
));
2755 msg
.Control
.len
= sizeof(control
);
2756 rc
= setsockopt(server
, IPPROTO_IP
, IP_RECVTOS
, (const char *)&on
, sizeof(on
));
2757 ok(!rc
, "failed to set IP_RECVTOS, error %u\n", WSAGetLastError());
2759 count
= sizeof(state
);
2760 rc
= getsockopt(server
, IPPROTO_IP
, IP_RECVTOS
, (char *)&state
, (INT
*)&count
);
2761 ok(!rc
, "failed to get IP_RECVTOS, error %u\n", WSAGetLastError());
2762 ok(state
== 1, "expected 1, got %lu\n", state
);
2763 rc
= send(client
, payload
, sizeof(payload
), 0);
2764 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2765 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2766 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2767 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2768 ok(header
->cmsg_level
== IPPROTO_IP
, "expected IPPROTO_IP, got %i\n", header
->cmsg_level
);
2769 ok(header
->cmsg_type
== IP_TOS
|| broken(header
->cmsg_type
== IP_TCLASS
) /* <= win10 v1607 */,
2770 "expected IP_TOS, got %i\n", header
->cmsg_type
);
2771 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2772 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(INT
), header
->cmsg_len
);
2773 ok(*int_data
== 0, "expected 0, got %i\n", *int_data
);
2774 rc
= setsockopt(server
, IPPROTO_IP
, IP_RECVTOS
, (const char *)&off
, sizeof(off
));
2775 ok(!rc
, "failed to clear IP_RECVTOS, error %u\n", WSAGetLastError());
2777 closesocket(server
);
2778 closesocket(client
);
2781 static void test_ipv6_cmsg(void)
2783 static const DWORD off
= 0;
2784 static const DWORD on
= 1;
2785 SOCKADDR_IN6 localhost
= {0};
2786 SOCKET client
, server
;
2787 char payload
[] = "HELLO";
2789 WSABUF payload_buf
= {sizeof(payload
), payload
};
2790 WSAMSG msg
= {NULL
, 0, &payload_buf
, 1, {sizeof(control
), control
}, 0};
2791 WSACMSGHDR
*header
= (WSACMSGHDR
*)control
;
2792 LPFN_WSARECVMSG pWSARecvMsg
;
2793 INT
*int_data
= (INT
*)WSA_CMSG_DATA(header
);
2794 IN6_PKTINFO
*pkt_info
= (IN6_PKTINFO
*)WSA_CMSG_DATA(header
);
2798 localhost
.sin6_family
= AF_INET6
;
2799 localhost
.sin6_port
= htons(SERVERPORT
);
2800 inet_pton(AF_INET6
, "::1", &localhost
.sin6_addr
);
2802 client
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
2803 ok(client
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2804 server
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
2805 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
2807 rc
= bind(server
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2808 ok(rc
!= SOCKET_ERROR
|| WSAGetLastError() == WSAEADDRNOTAVAIL
, "bind failed, error %u\n", WSAGetLastError());
2809 if (WSAGetLastError() == WSAEADDRNOTAVAIL
)
2811 skip("IPv6 not supported, skipping test\n");
2814 rc
= connect(client
, (SOCKADDR
*)&localhost
, sizeof(localhost
));
2815 ok(rc
!= SOCKET_ERROR
, "connect failed, error %u\n", WSAGetLastError());
2817 rc
= WSAIoctl(server
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
2818 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &count
, NULL
, NULL
);
2819 ok(!rc
, "failed to get WSARecvMsg, error %u\n", WSAGetLastError());
2821 memset(control
, 0, sizeof(control
));
2822 msg
.Control
.len
= sizeof(control
);
2823 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (const char *)&on
, sizeof(on
));
2824 ok(!rc
, "failed to set IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2826 count
= sizeof(state
);
2827 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (char *)&state
, (INT
*)&count
);
2828 ok(!rc
, "failed to get IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2829 ok(state
== 1, "expected 1, got %lu\n", state
);
2830 rc
= send(client
, payload
, sizeof(payload
), 0);
2831 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2832 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2833 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2834 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2835 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2836 ok(header
->cmsg_type
== IPV6_HOPLIMIT
, "expected IPV6_HOPLIMIT, got %i\n", header
->cmsg_type
);
2837 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2838 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(INT
), header
->cmsg_len
);
2839 ok(*int_data
>= 32, "expected at least 32, got %i\n", *int_data
);
2840 setsockopt(server
, IPPROTO_IPV6
, IPV6_HOPLIMIT
, (const char *)&off
, sizeof(off
));
2841 ok(!rc
, "failed to clear IPV6_HOPLIMIT, error %u\n", WSAGetLastError());
2843 memset(control
, 0, sizeof(control
));
2844 msg
.Control
.len
= sizeof(control
);
2845 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (const char *)&on
, sizeof(on
));
2846 ok(!rc
, "failed to set IPV6_PKTINFO, error %u\n", WSAGetLastError());
2848 count
= sizeof(state
);
2849 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (char *)&state
, (INT
*)&count
);
2850 ok(!rc
, "failed to get IPV6_PKTINFO, error %u\n", WSAGetLastError());
2851 ok(state
== 1, "expected 1, got %lu\n", state
);
2852 rc
= send(client
, payload
, sizeof(payload
), 0);
2853 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2854 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2855 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2856 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2857 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2858 ok(header
->cmsg_type
== IPV6_PKTINFO
, "expected IPV6_PKTINFO, got %i\n", header
->cmsg_type
);
2859 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(IN6_PKTINFO
),
2860 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(IN6_PKTINFO
), header
->cmsg_len
);
2861 ok(!memcmp(&pkt_info
->ipi6_addr
, &localhost
.sin6_addr
, sizeof(IN6_ADDR
)), "expected ::1\n");
2862 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_PKTINFO
, (const char *)&off
, sizeof(off
));
2863 ok(!rc
, "failed to clear IPV6_PKTINFO, error %u\n", WSAGetLastError());
2865 memset(control
, 0, sizeof(control
));
2866 msg
.Control
.len
= sizeof(control
);
2867 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (const char *)&on
, sizeof(on
));
2868 ok(!rc
, "failed to set IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2870 count
= sizeof(state
);
2871 rc
= getsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (char *)&state
, (INT
*)&count
);
2872 ok(!rc
, "failed to get IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2873 ok(state
== 1, "expected 1, got %lu\n", state
);
2874 rc
= send(client
, payload
, sizeof(payload
), 0);
2875 ok(rc
== sizeof(payload
), "send failed, error %u\n", WSAGetLastError());
2876 rc
= pWSARecvMsg(server
, &msg
, &count
, NULL
, NULL
);
2877 ok(!rc
, "WSARecvMsg failed, error %u\n", WSAGetLastError());
2878 ok(count
== sizeof(payload
), "expected length %Iu, got %lu\n", sizeof(payload
), count
);
2879 ok(header
->cmsg_level
== IPPROTO_IPV6
, "expected IPPROTO_IPV6, got %i\n", header
->cmsg_level
);
2880 ok(header
->cmsg_type
== IPV6_TCLASS
, "expected IPV6_TCLASS, got %i\n", header
->cmsg_type
);
2881 ok(header
->cmsg_len
== sizeof(*header
) + sizeof(INT
),
2882 "expected length %Iu, got %Iu\n", sizeof(*header
) + sizeof(INT
), header
->cmsg_len
);
2883 ok(*int_data
== 0, "expected 0, got %i\n", *int_data
);
2884 rc
= setsockopt(server
, IPPROTO_IPV6
, IPV6_RECVTCLASS
, (const char *)&off
, sizeof(off
));
2885 ok(!rc
, "failed to clear IPV6_RECVTCLASS, error %u\n", WSAGetLastError());
2888 closesocket(server
);
2889 closesocket(client
);
2892 /************* Array containing the tests to run **********/
2894 #define STD_STREAM_SOCKET \
2900 static test_setup tests
[] =
2902 /* Test 0: synchronous client and server */
2923 /* Test 1: event-driven client, synchronous server */
2940 WSA_FLAG_OVERLAPPED
,
2944 /* Test 2: synchronous client, non-blocking server via select() */
2965 /* Test 3: OOB client, OOB server */
2986 /* Test 4: synchronous mixed client and server */
3000 simple_mixed_client
,
3009 static void test_UDP(void)
3011 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
3012 possible that this test fails due to dropped packets. */
3014 /* peer 0 receives data from all other peers */
3015 struct sock_info peer
[NUM_UDP_PEERS
];
3017 int ss
, i
, n_recv
, n_sent
, ret
;
3018 struct sockaddr_in addr
;
3021 memset (buf
,0,sizeof(buf
));
3022 for ( i
= NUM_UDP_PEERS
- 1; i
>= 0; i
-- ) {
3023 ok ( ( peer
[i
].s
= socket ( AF_INET
, SOCK_DGRAM
, 0 ) ) != INVALID_SOCKET
, "UDP: socket failed\n" );
3025 peer
[i
].addr
.sin_family
= AF_INET
;
3026 peer
[i
].addr
.sin_addr
.s_addr
= inet_addr ( SERVERIP
);
3029 peer
[i
].addr
.sin_port
= htons ( SERVERPORT
);
3031 peer
[i
].addr
.sin_port
= htons ( 0 );
3034 do_bind ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, sizeof( peer
[i
].addr
) );
3036 /* test getsockname() to get peer's port */
3037 ss
= sizeof ( peer
[i
].addr
);
3038 ok ( getsockname ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, &ss
) != SOCKET_ERROR
, "UDP: could not getsockname()\n" );
3039 ok ( peer
[i
].addr
.sin_port
!= htons ( 0 ), "UDP: bind() did not associate port\n" );
3042 /* test getsockname() */
3043 ok ( peer
[0].addr
.sin_port
== htons ( SERVERPORT
), "UDP: getsockname returned incorrect peer port\n" );
3045 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
3046 /* send client's ip */
3047 memcpy( buf
, &peer
[i
].addr
.sin_port
, sizeof(peer
[i
].addr
.sin_port
) );
3048 n_sent
= sendto ( peer
[i
].s
, buf
, sizeof(buf
), 0, (struct sockaddr
*) &peer
[0].addr
, sizeof(peer
[0].addr
) );
3049 ok ( n_sent
== sizeof(buf
), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent
);
3052 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
3053 n_recv
= recvfrom ( peer
[0].s
, buf
, sizeof(buf
), 0,(struct sockaddr
*) &peer
[0].peer
, &ss
);
3054 ok ( n_recv
== sizeof(buf
), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv
);
3055 ok ( memcmp ( &peer
[0].peer
.sin_port
, buf
, sizeof(peer
[0].addr
.sin_port
) ) == 0, "UDP: port numbers do not match\n" );
3058 sock
= socket( AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
3059 ok( sock
!= INVALID_SOCKET
, "got error %u.\n", WSAGetLastError() );
3061 memset( &addr
, 0, sizeof(addr
) );
3062 addr
.sin_family
= AF_INET
;
3063 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3064 addr
.sin_port
= htons(255);
3066 ret
= connect( sock
, (struct sockaddr
*)&addr
, sizeof(addr
) );
3067 ok( !ret
, "got error %u.\n", WSAGetLastError() );
3069 /* Send to UDP socket succeeds even if the packets are not received and the network is replying with
3070 * "destination port unreachable" ICMP messages. */
3071 for (i
= 0; i
< 10; ++i
)
3073 ret
= send( sock
, buf
, sizeof(buf
), 0 );
3074 ok( ret
== sizeof(buf
), "got %d, error %u.\n", ret
, WSAGetLastError() );
3080 static void test_WSASocket(void)
3082 SOCKET sock
= INVALID_SOCKET
;
3083 WSAPROTOCOL_INFOA
*pi
;
3084 int wsaproviders
[] = {IPPROTO_TCP
, IPPROTO_IP
};
3085 int autoprotocols
[] = {IPPROTO_TCP
, IPPROTO_UDP
};
3086 int items
, err
, size
, socktype
, i
, j
;
3091 int family
, type
, protocol
;
3093 int ret_family
, ret_type
, ret_protocol
;
3099 {0xdead, SOCK_STREAM
, IPPROTO_TCP
, WSAEAFNOSUPPORT
},
3100 {-1, SOCK_STREAM
, IPPROTO_TCP
, WSAEAFNOSUPPORT
},
3101 {AF_INET
, 0xdead, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
3102 {AF_INET
, -1, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
3103 {AF_INET
, SOCK_STREAM
, 0xdead, WSAEPROTONOSUPPORT
},
3104 {AF_INET
, SOCK_STREAM
, -1, WSAEPROTONOSUPPORT
},
3105 {0xdead, 0xdead, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
3106 {0xdead, SOCK_STREAM
, 0xdead, WSAEAFNOSUPPORT
},
3107 {AF_INET
, 0xdead, 0xdead, WSAESOCKTNOSUPPORT
},
3108 {0xdead, SOCK_STREAM
, IPPROTO_UDP
, WSAEAFNOSUPPORT
},
3111 {AF_INET
, SOCK_STREAM
, 0, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
3112 {AF_INET
, SOCK_DGRAM
, 0, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
3113 {AF_INET
, 0xdead, 0, WSAESOCKTNOSUPPORT
},
3114 {AF_INET
, 0, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
3115 {AF_INET
, 0, IPPROTO_UDP
, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
3116 {AF_INET
, 0, 0xdead, WSAEPROTONOSUPPORT
},
3117 {AF_INET
, 0, 0, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
3118 {AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, WSAEPROTONOSUPPORT
},
3119 {AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, WSAEPROTONOSUPPORT
},
3122 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, AF_INET6
/* win11 */},
3123 {AF_UNSPEC
, SOCK_STREAM
, 0xdead, WSAEPROTONOSUPPORT
},
3124 {AF_UNSPEC
, 0xdead, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
3125 {AF_UNSPEC
, SOCK_STREAM
, 0, WSAEINVAL
},
3126 {AF_UNSPEC
, SOCK_DGRAM
, 0, WSAEINVAL
},
3127 {AF_UNSPEC
, 0xdead, 0, WSAEINVAL
},
3128 {AF_UNSPEC
, 0, IPPROTO_TCP
, 0, AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, AF_INET6
/* win11 */},
3129 {AF_UNSPEC
, 0, IPPROTO_UDP
, 0, AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, AF_INET6
/* win11 */},
3130 {AF_UNSPEC
, 0, 0xdead, WSAEPROTONOSUPPORT
},
3131 {AF_UNSPEC
, 0, 0, WSAEINVAL
},
3134 for (i
= 0; i
< ARRAY_SIZE(tests
); ++i
)
3136 SetLastError( 0xdeadbeef );
3137 sock
= WSASocketA( tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
, NULL
, 0, 0 );
3138 todo_wine_if (i
== 7)
3139 ok(WSAGetLastError() == tests
[i
].error
, "Test %u: got wrong error %u\n", i
, WSAGetLastError());
3142 ok(sock
== INVALID_SOCKET
, "Test %u: expected failure\n", i
);
3146 WSAPROTOCOL_INFOA info
;
3148 ok(sock
!= INVALID_SOCKET
, "Text %u: expected success\n", i
);
3150 size
= sizeof(info
);
3151 err
= getsockopt( sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *)&info
, &size
);
3152 ok(!err
, "Test %u: getsockopt failed, error %u\n", i
, WSAGetLastError());
3153 ok(info
.iAddressFamily
== tests
[i
].ret_family
||
3154 (tests
[i
].ret_family_alt
&& info
.iAddressFamily
== tests
[i
].ret_family_alt
),
3155 "Test %u: got wrong family %d\n", i
, info
.iAddressFamily
);
3156 ok(info
.iSocketType
== tests
[i
].ret_type
, "Test %u: got wrong type %d\n", i
, info
.iSocketType
);
3157 ok(info
.iProtocol
== tests
[i
].ret_protocol
, "Test %u: got wrong protocol %d\n", i
, info
.iProtocol
);
3159 closesocket( sock
);
3163 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
3164 * to avoid a crash on win98.
3167 items
= WSAEnumProtocolsA(wsaproviders
, NULL
, &pi_size
);
3168 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
3170 err
= WSAGetLastError();
3171 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
3174 pi
= malloc(pi_size
);
3175 ok(pi
!= NULL
, "Failed to allocate memory\n");
3177 items
= WSAEnumProtocolsA(wsaproviders
, pi
, &pi_size
);
3178 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
3182 skip("No protocols enumerated.\n");
3187 sock
= WSASocketA(FROM_PROTOCOL_INFO
, FROM_PROTOCOL_INFO
,
3188 FROM_PROTOCOL_INFO
, &pi
[0], 0, 0);
3189 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3193 /* find what parameters are used first: plain parameters or protocol info struct */
3194 pi
[0].iProtocol
= -1;
3195 pi
[0].iSocketType
= -1;
3196 pi
[0].iAddressFamily
= -1;
3197 ok(WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0) == INVALID_SOCKET
,
3198 "WSASocketA should have failed\n");
3199 err
= WSAGetLastError();
3200 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
3202 pi
[0].iProtocol
= 0;
3203 pi
[0].iSocketType
= 0;
3204 pi
[0].iAddressFamily
= 0;
3205 sock
= WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0);
3206 if(sock
!= INVALID_SOCKET
)
3208 win_skip("must work only in OS <= 2003\n");
3213 err
= WSAGetLastError();
3214 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
3217 pi
[0].iProtocol
= IPPROTO_UDP
;
3218 pi
[0].iSocketType
= SOCK_DGRAM
;
3219 pi
[0].iAddressFamily
= AF_INET
;
3220 sock
= WSASocketA(0, 0, 0, &pi
[0], 0, 0);
3221 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3224 size
= sizeof(socktype
);
3226 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3227 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
3228 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
3229 SOCK_DGRAM
, socktype
);
3231 socktype
= SOCK_STREAM
;
3232 WSASetLastError(0xdeadbeef);
3233 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
3234 ok(err
== -1, "expected failure\n");
3235 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
3237 socktype
= SOCK_DGRAM
;
3238 WSASetLastError(0xdeadbeef);
3239 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
3240 ok(err
== -1, "expected failure\n");
3241 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
3245 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, &pi
[0], 0, 0);
3246 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3249 size
= sizeof(socktype
);
3251 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3252 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
3253 ok(socktype
== SOCK_STREAM
, "Wrong socket type, expected %d received %d\n",
3254 SOCK_STREAM
, socktype
);
3256 socktype
= SOCK_STREAM
;
3257 WSASetLastError(0xdeadbeef);
3258 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
3259 ok(err
== -1, "expected failure\n");
3260 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3262 socktype
= SOCK_DGRAM
;
3263 WSASetLastError(0xdeadbeef);
3264 err
= setsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *)&socktype
, sizeof(socktype
));
3265 ok(err
== -1, "expected failure\n");
3266 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3273 items
= WSAEnumProtocolsA(NULL
, NULL
, &pi_size
);
3274 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
3276 err
= WSAGetLastError();
3277 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
3280 pi
= malloc(pi_size
);
3281 ok(pi
!= NULL
, "Failed to allocate memory\n");
3283 items
= WSAEnumProtocolsA(NULL
, pi
, &pi_size
);
3284 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
3287 /* when no protocol and socket type are specified the first entry
3288 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
3290 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
3291 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3294 size
= sizeof(socktype
);
3296 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3297 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3298 for(i
= 0; i
< items
; i
++)
3300 if(pi
[i
].dwProviderFlags
& PFL_MATCHES_PROTOCOL_ZERO
)
3302 ok(socktype
== pi
[i
].iSocketType
, "Wrong socket type, expected %d received %d\n",
3303 pi
[i
].iSocketType
, socktype
);
3307 ok(i
!= items
, "Creating a socket without protocol and socket type didn't work\n");
3310 /* when no socket type is specified the first entry from WSAEnumProtocols
3311 * that matches the protocol is returned */
3312 for (i
= 0; i
< ARRAY_SIZE(autoprotocols
); i
++)
3314 sock
= WSASocketA(0, 0, autoprotocols
[i
], NULL
, 0, 0);
3315 ok(sock
!= INVALID_SOCKET
, "Failed to create socket for protocol %d, received %d\n",
3316 autoprotocols
[i
], WSAGetLastError());
3318 size
= sizeof(socktype
);
3320 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3321 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3323 for (err
= 1, j
= 0; j
< items
; j
++)
3325 if (pi
[j
].iProtocol
== autoprotocols
[i
])
3327 ok(pi
[j
].iSocketType
== socktype
, "expected %d, got %d\n", socktype
, pi
[j
].iSocketType
);
3332 ok(!err
, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols
[i
]);
3339 SetLastError(0xdeadbeef);
3340 /* starting on vista the socket function returns error during the socket
3341 creation and no longer in the socket operations (sendto, readfrom) */
3342 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_ICMP
, NULL
, 0, 0);
3343 if (sock
== INVALID_SOCKET
)
3345 err
= WSAGetLastError();
3346 ok(err
== WSAEACCES
, "Expected 10013, received %d\n", err
);
3347 skip("SOCK_RAW is not supported\n");
3351 WSAPROTOCOL_INFOW info
;
3353 size
= sizeof(socktype
);
3355 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3356 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3357 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
3358 SOCK_RAW
, socktype
);
3360 size
= sizeof(info
);
3361 err
= getsockopt(sock
, SOL_SOCKET
, SO_PROTOCOL_INFOW
, (char *) &info
, &size
);
3362 ok(!err
,"got error %d\n", WSAGetLastError());
3363 /* Protocol name in info.szProtocol is not entirely consistent across Windows versions and
3364 * locales, so not testing it. */
3365 ok(info
.iAddressFamily
== AF_INET
, "got iAddressFamily %d.\n", info
.iAddressFamily
);
3366 ok(info
.iSocketType
== SOCK_RAW
, "got iSocketType %d.\n", info
.iSocketType
);
3367 ok(info
.iMaxSockAddr
== 0x10, "got iMaxSockAddr %d.\n", info
.iMaxSockAddr
);
3368 ok(info
.iMinSockAddr
== 0x10, "got iMinSockAddr %d.\n", info
.iMinSockAddr
);
3369 todo_wine
ok(!info
.iProtocol
, "got iProtocol %d.\n", info
.iProtocol
);
3370 ok(info
.iProtocolMaxOffset
== 255, "got iProtocol %d.\n", info
.iProtocolMaxOffset
);
3371 ok(info
.dwProviderFlags
== (PFL_MATCHES_PROTOCOL_ZERO
| PFL_HIDDEN
), "got dwProviderFlags %#lx.\n",
3372 info
.dwProviderFlags
);
3373 ok(info
.dwServiceFlags1
== (XP1_IFS_HANDLES
| XP1_SUPPORT_BROADCAST
| XP1_SUPPORT_MULTIPOINT
3374 | XP1_MESSAGE_ORIENTED
| XP1_CONNECTIONLESS
), "got dwServiceFlags1 %#lx.\n",
3375 info
.dwServiceFlags1
);
3379 sock
= WSASocketA(0, 0, IPPROTO_RAW
, NULL
, 0, 0);
3380 if (sock
!= INVALID_SOCKET
)
3382 size
= sizeof(socktype
);
3384 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3385 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3386 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
3387 SOCK_RAW
, socktype
);
3390 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_TCP
, NULL
, 0, 0);
3391 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3393 size
= sizeof(socktype
);
3395 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3396 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3397 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
3398 SOCK_RAW
, socktype
);
3401 else if (WSAGetLastError() == WSAEACCES
)
3402 skip("SOCK_RAW is not available\n");
3404 ok(0, "Failed to create socket: %d\n", WSAGetLastError());
3408 /* IPX socket tests */
3410 SetLastError(0xdeadbeef);
3411 sock
= WSASocketA(AF_IPX
, SOCK_DGRAM
, NSPROTO_IPX
, NULL
, 0, 0);
3412 if (sock
== INVALID_SOCKET
)
3414 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
3415 skip("IPX is not supported\n");
3419 WSAPROTOCOL_INFOA info
;
3422 sock
= WSASocketA(0, 0, NSPROTO_IPX
, NULL
, 0, 0);
3423 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3426 size
= sizeof(socktype
);
3428 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3429 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
3430 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
3431 SOCK_DGRAM
, socktype
);
3433 /* check socket family, type and protocol */
3434 size
= sizeof(WSAPROTOCOL_INFOA
);
3435 err
= getsockopt(sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &info
, &size
);
3436 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
3437 ok(info
.iProtocol
== NSPROTO_IPX
, "expected protocol %d, received %d\n",
3438 NSPROTO_IPX
, info
.iProtocol
);
3439 ok(info
.iAddressFamily
== AF_IPX
, "expected family %d, received %d\n",
3440 AF_IPX
, info
.iProtocol
);
3441 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
3442 SOCK_DGRAM
, info
.iSocketType
);
3445 /* SOCK_STREAM does not support NSPROTO_IPX */
3446 SetLastError(0xdeadbeef);
3447 ok(WSASocketA(AF_IPX
, SOCK_STREAM
, NSPROTO_IPX
, NULL
, 0, 0) == INVALID_SOCKET
,
3448 "WSASocketA should have failed\n");
3449 err
= WSAGetLastError();
3450 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
3452 /* test extended IPX support - that is adding any number between 0 and 255
3453 * to the IPX protocol value will make it be used as IPX packet type */
3454 for(i
= 0;i
<= 255;i
+= 17)
3456 SetLastError(0xdeadbeef);
3457 sock
= WSASocketA(0, 0, NSPROTO_IPX
+ i
, NULL
, 0, 0);
3458 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
3463 err
= getsockopt(sock
, NSPROTO_IPX
, IPX_PTYPE
, (char *) &socktype
, &size
);
3464 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
3465 ok(socktype
== i
, "Wrong IPX packet type, expected %d received %d\n",
3473 static void test_WSADuplicateSocket(void)
3475 SOCKET source
, dupsock
;
3476 WSAPROTOCOL_INFOA info
;
3478 struct sockaddr_in addr
;
3479 int socktype
, size
, addrsize
, ret
;
3480 char teststr
[] = "TEST", buffer
[16];
3482 source
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
3483 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3485 /* test invalid parameters */
3486 SetLastError(0xdeadbeef);
3487 ok(WSADuplicateSocketA(0, 0, NULL
), "WSADuplicateSocketA should have failed\n");
3488 err
= WSAGetLastError();
3489 ok(err
== WSAENOTSOCK
, "expected 10038, received %ld\n", err
);
3491 SetLastError(0xdeadbeef);
3492 ok(WSADuplicateSocketA(source
, 0, NULL
),
3493 "WSADuplicateSocketA should have failed\n");
3494 err
= WSAGetLastError();
3495 ok(err
== WSAEINVAL
, "expected 10022, received %ld\n", err
);
3497 SetLastError(0xdeadbeef);
3498 ok(WSADuplicateSocketA(source
, ~0, &info
),
3499 "WSADuplicateSocketA should have failed\n");
3500 err
= WSAGetLastError();
3501 ok(err
== WSAEINVAL
, "expected 10022, received %ld\n", err
);
3503 SetLastError(0xdeadbeef);
3504 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info
),
3505 "WSADuplicateSocketA should have failed\n");
3506 err
= WSAGetLastError();
3507 ok(err
== WSAENOTSOCK
, "expected 10038, received %ld\n", err
);
3509 SetLastError(0xdeadbeef);
3510 ok(WSADuplicateSocketA(source
, GetCurrentProcessId(), NULL
),
3511 "WSADuplicateSocketA should have failed\n");
3512 err
= WSAGetLastError();
3513 ok(err
== WSAEFAULT
, "expected 10014, received %ld\n", err
);
3515 /* test returned structure */
3516 memset(&info
, 0, sizeof(info
));
3517 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
3518 "WSADuplicateSocketA should have worked\n");
3520 ok(info
.iProtocol
== IPPROTO_TCP
, "expected protocol %d, received %d\n",
3521 IPPROTO_TCP
, info
.iProtocol
);
3522 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
3523 AF_INET
, info
.iProtocol
);
3524 ok(info
.iSocketType
== SOCK_STREAM
, "expected type %d, received %d\n",
3525 SOCK_STREAM
, info
.iSocketType
);
3527 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
3528 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3530 closesocket(dupsock
);
3531 closesocket(source
);
3533 /* create a socket, bind it, duplicate it then send data on source and
3534 * receive in the duplicated socket */
3535 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
3536 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3538 memset(&info
, 0, sizeof(info
));
3539 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
3540 "WSADuplicateSocketA should have worked\n");
3542 ok(info
.iProtocol
== IPPROTO_UDP
, "expected protocol %d, received %d\n",
3543 IPPROTO_UDP
, info
.iProtocol
);
3544 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
3545 AF_INET
, info
.iProtocol
);
3546 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
3547 SOCK_DGRAM
, info
.iSocketType
);
3549 memset(&addr
, 0, sizeof(addr
));
3550 addr
.sin_family
= AF_INET
;
3551 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3552 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
3553 "bind should have worked\n");
3555 /* read address to find out the port number to be used in sendto */
3556 memset(&addr
, 0, sizeof(addr
));
3557 addrsize
= sizeof(addr
);
3558 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
3559 "getsockname should have worked\n");
3560 ok(addr
.sin_port
, "socket port should be != 0\n");
3562 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
3563 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3566 ret
= getsockopt(dupsock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
3567 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3568 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
3569 SOCK_DGRAM
, socktype
);
3571 set_blocking(source
, TRUE
);
3573 /* send data on source socket */
3574 addrsize
= sizeof(addr
);
3575 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
3576 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
3578 /* receive on duplicated socket */
3579 addrsize
= sizeof(addr
);
3580 memset(buffer
, 0, sizeof(buffer
));
3581 size
= recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
);
3582 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
3583 buffer
[sizeof(teststr
) - 1] = 0;
3584 ok(!strcmp(buffer
, teststr
), "expected '%s', received '%s'\n", teststr
, buffer
);
3586 closesocket(dupsock
);
3587 closesocket(source
);
3589 /* show that the source socket need to be bound before the duplicated
3590 * socket is created */
3591 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
3592 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3594 memset(&info
, 0, sizeof(info
));
3595 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
3596 "WSADuplicateSocketA should have worked\n");
3598 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
3599 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
3601 memset(&addr
, 0, sizeof(addr
));
3602 addr
.sin_family
= AF_INET
;
3603 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3604 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
3605 "bind should have worked\n");
3607 /* read address to find out the port number to be used in sendto */
3608 memset(&addr
, 0, sizeof(addr
));
3609 addrsize
= sizeof(addr
);
3610 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
3611 "getsockname should have worked\n");
3612 ok(addr
.sin_port
, "socket port should be != 0\n");
3614 set_blocking(source
, TRUE
);
3616 addrsize
= sizeof(addr
);
3617 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
3618 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
3620 SetLastError(0xdeadbeef);
3621 addrsize
= sizeof(addr
);
3622 memset(buffer
, 0, sizeof(buffer
));
3624 ok(recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
) == -1,
3625 "recvfrom should have failed\n");
3626 err
= WSAGetLastError();
3627 ok(err
== WSAEINVAL
, "expected 10022, received %ld\n", err
);
3630 closesocket(dupsock
);
3631 closesocket(source
);
3634 static void test_WSAConnectByName(void)
3637 SOCKADDR_IN local_addr
= {0}, remote_addr
= {0},
3638 sock_addr
= {0}, peer_addr
= {0};
3639 DWORD local_len
, remote_len
, conn_ctx
;
3640 int ret
, err
, sock_len
, peer_len
;
3641 WSAOVERLAPPED overlap
;
3642 struct addrinfo
*first_addrinfo
, first_hints
;
3646 /* First call of getaddrinfo fails on w8adm */
3647 first_addrinfo
= NULL
;
3648 memset(&first_hints
, 0, sizeof(struct addrinfo
));
3649 first_hints
.ai_socktype
= SOCK_STREAM
;
3650 first_hints
.ai_family
= AF_INET
;
3651 first_hints
.ai_protocol
= IPPROTO_TCP
;
3652 getaddrinfo("winehq.org", "http", &first_hints
, &first_addrinfo
);
3654 freeaddrinfo(first_addrinfo
);
3655 SetLastError(0xdeadbeef);
3657 /* Fill all fields */
3658 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3659 local_len
= remote_len
= sizeof(SOCKADDR_IN
);
3660 ret
= WSAConnectByNameA(s
, "winehq.org", "http", &local_len
, (struct sockaddr
*)&local_addr
,
3661 &remote_len
, (struct sockaddr
*)&remote_addr
, NULL
, NULL
);
3662 ok(ret
, "WSAConnectByNameA should have succeeded, error %u\n", WSAGetLastError());
3663 setsockopt(s
, SOL_SOCKET
, SO_UPDATE_CONNECT_CONTEXT
, (char *)&conn_ctx
, sizeof(DWORD
));
3664 sock_len
= peer_len
= sizeof(SOCKADDR_IN
);
3665 ret
= getsockname(s
, (struct sockaddr
*)&sock_addr
, &sock_len
);
3666 ok(!ret
, "getsockname should have succeeded, error %u\n", WSAGetLastError());
3667 ret
= getpeername(s
, (struct sockaddr
*)&peer_addr
, &peer_len
);
3668 ok(!ret
, "getpeername should have succeeded, error %u\n", WSAGetLastError());
3669 ok(sock_len
== sizeof(SOCKADDR_IN
), "got sockname size of %d\n", sock_len
);
3670 ok(peer_len
== sizeof(SOCKADDR_IN
), "got peername size of %d\n", peer_len
);
3671 ok(local_len
== sizeof(SOCKADDR_IN
), "got local size of %lu\n", local_len
);
3672 ok(remote_len
== sizeof(SOCKADDR_IN
), "got remote size of %lu\n", remote_len
);
3673 ok(!local_addr
.sin_port
, "local_addr has non-zero sin_port: %hu.\n", local_addr
.sin_port
);
3674 ok(!memcmp(&sock_addr
.sin_addr
, &local_addr
.sin_addr
, sizeof(struct in_addr
)),
3675 "local_addr did not receive data.\n");
3676 ok(!memcmp(&peer_addr
, &remote_addr
, sizeof(SOCKADDR_IN
)), "remote_addr did not receive data.\n");
3679 /* Passing NULL length but a pointer to a sockaddr */
3680 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3681 local_len
= remote_len
= sizeof(SOCKADDR_IN
);
3682 memset(&local_addr
, 0, sizeof(SOCKADDR_IN
));
3683 memset(&remote_addr
, 0, sizeof(SOCKADDR_IN
));
3684 memset(&sock_addr
, 0, sizeof(SOCKADDR_IN
));
3685 memset(&peer_addr
, 0, sizeof(SOCKADDR_IN
));
3686 ret
= WSAConnectByNameA(s
, "winehq.org", "http", NULL
, (struct sockaddr
*)&local_addr
,
3687 NULL
, (struct sockaddr
*)&remote_addr
, NULL
, NULL
);
3688 ok(ret
, "WSAConnectByNameA should have succeeded, error %u\n", WSAGetLastError());
3689 setsockopt(s
, SOL_SOCKET
, SO_UPDATE_CONNECT_CONTEXT
, (char *)&conn_ctx
, sizeof(DWORD
));
3690 sock_len
= peer_len
= sizeof(SOCKADDR_IN
);
3691 ret
= getsockname(s
, (struct sockaddr
*)&sock_addr
, &sock_len
);
3692 ok(!ret
, "getsockname should have succeeded, error %u\n", WSAGetLastError());
3693 ret
= getpeername(s
, (struct sockaddr
*)&peer_addr
, &peer_len
);
3694 ok(!ret
, "getpeername should have succeeded, error %u\n", WSAGetLastError());
3695 ok(sock_len
== sizeof(SOCKADDR_IN
), "got sockname size of %d\n", sock_len
);
3696 ok(peer_len
== sizeof(SOCKADDR_IN
), "got peername size of %d\n", peer_len
);
3697 ok(!local_addr
.sin_family
, "local_addr received data.\n");
3698 ok(!remote_addr
.sin_family
, "remote_addr received data.\n");
3701 /* Passing NULLs for node or service */
3702 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3703 ret
= WSAConnectByNameA(s
, NULL
, "http", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
3704 err
= WSAGetLastError();
3705 ok(!ret
, "WSAConnectByNameA should have failed\n");
3706 ok(err
== WSAEINVAL
, "expected error %u (WSAEINVAL), got %u\n", WSAEINVAL
, err
);
3707 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3709 ret
= WSAConnectByNameA(s
, "winehq.org", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
3710 err
= WSAGetLastError();
3711 ok(!ret
, "WSAConnectByNameA should have failed\n");
3712 ok(err
== WSAEINVAL
, "expected error %u (WSAEINVAL), got %u\n", WSAEINVAL
, err
);
3715 /* Passing NULL for the addresses and address lengths */
3716 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3717 ret
= WSAConnectByNameA(s
, "winehq.org", "http", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
3718 ok(ret
, "WSAConnectByNameA should have succeeded, error %u\n", WSAGetLastError());
3721 /* Passing NULL for the addresses and passing correct lengths */
3722 local_len
= remote_len
= sizeof(SOCKADDR_IN
);
3723 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3724 ret
= WSAConnectByNameA(s
, "winehq.org", "http", &local_len
, NULL
,
3725 &remote_len
, NULL
, NULL
, NULL
);
3726 ok(ret
, "WSAConnectByNameA should have succeeded, error %u\n", WSAGetLastError());
3727 ok(local_len
== sizeof(SOCKADDR_IN
), "local_len should have been %Iu, got %ld\n", sizeof(SOCKADDR_IN
),
3729 ok(remote_len
== sizeof(SOCKADDR_IN
), "remote_len should have been %Iu, got %ld\n", sizeof(SOCKADDR_IN
),
3733 /* Passing addresses and passing short lengths */
3734 local_len
= remote_len
= 3;
3735 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3736 ret
= WSAConnectByNameA(s
, "winehq.org", "http", &local_len
, (struct sockaddr
*)&local_addr
,
3737 &remote_len
, (struct sockaddr
*)&remote_addr
, NULL
, NULL
);
3738 err
= WSAGetLastError();
3739 ok(!ret
, "WSAConnectByNameA should have failed\n");
3740 ok(err
== WSAEFAULT
, "expected error %u (WSAEFAULT), got %u\n", WSAEFAULT
, err
);
3741 ok(local_len
== 3, "local_len should have been 3, got %ld\n", local_len
);
3742 ok(remote_len
== 3, "remote_len should have been 3, got %ld\n", remote_len
);
3745 /* Passing addresses and passing long lengths */
3746 local_len
= remote_len
= 50;
3747 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3748 ret
= WSAConnectByNameA(s
, "winehq.org", "http", &local_len
, (struct sockaddr
*)&local_addr
,
3749 &remote_len
, (struct sockaddr
*)&remote_addr
, NULL
, NULL
);
3750 ok(ret
, "WSAConnectByNameA should have succeeded, error %u\n", WSAGetLastError());
3751 ok(local_len
== sizeof(SOCKADDR_IN
), "local_len should have been %Iu, got %ld\n", sizeof(SOCKADDR_IN
),
3753 ok(remote_len
== sizeof(SOCKADDR_IN
), "remote_len should have been %Iu, got %ld\n", sizeof(SOCKADDR_IN
),
3757 /* Unknown service */
3758 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3759 ret
= WSAConnectByNameA(s
, "winehq.org", "nonexistentservice", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
3760 err
= WSAGetLastError();
3761 ok(!ret
, "WSAConnectByNameA should have failed\n");
3762 ok(err
== WSATYPE_NOT_FOUND
, "expected error %u (WSATYPE_NOT_FOUND), got %u\n",
3763 WSATYPE_NOT_FOUND
, err
);
3766 /* Connecting with a UDP socket */
3767 s
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
3768 ret
= WSAConnectByNameA(s
, "winehq.org", "https", NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
3769 err
= WSAGetLastError();
3770 ok(!ret
, "WSAConnectByNameA should have failed\n");
3771 ok(err
== WSAEINVAL
|| err
== WSAEFAULT
, "expected error %u (WSAEINVAL) or %u (WSAEFAULT), got %u\n",
3772 WSAEINVAL
, WSAEFAULT
, err
); /* WSAEFAULT win10 >= 1809 */
3775 /* Passing non-null as the reserved parameter */
3776 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
3777 ret
= WSAConnectByNameA(s
, "winehq.org", "http", NULL
, NULL
, NULL
, NULL
, NULL
, &overlap
);
3778 err
= WSAGetLastError();
3779 ok(!ret
, "WSAConnectByNameA should have failed\n");
3780 ok(err
== WSAEINVAL
, "expected error %u (WSAEINVAL), got %u\n", WSAEINVAL
, err
);
3784 static void test_WSAEnumNetworkEvents(void)
3787 int sock_type
[] = {SOCK_STREAM
, SOCK_DGRAM
, SOCK_STREAM
}, i
, j
, k
, l
;
3788 struct sockaddr_in address
;
3790 WSANETWORKEVENTS net_events
;
3792 memset(&address
, 0, sizeof(address
));
3793 address
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
3794 address
.sin_family
= AF_INET
;
3796 /* This test follows the steps from bugs 10204 and 24946 */
3797 for (l
= 0; l
< 2; l
++)
3799 for (i
= 0; i
< ARRAY_SIZE(sock_type
); i
++)
3802 tcp_socketpair(&s
, &s2
);
3805 s
= socket(AF_INET
, sock_type
[i
], 0);
3806 ok (s
!= SOCKET_ERROR
, "Test[%d]: failed to create socket\n", i
);
3807 ok (!bind(s
, (struct sockaddr
*) &address
, sizeof(address
)), "Test[%d]: bind failed\n", i
);
3809 event
= WSACreateEvent();
3810 ok (event
!= NULL
, "Test[%d]: failed to create event\n", i
);
3811 for (j
= 0; j
< 5; j
++) /* Repeat sometimes and the result must be the same */
3813 /* When the TCP socket is not connected NO events will be returned.
3814 * When connected and no data pending it will get the write event.
3815 * UDP sockets don't have connections so as soon as they are bound
3816 * they can read/write data. Since nobody is sendind us data only
3817 * the write event will be returned and ONLY once.
3819 ok (!WSAEventSelect(s
, event
, FD_READ
| FD_WRITE
), "Test[%d]: WSAEventSelect failed\n", i
);
3820 memset(&net_events
, 0xAB, sizeof(net_events
));
3821 ok (!WSAEnumNetworkEvents(s
, l
== 0 ? event
: NULL
, &net_events
),
3822 "Test[%d]: WSAEnumNetworkEvents failed\n", i
);
3823 if (i
>= 1 && j
== 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
3825 ok (net_events
.lNetworkEvents
== FD_WRITE
, "Test[%d]: expected 2, got %ld\n",
3826 i
, net_events
.lNetworkEvents
);
3830 ok (net_events
.lNetworkEvents
== 0, "Test[%d]: expected 0, got %ld\n",
3831 i
, net_events
.lNetworkEvents
);
3833 for (k
= 0; k
< FD_MAX_EVENTS
; k
++)
3835 if (net_events
.lNetworkEvents
& (1 << k
))
3837 ok (net_events
.iErrorCode
[k
] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
3838 i
, k
, net_events
.iErrorCode
[k
]);
3842 /* Bits that are not set in lNetworkEvents MUST not be changed */
3843 ok (net_events
.iErrorCode
[k
] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
3844 i
, k
, net_events
.iErrorCode
[k
]);
3849 WSACloseEvent(event
);
3850 if (i
== 2) closesocket(s2
);
3855 static DWORD WINAPI
SelectReadThread(void *param
)
3857 select_thread_params
*par
= param
;
3860 struct sockaddr_in addr
;
3861 struct timeval select_timeout
;
3864 FD_SET(par
->s
, &readfds
);
3865 select_timeout
.tv_sec
=5;
3866 select_timeout
.tv_usec
=0;
3867 addr
.sin_family
= AF_INET
;
3868 addr
.sin_addr
.s_addr
= inet_addr(SERVERIP
);
3869 addr
.sin_port
= htons(SERVERPORT
);
3871 do_bind(par
->s
, (struct sockaddr
*)&addr
, sizeof(addr
));
3872 wsa_ok(listen(par
->s
, SOMAXCONN
), 0 ==, "SelectReadThread (%lx): listen failed: %d\n");
3874 SetEvent(server_ready
);
3875 ret
= select(par
->s
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3876 par
->ReadKilled
= (ret
== 1);
3881 static DWORD WINAPI
SelectCloseThread(void *param
)
3883 SOCKET s
= *(SOCKET
*)param
;
3889 static void test_errors(void)
3892 SOCKADDR_IN SockAddr
;
3895 WSASetLastError(NO_ERROR
);
3896 sock
= socket(PF_INET
, SOCK_STREAM
, 0);
3897 ok( (sock
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3898 memset(&SockAddr
, 0, sizeof(SockAddr
));
3899 SockAddr
.sin_family
= AF_INET
;
3900 SockAddr
.sin_port
= htons(6924);
3901 SockAddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3903 ret
= connect(sock
, (PSOCKADDR
)&SockAddr
, sizeof(SockAddr
));
3904 ok( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got: %d\n", ret
);
3905 if (ret
== SOCKET_ERROR
)
3907 err
= WSAGetLastError();
3908 ok( (err
== WSAECONNREFUSED
), "expected WSAECONNREFUSED, got: %d\n", err
);
3913 fd_set set
= {1, {sock
}};
3916 timeval
.tv_usec
= 50000;
3918 ret
= select(1, NULL
, &set
, NULL
, &timeval
);
3919 ok( (ret
== 0), "expected 0 (timeout), got: %d\n", ret
);
3922 ret
= closesocket(sock
);
3923 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
3926 static void test_listen(void)
3929 int ret
, acceptc
, olen
= sizeof(acceptc
);
3930 struct sockaddr_in address
;
3932 memset(&address
, 0, sizeof(address
));
3933 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3934 address
.sin_family
= AF_INET
;
3935 address
.sin_port
= htons(SERVERPORT
);
3937 /* invalid socket tests */
3938 SetLastError(0xdeadbeef);
3939 ok ((listen(0, 0) == SOCKET_ERROR
), "listen did not fail\n");
3940 ret
= WSAGetLastError();
3941 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3943 SetLastError(0xdeadbeef);
3944 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR
), "listen did not fail\n");
3945 ret
= WSAGetLastError();
3946 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3949 fdA
= socket(AF_INET
, SOCK_STREAM
, 0);
3950 ok ((fdA
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3952 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3953 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3955 SetLastError(0xdeadbeef);
3956 ok ((listen(fdA
, -2) == SOCKET_ERROR
), "listen did not fail\n");
3957 ret
= WSAGetLastError();
3958 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3960 SetLastError(0xdeadbeef);
3961 ok ((listen(fdA
, 1) == SOCKET_ERROR
), "listen did not fail\n");
3962 ret
= WSAGetLastError();
3963 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3965 SetLastError(0xdeadbeef);
3966 ok ((listen(fdA
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3967 ret
= WSAGetLastError();
3968 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3970 ok (!bind(fdA
, (struct sockaddr
*) &address
, sizeof(address
)), "bind failed\n");
3972 SetLastError(0xdeadbeef);
3973 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3974 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3977 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3978 ok (!ret
, "getsockopt failed\n");
3979 ok (acceptc
== 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc
);
3982 WSASetLastError(0xdeadbeef);
3983 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
3984 ok(ret
== -1, "expected failure\n");
3985 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3988 WSASetLastError(0xdeadbeef);
3989 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
3990 ok(ret
== -1, "expected failure\n");
3991 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
3993 ok (!listen(fdA
, 0), "listen failed\n");
3994 ok (!listen(fdA
, SOMAXCONN
), "double listen failed\n");
3997 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3998 ok (!ret
, "getsockopt failed\n");
3999 ok (acceptc
== 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc
);
4002 WSASetLastError(0xdeadbeef);
4003 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
4004 ok(ret
== -1, "expected failure\n");
4005 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
4008 WSASetLastError(0xdeadbeef);
4009 ret
= setsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char *)&acceptc
, sizeof(acceptc
));
4010 ok(ret
== -1, "expected failure\n");
4011 ok(WSAGetLastError() == WSAENOPROTOOPT
, "got error %u\n", WSAGetLastError());
4013 SetLastError(0xdeadbeef);
4014 ok ((listen(fdB
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
4015 ret
= WSAGetLastError();
4016 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
4018 ret
= closesocket(fdB
);
4019 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
4021 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
4022 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
4024 SetLastError(0xdeadbeef);
4025 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
4026 ret
= WSAGetLastError();
4027 ok (ret
== WSAEADDRINUSE
, "expected 10048, received %d\n", ret
);
4029 ret
= closesocket(fdA
);
4030 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
4031 ret
= closesocket(fdB
);
4032 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
4035 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
4036 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
4037 static void test_select(void)
4039 static char tmp_buf
[1024];
4041 fd_set readfds
, writefds
, exceptfds
, *alloc_fds
;
4042 SOCKET fdListen
, fdRead
, fdWrite
, sockets
[200];
4045 struct timeval select_timeout
;
4046 struct sockaddr_in address
;
4047 select_thread_params thread_params
;
4048 HANDLE thread_handle
;
4049 DWORD ticks
, id
, old_protect
;
4050 unsigned int apc_count
;
4051 unsigned int maxfd
, i
;
4054 fdRead
= socket(AF_INET
, SOCK_STREAM
, 0);
4055 ok( (fdRead
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
4056 fdWrite
= socket(AF_INET
, SOCK_STREAM
, 0);
4057 ok( (fdWrite
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
4060 if (fdWrite
> maxfd
)
4065 FD_SET_ALL(fdWrite
);
4066 select_timeout
.tv_sec
=0;
4067 select_timeout
.tv_usec
=0;
4069 ticks
= GetTickCount();
4070 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4071 ticks
= GetTickCount() - ticks
;
4072 ok(ret
== 0, "select should not return any socket handles\n");
4073 ok(ticks
< 100, "select was blocking for %lu ms\n", ticks
);
4074 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
4075 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
4076 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
4077 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
4081 FD_SET_ALL(fdWrite
);
4082 select_timeout
.tv_sec
=0;
4083 select_timeout
.tv_usec
=500;
4085 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4086 ok(ret
== 0, "select should not return any socket handles\n");
4087 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
4088 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
4089 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
4090 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
4092 ok ((listen(fdWrite
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
4093 ret
= closesocket(fdWrite
);
4094 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
4096 thread_params
.s
= fdRead
;
4097 thread_params
.ReadKilled
= FALSE
;
4098 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
4099 thread_handle
= CreateThread (NULL
, 0, SelectReadThread
, &thread_params
, 0, &id
);
4100 ok ( (thread_handle
!= NULL
), "CreateThread failed unexpectedly: %ld\n", GetLastError());
4102 WaitForSingleObject (server_ready
, INFINITE
);
4104 ret
= closesocket(fdRead
);
4105 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
4107 WaitForSingleObject (thread_handle
, 1000);
4108 ok ( thread_params
.ReadKilled
, "closesocket did not wake up select\n");
4109 ret
= recv(fdRead
, &buffer
, 1, MSG_PEEK
);
4110 ok( (ret
== -1), "peek at closed socket expected -1 got %d\n", ret
);
4112 /* Test selecting invalid handles */
4116 ret
= select(maxfd
+1, 0, 0, 0, &select_timeout
);
4117 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
4118 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
4121 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4122 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
4123 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
4125 FD_SET(INVALID_SOCKET
, &readfds
);
4127 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4128 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
4129 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
4130 ok ( !FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
4133 FD_SET(INVALID_SOCKET
, &writefds
);
4135 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4136 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
4137 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
4138 ok ( !FD_ISSET(fdRead
, &writefds
), "FD should not be set\n");
4141 FD_SET(INVALID_SOCKET
, &exceptfds
);
4143 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4144 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
4145 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
4146 ok ( !FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
4148 tcp_socketpair(&fdRead
, &fdWrite
);
4150 if(fdWrite
> maxfd
) maxfd
= fdWrite
;
4153 FD_SET(fdRead
, &readfds
);
4155 ret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
4156 ok(ret
, "QueueUserAPC returned %d\n", ret
);
4157 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
4158 ok(!ret
, "select returned %d\n", ret
);
4159 ok(apc_count
== 1, "got apc_count %d.\n", apc_count
);
4162 FD_SET(fdWrite
, &writefds
);
4164 ret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
4165 ok(ret
, "QueueUserAPC returned %d\n", ret
);
4166 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
4167 ok(ret
== 1, "select returned %d\n", ret
);
4168 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
4169 ok(!apc_count
, "APC was called\n");
4171 ok(apc_count
== 1, "got apc_count %d.\n", apc_count
);
4173 /* select the same socket twice */
4174 writefds
.fd_count
= 2;
4175 writefds
.fd_array
[0] = fdWrite
;
4176 writefds
.fd_array
[1] = fdWrite
;
4177 ret
= select(0, NULL
, &writefds
, NULL
, &select_timeout
);
4178 ok(ret
== 1, "select returned %d\n", ret
);
4179 ok(writefds
.fd_count
== 1, "got count %u\n", writefds
.fd_count
);
4180 ok(writefds
.fd_array
[0] == fdWrite
, "got fd %#Ix\n", writefds
.fd_array
[0]);
4181 ok(writefds
.fd_array
[1] == fdWrite
, "got fd %#Ix\n", writefds
.fd_array
[1]);
4183 /* tests for overlapping fd_set pointers */
4185 FD_SET(fdWrite
, &readfds
);
4186 ret
= select(fdWrite
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
4187 ok(ret
== 1, "select returned %d\n", ret
);
4188 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4191 FD_SET(fdWrite
, &readfds
);
4192 FD_SET(fdRead
, &readfds
);
4193 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
4194 ok(ret
== 2, "select returned %d\n", ret
);
4195 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4196 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4198 ok(send(fdWrite
, "test", 4, 0) == 4, "failed to send data\n");
4200 FD_SET(fdRead
, &readfds
);
4201 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
4202 ok(ret
== 1, "select returned %d\n", ret
);
4203 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4206 FD_SET(fdWrite
, &readfds
);
4207 FD_SET(fdRead
, &readfds
);
4208 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
4209 ok(ret
== 2, "select returned %d\n", ret
);
4210 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4211 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4215 FD_SET(fdWrite
, &writefds
);
4216 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
4218 ok(send(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0) > 0, "failed to send data\n");
4221 FD_SET(fdWrite
, &readfds
);
4222 FD_SET(fdRead
, &readfds
);
4223 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
4224 ok(ret
== 1, "select returned %d\n", ret
);
4225 ok(!FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is in the set\n");
4226 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4228 ok(send(fdRead
, "test", 4, 0) == 4, "failed to send data\n");
4231 FD_SET(fdWrite
, &readfds
);
4232 FD_SET(fdRead
, &readfds
);
4233 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
4234 ok(ret
== 2, "select returned %d\n", ret
);
4235 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4236 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4238 page_pair
= VirtualAlloc(NULL
, 0x1000 * 2, MEM_RESERVE
| MEM_COMMIT
, PAGE_READWRITE
);
4239 VirtualProtect(page_pair
+ 0x1000, 0x1000, PAGE_NOACCESS
, &old_protect
);
4240 alloc_fds
= (fd_set
*)((page_pair
+ 0x1000) - offsetof(fd_set
, fd_array
[1]));
4241 alloc_fds
->fd_count
= 1;
4242 alloc_fds
->fd_array
[0] = fdRead
;
4243 ret
= select(fdRead
+1, alloc_fds
, NULL
, NULL
, &select_timeout
);
4244 ok(ret
== 1, "select returned %d\n", ret
);
4245 VirtualFree(page_pair
, 0, MEM_RELEASE
);
4247 closesocket(fdRead
);
4248 closesocket(fdWrite
);
4250 alloc_fds
= malloc(offsetof(fd_set
, fd_array
[ARRAY_SIZE(sockets
)]));
4251 alloc_fds
->fd_count
= ARRAY_SIZE(sockets
);
4252 for (i
= 0; i
< ARRAY_SIZE(sockets
); i
+= 2)
4254 tcp_socketpair(&sockets
[i
], &sockets
[i
+ 1]);
4255 alloc_fds
->fd_array
[i
] = sockets
[i
];
4256 alloc_fds
->fd_array
[i
+ 1] = sockets
[i
+ 1];
4258 ret
= select(0, NULL
, alloc_fds
, NULL
, &select_timeout
);
4259 ok(ret
== ARRAY_SIZE(sockets
), "got %d\n", ret
);
4260 for (i
= 0; i
< ARRAY_SIZE(sockets
); ++i
)
4262 ok(alloc_fds
->fd_array
[i
] == sockets
[i
], "got socket %#Ix at index %u\n", alloc_fds
->fd_array
[i
], i
);
4263 closesocket(sockets
[i
]);
4267 /* select() works in 3 distinct states:
4268 * - to check if a connection attempt ended with success or error;
4269 * - to check if a pending connection is waiting for acceptance;
4270 * - to check for data to read, availability for write and OOB data
4272 * The tests below ensure that all conditions are tested.
4274 memset(&address
, 0, sizeof(address
));
4275 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
4276 address
.sin_family
= AF_INET
;
4277 len
= sizeof(address
);
4278 fdListen
= setup_server_socket(&address
, &len
);
4279 select_timeout
.tv_sec
= 1;
4280 select_timeout
.tv_usec
= 250000;
4282 /* When no events are pending select returns 0 with no error */
4284 FD_SET_ALL(fdListen
);
4285 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4286 ok(ret
== 0, "expected 0, got %d\n", ret
);
4288 /* When a socket is attempting to connect the listening socket receives the read descriptor */
4289 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
4291 FD_SET_ALL(fdListen
);
4292 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4293 ok(ret
== 1, "expected 1, got %d\n", ret
);
4294 ok(FD_ISSET(fdListen
, &readfds
), "fdListen socket is not in the set\n");
4295 len
= sizeof(address
);
4296 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
4297 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
4299 /* The connector is signaled through the write descriptor */
4301 FD_SET_ALL(fdListen
);
4303 FD_SET_ALL(fdWrite
);
4304 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4305 ok(ret
== 2, "expected 2, got %d\n", ret
);
4306 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
4307 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
4310 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
4311 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4312 ok(id
== 0, "expected 0, got %ld\n", id
);
4314 /* When data is received the receiver gets the read descriptor */
4315 ret
= send(fdWrite
, "1234", 4, 0);
4316 ok(ret
== 4, "expected 4, got %d\n", ret
);
4318 FD_SET_ALL(fdListen
);
4319 FD_SET(fdRead
, &readfds
);
4320 FD_SET(fdRead
, &exceptfds
);
4321 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4322 ok(ret
== 1, "expected 1, got %d\n", ret
);
4323 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4324 ok(!FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is in the set\n");
4327 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4328 ok(ret
== 2, "expected 1, got %d\n", ret
);
4329 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4330 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
4331 ok(!FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is in the set\n");
4332 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
4333 ok(ret
== 4, "expected 4, got %d\n", ret
);
4334 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
4336 /* When OOB data is received the socket is set in the except descriptor */
4337 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
4338 ok(ret
== 1, "expected 1, got %d\n", ret
);
4340 FD_SET_ALL(fdListen
);
4341 FD_SET(fdRead
, &readfds
);
4342 FD_SET(fdRead
, &exceptfds
);
4343 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4344 ok(ret
== 1, "expected 1, got %d\n", ret
);
4345 ok(FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is not in the set\n");
4347 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
4348 ok(ret
== 1, "expected 1, got %d\n", ret
);
4349 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
4351 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
4353 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
4354 ok(ret
== 0, "expected 0, got %d\n", ret
);
4355 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
4356 ok(ret
== 1, "expected 1, got %d\n", ret
);
4358 FD_SET_ALL(fdListen
);
4359 FD_SET(fdRead
, &readfds
);
4360 FD_SET(fdRead
, &exceptfds
);
4361 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4362 ok(ret
== 1, "expected 1, got %d\n", ret
);
4363 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
4365 SetLastError(0xdeadbeef);
4366 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
4367 ok(ret
== SOCKET_ERROR
, "expected SOCKET_ERROR, got %d\n", ret
);
4368 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %ld\n", GetLastError());
4369 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
4370 ok(ret
== 1, "expected 1, got %d\n", ret
);
4371 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
4373 /* When the connection is closed the socket is set in the read descriptor */
4374 ret
= closesocket(fdRead
);
4375 ok(ret
== 0, "expected 0, got %d\n", ret
);
4377 FD_SET_ALL(fdListen
);
4378 FD_SET(fdWrite
, &readfds
);
4379 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4380 ok(ret
== 1, "expected 1, got %d\n", ret
);
4381 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4382 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
4383 ok(ret
== 0, "expected 0, got %d\n", ret
);
4384 ret
= closesocket(fdWrite
);
4385 ok(ret
== 0, "expected 0, got %d\n", ret
);
4387 /* w10pro64 sometimes takes over 2 seconds for an error to be reported. */
4388 if (winetest_interactive
)
4390 const struct sockaddr_in invalid_addr
=
4392 .sin_family
= AF_INET
,
4393 .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
),
4396 SOCKET client2
, server2
;
4398 fdWrite
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4399 set_blocking(fdWrite
, FALSE
);
4401 ret
= connect(fdWrite
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
4402 ok(ret
== -1, "got %d\n", ret
);
4403 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
4406 FD_SET(fdWrite
, &readfds
);
4407 FD_SET(fdWrite
, &writefds
);
4408 FD_SET(fdWrite
, &exceptfds
);
4409 select_timeout
.tv_sec
= 10;
4410 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4411 ok(ret
== 1, "expected 1, got %d\n", ret
);
4412 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
4413 ok(select_timeout
.tv_usec
== 250000, "select timeout should not have changed\n");
4417 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4418 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4419 ok(id
== WSAECONNREFUSED
, "got error %lu\n", id
);
4423 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4424 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4425 ok(id
== WSAECONNREFUSED
, "got error %lu\n", id
);
4428 FD_SET(fdWrite
, &readfds
);
4429 FD_SET(fdWrite
, &writefds
);
4430 FD_SET(fdWrite
, &exceptfds
);
4431 select_timeout
.tv_sec
= 10;
4432 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4433 ok(ret
== 1, "got %d\n", ret
);
4434 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
4436 /* Calling connect() doesn't reset the socket error, but a successful
4437 * connection does. This is kind of tricky to test, because while
4438 * Windows takes a couple seconds to actually fail the connection,
4439 * Linux will fail the connection almost immediately. */
4441 ret
= connect(fdWrite
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
4442 ok(ret
== -1, "got %d\n", ret
);
4443 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
4447 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4448 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4449 ok(id
== WSAECONNREFUSED
, "got error %lu\n", id
);
4452 FD_SET(fdWrite
, &readfds
);
4453 FD_SET(fdWrite
, &writefds
);
4454 FD_SET(fdWrite
, &exceptfds
);
4455 select_timeout
.tv_sec
= 10;
4456 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4457 ok(ret
== 1, "got %d\n", ret
);
4458 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
4460 len
= sizeof(address
);
4461 ret
= getsockname(fdListen
, (struct sockaddr
*)&address
, &len
);
4462 ok(!ret
, "got error %u\n", WSAGetLastError());
4463 ret
= connect(fdWrite
, (const struct sockaddr
*)&address
, sizeof(address
));
4464 ok(ret
== -1, "got %d\n", ret
);
4465 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
4468 FD_SET(fdWrite
, &readfds
);
4469 FD_SET(fdWrite
, &writefds
);
4470 FD_SET(fdWrite
, &exceptfds
);
4471 select_timeout
.tv_sec
= 1;
4472 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4473 ok(ret
== 1, "expected 1, got %d\n", ret
);
4474 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
4478 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4479 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4480 ok(!id
, "got error %lu\n", id
);
4482 closesocket(fdWrite
);
4484 /* Test listening after a failed connection. */
4486 fdWrite
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4487 set_blocking(fdWrite
, FALSE
);
4489 address
.sin_family
= AF_INET
;
4490 address
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
4491 address
.sin_port
= 0;
4492 ret
= bind(fdWrite
, (struct sockaddr
*)&address
, sizeof(address
));
4493 ok(!ret
, "got %d\n", ret
);
4495 ret
= connect(fdWrite
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
4496 ok(ret
== -1, "got %d\n", ret
);
4497 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
4499 FD_ZERO(&exceptfds
);
4500 FD_SET(fdWrite
, &exceptfds
);
4501 select_timeout
.tv_sec
= 10;
4502 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
4503 ok(ret
== 1, "expected 1, got %d\n", ret
);
4505 len
= sizeof(address
);
4506 ret
= getsockname(fdWrite
, (struct sockaddr
*)&address
, &len
);
4507 ok(!ret
, "got error %lu\n", GetLastError());
4509 /* Linux seems to forbid this. We'd need to replace the underlying fd. */
4510 ret
= listen(fdWrite
, 1);
4511 todo_wine
ok(!ret
, "got error %lu\n", GetLastError());
4515 client2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4516 ret
= connect(client2
, (struct sockaddr
*)&address
, sizeof(address
));
4517 ok(!ret
, "got error %lu\n", GetLastError());
4519 server2
= accept(fdWrite
, NULL
, NULL
);
4520 ok(server2
!= INVALID_SOCKET
, "got %d\n", ret
);
4522 closesocket(server2
);
4523 closesocket(client2
);
4528 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4529 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4530 ok(id
== WSAECONNREFUSED
, "got error %lu\n", id
);
4533 FD_SET(fdWrite
, &readfds
);
4534 FD_SET(fdWrite
, &writefds
);
4535 FD_SET(fdWrite
, &exceptfds
);
4536 select_timeout
.tv_sec
= 0;
4537 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4538 ok(ret
== 1, "got %d\n", ret
);
4539 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
4541 closesocket(fdWrite
);
4543 /* test polling after a (synchronous) failure */
4545 fdWrite
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4547 ret
= connect(fdWrite
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
4548 ok(ret
== -1, "got %d\n", ret
);
4549 ok(WSAGetLastError() == WSAECONNREFUSED
, "got error %u\n", WSAGetLastError());
4553 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4554 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4555 todo_wine
ok(!id
, "got error %lu\n", id
);
4558 FD_SET(fdWrite
, &readfds
);
4559 FD_SET(fdWrite
, &writefds
);
4560 FD_SET(fdWrite
, &exceptfds
);
4561 select_timeout
.tv_sec
= 0;
4562 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4563 ok(ret
== 1, "expected 1, got %d\n", ret
);
4564 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
4568 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char *)&id
, &len
);
4569 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
4570 todo_wine
ok(!id
, "got error %lu\n", id
);
4572 closesocket(fdWrite
);
4575 ret
= closesocket(fdListen
);
4576 ok(ret
== 0, "expected 0, got %d\n", ret
);
4578 select_timeout
.tv_sec
= 1;
4579 select_timeout
.tv_usec
= 250000;
4581 /* Try select() on a closed socket after connection */
4582 tcp_socketpair(&fdRead
, &fdWrite
);
4583 closesocket(fdRead
);
4585 FD_SET_ALL(fdWrite
);
4587 SetLastError(0xdeadbeef);
4588 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
4589 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
4590 ok(GetLastError() == WSAENOTSOCK
, "got %ld\n", GetLastError());
4591 /* descriptor sets are unchanged */
4592 ok(readfds
.fd_count
== 2, "expected 2, got %d\n", readfds
.fd_count
);
4593 ok(exceptfds
.fd_count
== 2, "expected 2, got %d\n", exceptfds
.fd_count
);
4594 closesocket(fdWrite
);
4596 /* Close the socket currently being selected in a thread - bug 38399 */
4597 tcp_socketpair(&fdRead
, &fdWrite
);
4598 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
4599 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %ld\n", GetLastError());
4601 FD_SET_ALL(fdWrite
);
4602 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
4603 ok(ret
== 1, "expected 1, got %d\n", ret
);
4604 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
4605 WaitForSingleObject (thread_handle
, 1000);
4606 closesocket(fdRead
);
4607 /* test again with only the except descriptor */
4608 tcp_socketpair(&fdRead
, &fdWrite
);
4609 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
4610 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %ld\n", GetLastError());
4612 FD_SET(fdWrite
, &exceptfds
);
4613 SetLastError(0xdeadbeef);
4614 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
4615 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
4616 ok(GetLastError() == WSAENOTSOCK
, "got %ld\n", GetLastError());
4617 ok(!FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is in the set\n");
4618 WaitForSingleObject (thread_handle
, 1000);
4619 closesocket(fdRead
);
4621 /* test UDP behavior of unbound sockets */
4622 select_timeout
.tv_sec
= 0;
4623 select_timeout
.tv_usec
= 250000;
4624 fdWrite
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
4625 ok(fdWrite
!= INVALID_SOCKET
, "socket call failed\n");
4627 FD_SET_ALL(fdWrite
);
4628 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
4629 ok(ret
== 1, "expected 1, got %d\n", ret
);
4630 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
4631 closesocket(fdWrite
);
4636 static DWORD WINAPI
AcceptKillThread(void *param
)
4638 select_thread_params
*par
= param
;
4639 struct sockaddr_in address
;
4640 int len
= sizeof(address
);
4641 SOCKET client_socket
;
4643 SetEvent(server_ready
);
4644 client_socket
= accept(par
->s
, (struct sockaddr
*) &address
, &len
);
4645 if (client_socket
!= INVALID_SOCKET
)
4646 closesocket(client_socket
);
4647 par
->ReadKilled
= (client_socket
== INVALID_SOCKET
);
4652 static int CALLBACK
AlwaysDeferConditionFunc(LPWSABUF lpCallerId
, LPWSABUF lpCallerData
, LPQOS pQos
,
4653 LPQOS lpGQOS
, LPWSABUF lpCalleeId
, LPWSABUF lpCalleeData
,
4654 GROUP
*g
, DWORD_PTR dwCallbackData
)
4659 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
)
4662 SOCKET server_socket
;
4664 server_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
4665 ok(server_socket
!= INVALID_SOCKET
, "failed to bind socket, error %u\n", WSAGetLastError());
4668 ret
= setsockopt(server_socket
, SOL_SOCKET
, SO_REUSEADDR
, (char *)&val
, sizeof(val
));
4669 ok(!ret
, "failed to set SO_REUSEADDR, error %u\n", WSAGetLastError());
4671 ret
= bind(server_socket
, (struct sockaddr
*)addr
, *len
);
4672 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
4674 ret
= getsockname(server_socket
, (struct sockaddr
*)addr
, len
);
4675 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
4677 ret
= listen(server_socket
, 5);
4678 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
4680 return server_socket
;
4683 static SOCKET
setup_connector_socket(const struct sockaddr_in
*addr
, int len
, BOOL nonblock
)
4688 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
4689 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket %d\n", WSAGetLastError());
4692 set_blocking(connector
, !nonblock
);
4694 ret
= connect(connector
, (const struct sockaddr
*)addr
, len
);
4696 ok(!ret
, "connecting to accepting socket failed %d\n", WSAGetLastError());
4697 else if (ret
== SOCKET_ERROR
)
4698 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
4703 struct connect_apc_func_param
4706 struct sockaddr_in addr
;
4708 unsigned int apc_count
;
4711 static DWORD WINAPI
test_accept_connect_thread(void *param
)
4713 struct connect_apc_func_param
*p
= (struct connect_apc_func_param
*)param
;
4715 WaitForSingleObject(p
->event
, INFINITE
);
4716 p
->connector
= setup_connector_socket(&p
->addr
, sizeof(p
->addr
), FALSE
);
4717 ok(p
->connector
!= INVALID_SOCKET
, "failed connecting from APC func.\n");
4721 static void WINAPI
connect_apc_func(ULONG_PTR param
)
4723 struct connect_apc_func_param
*p
= (struct connect_apc_func_param
*)param
;
4729 static void test_accept(void)
4732 SOCKET server_socket
, accepted
= INVALID_SOCKET
, connector
;
4733 struct connect_apc_func_param apc_param
;
4734 struct sockaddr_in address
;
4735 SOCKADDR_STORAGE ss
, ss_empty
;
4737 select_thread_params thread_params
;
4738 HANDLE thread_handle
= NULL
;
4741 memset(&address
, 0, sizeof(address
));
4742 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
4743 address
.sin_family
= AF_INET
;
4745 socklen
= sizeof(address
);
4746 server_socket
= setup_server_socket(&address
, &socklen
);
4748 memset(&apc_param
, 0, sizeof(apc_param
));
4749 apc_param
.event
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
4750 apc_param
.addr
= address
;
4751 /* Connecting directly from APC function randomly crashes on Windows for some reason,
4752 * so do it from a thread and only signal it from the APC when we are in accept() call. */
4753 thread_handle
= CreateThread(NULL
, 0, test_accept_connect_thread
, &apc_param
, 0, NULL
);
4754 ret
= QueueUserAPC(connect_apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_param
);
4755 ok(ret
, "QueueUserAPC returned %d\n", ret
);
4756 accepted
= accept(server_socket
, NULL
, NULL
);
4757 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4758 ok(apc_param
.apc_count
== 1, "APC was called %u times\n", apc_param
.apc_count
);
4759 closesocket(accepted
);
4760 closesocket(apc_param
.connector
);
4761 WaitForSingleObject(thread_handle
, INFINITE
);
4762 CloseHandle(thread_handle
);
4763 CloseHandle(apc_param
.event
);
4765 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4766 if (connector
== INVALID_SOCKET
) goto done
;
4768 accepted
= WSAAccept(server_socket
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
4769 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
4771 accepted
= accept(server_socket
, NULL
, 0);
4772 ok(accepted
!= INVALID_SOCKET
, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4774 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
4776 thread_params
.s
= server_socket
;
4777 thread_params
.ReadKilled
= FALSE
;
4778 thread_handle
= CreateThread(NULL
, 0, AcceptKillThread
, &thread_params
, 0, &id
);
4780 WaitForSingleObject(server_ready
, INFINITE
);
4782 ret
= closesocket(server_socket
);
4783 ok(!ret
, "failed to close socket, error %u\n", WSAGetLastError());
4785 WaitForSingleObject(thread_handle
, 1000);
4786 ok(thread_params
.ReadKilled
, "closesocket did not wake up accept\n");
4788 closesocket(accepted
);
4789 closesocket(connector
);
4790 accepted
= connector
= INVALID_SOCKET
;
4792 socklen
= sizeof(address
);
4793 server_socket
= setup_server_socket(&address
, &socklen
);
4795 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4796 if (connector
== INVALID_SOCKET
) goto done
;
4799 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4800 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4801 ok(!socklen
, "got %d\n", socklen
);
4802 closesocket(connector
);
4803 connector
= INVALID_SOCKET
;
4805 socklen
= sizeof(address
);
4806 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4807 if (connector
== INVALID_SOCKET
) goto done
;
4809 accepted
= WSAAccept(server_socket
, NULL
, NULL
, NULL
, 0);
4810 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4811 closesocket(accepted
);
4812 closesocket(connector
);
4813 accepted
= connector
= INVALID_SOCKET
;
4815 socklen
= sizeof(address
);
4816 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4817 if (connector
== INVALID_SOCKET
) goto done
;
4819 socklen
= sizeof(ss
);
4820 memset(&ss
, 0, sizeof(ss
));
4821 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4822 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4823 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4824 ok(ss
.ss_family
, "family not set\n");
4825 closesocket(accepted
);
4826 closesocket(connector
);
4827 accepted
= connector
= INVALID_SOCKET
;
4829 socklen
= sizeof(address
);
4830 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4831 if (connector
== INVALID_SOCKET
) goto done
;
4834 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4835 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4836 ok(!socklen
, "got %d\n", socklen
);
4837 closesocket(connector
);
4838 accepted
= connector
= INVALID_SOCKET
;
4840 socklen
= sizeof(address
);
4841 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4842 if (connector
== INVALID_SOCKET
) goto done
;
4844 accepted
= accept(server_socket
, NULL
, NULL
);
4845 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4846 closesocket(accepted
);
4847 closesocket(connector
);
4848 accepted
= connector
= INVALID_SOCKET
;
4850 socklen
= sizeof(address
);
4851 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4852 if (connector
== INVALID_SOCKET
) goto done
;
4854 socklen
= sizeof(ss
);
4855 memset(&ss
, 0, sizeof(ss
));
4856 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4857 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4858 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4859 ok(ss
.ss_family
, "family not set\n");
4860 closesocket(accepted
);
4861 closesocket(connector
);
4862 accepted
= connector
= INVALID_SOCKET
;
4864 socklen
= sizeof(address
);
4865 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4866 if (connector
== INVALID_SOCKET
) goto done
;
4868 memset(&ss
, 0, sizeof(ss
));
4869 memset(&ss_empty
, 0, sizeof(ss_empty
));
4870 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, NULL
);
4871 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4872 ok(!memcmp(&ss
, &ss_empty
, sizeof(ss
)), "structure is different\n");
4875 if (accepted
!= INVALID_SOCKET
)
4876 closesocket(accepted
);
4877 if (connector
!= INVALID_SOCKET
)
4878 closesocket(connector
);
4879 if (thread_handle
!= NULL
)
4880 CloseHandle(thread_handle
);
4881 if (server_ready
!= INVALID_HANDLE_VALUE
)
4882 CloseHandle(server_ready
);
4883 if (server_socket
!= INVALID_SOCKET
)
4884 closesocket(server_socket
);
4887 /* Test what socket state is inherited from the listening socket by accept(). */
4888 static void test_accept_inheritance(void)
4890 struct sockaddr_in addr
, destaddr
;
4891 SOCKET listener
, server
, client
;
4892 struct linger linger
;
4893 int ret
, len
, value
;
4904 {SOL_SOCKET
, SO_REUSEADDR
, 1},
4905 {SOL_SOCKET
, SO_KEEPALIVE
, 1},
4906 {SOL_SOCKET
, SO_OOBINLINE
, 1},
4907 {SOL_SOCKET
, SO_SNDBUF
, 0x123},
4908 {SOL_SOCKET
, SO_RCVBUF
, 0x123},
4909 {SOL_SOCKET
, SO_SNDTIMEO
, 0x123},
4910 {SOL_SOCKET
, SO_RCVTIMEO
, 0x123},
4911 {IPPROTO_TCP
, TCP_NODELAY
, 1},
4914 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4915 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4917 for (i
= 0; i
< ARRAY_SIZE(int_tests
); ++i
)
4919 ret
= setsockopt(listener
, int_tests
[i
].optname
, int_tests
[i
].optval
,
4920 (char *)&int_tests
[i
].value
, sizeof(int_tests
[i
].value
));
4921 ok(!ret
, "test %u: got error %u\n", i
, WSAGetLastError());
4925 linger
.l_linger
= 555;
4926 ret
= setsockopt(listener
, SOL_SOCKET
, SO_LINGER
, (char *)&linger
, sizeof(linger
));
4927 ok(!ret
, "got error %u\n", WSAGetLastError());
4929 memset(&addr
, 0, sizeof(addr
));
4930 addr
.sin_family
= AF_INET
;
4931 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
4932 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
4933 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
4934 len
= sizeof(destaddr
);
4935 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
4936 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
4938 ret
= listen(listener
, 1);
4939 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
4941 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4942 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
4943 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
4944 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
4945 server
= accept(listener
, NULL
, NULL
);
4946 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
4948 for (i
= 0; i
< ARRAY_SIZE(int_tests
); ++i
)
4951 len
= sizeof(value
);
4952 ret
= getsockopt(server
, int_tests
[i
].optname
, int_tests
[i
].optval
, (char *)&value
, &len
);
4953 ok(!ret
, "test %u: got error %u\n", i
, WSAGetLastError());
4954 ok(value
== int_tests
[i
].value
, "test %u: got value %#x\n", i
, value
);
4957 len
= sizeof(linger
);
4958 memset(&linger
, 0, sizeof(linger
));
4959 ret
= getsockopt(server
, SOL_SOCKET
, SO_LINGER
, (char *)&linger
, &len
);
4960 ok(!ret
, "got error %u\n", WSAGetLastError());
4961 ok(linger
.l_onoff
== 1, "got on/off %u\n", linger
.l_onoff
);
4962 ok(linger
.l_linger
== 555, "got linger %u\n", linger
.l_onoff
);
4964 closesocket(server
);
4965 closesocket(client
);
4966 closesocket(listener
);
4969 static void test_extendedSocketOptions(void)
4973 struct sockaddr_in sa
;
4974 int sa_len
= sizeof(struct sockaddr_in
);
4975 int optval
, optlen
= sizeof(int), ret
;
4979 ret
= WSAStartup(MAKEWORD(2,0), &wsa
);
4980 ok(!ret
, "failed to startup, error %u\n", WSAGetLastError());
4982 memset(&sa
, 0, sa_len
);
4984 sa
.sin_family
= AF_INET
;
4985 sa
.sin_port
= htons(0);
4986 sa
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
4988 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
4989 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
4991 ret
= bind(sock
, (struct sockaddr
*) &sa
, sa_len
);
4992 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
4994 ret
= getsockopt(sock
, SOL_SOCKET
, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4996 ok(ret
== 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret
);
4997 ok((optval
== 65507) || (optval
== 65527),
4998 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval
);
5000 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
5001 SetLastError(0xdeadbeef);
5002 optval
= 0xdeadbeef;
5003 optlen
= sizeof(int);
5004 ret
= getsockopt(sock
, 0xffffffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
5005 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
5006 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
5007 ret
, WSAGetLastError(), optval
, optval
);
5009 /* more invalid values for level */
5010 SetLastError(0xdeadbeef);
5011 optval
= 0xdeadbeef;
5012 optlen
= sizeof(int);
5013 ret
= getsockopt(sock
, 0x1234ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
5014 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
5015 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
5016 ret
, WSAGetLastError(), optval
, optval
);
5018 SetLastError(0xdeadbeef);
5019 optval
= 0xdeadbeef;
5020 optlen
= sizeof(int);
5021 ret
= getsockopt(sock
, 0x8000ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
5022 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
5023 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
5024 ret
, WSAGetLastError(), optval
, optval
);
5026 SetLastError(0xdeadbeef);
5027 optval
= 0xdeadbeef;
5028 optlen
= sizeof(int);
5029 ret
= getsockopt(sock
, 0x00008000, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
5030 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
5031 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
5032 ret
, WSAGetLastError(), optval
, optval
);
5034 SetLastError(0xdeadbeef);
5035 optval
= 0xdeadbeef;
5036 optlen
= sizeof(int);
5037 ret
= getsockopt(sock
, 0x00000800, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
5038 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
5039 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
5040 ret
, WSAGetLastError(), optval
, optval
);
5042 SetLastError(0xdeadbeef);
5043 optlen
= sizeof(LINGER
);
5044 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
5045 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOPROTOOPT
),
5046 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
5047 ret
, WSAGetLastError());
5050 sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
);
5051 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
5053 ret
= bind(sock
, (struct sockaddr
*) &sa
, sa_len
);
5054 ok(!ret
, "failed to bind socket, error %u\n", WSAGetLastError());
5056 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
5057 ok(ret
== 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret
);
5059 optlen
= sizeof(BOOL
);
5060 ret
= getsockopt(sock
, SOL_SOCKET
, SO_DONTLINGER
, (char *)&bool_opt_val
, &optlen
);
5061 ok(ret
== 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret
);
5062 ok((linger_val
.l_onoff
&& !bool_opt_val
) || (!linger_val
.l_onoff
&& bool_opt_val
),
5063 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
5064 bool_opt_val
, linger_val
.l_onoff
);
5070 static void test_getsockname(void)
5074 struct sockaddr_in sa_set
, sa_get
;
5075 int sa_set_len
= sizeof(struct sockaddr_in
);
5076 int sa_get_len
= sa_set_len
;
5077 static const unsigned char null_padding
[] = {0,0,0,0,0,0,0,0};
5081 ret
= WSAStartup(MAKEWORD(2,0), &wsa
);
5082 ok(!ret
, "failed to startup, error %u\n", WSAGetLastError());
5084 memset(&sa_set
, 0, sa_set_len
);
5086 sa_set
.sin_family
= AF_INET
;
5087 sa_set
.sin_port
= htons(0);
5088 sa_set
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
5090 sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
);
5091 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
5094 WSASetLastError(0xdeadbeef);
5095 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
5096 ok(ret
== SOCKET_ERROR
, "expected failure\n");
5097 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
5098 ok(!memcmp(&sa_get
, &sa_set
, sizeof(sa_get
)), "address should not be changed\n");
5100 ret
= bind(sock
, (struct sockaddr
*) &sa_set
, sa_set_len
);
5101 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
5103 WSASetLastError(0xdeadbeef);
5104 memset(&sa_get
, 0, sizeof(sa_get
));
5105 ret
= getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
);
5106 ok(!ret
, "got %d\n", ret
);
5107 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
5108 ok(sa_get
.sin_family
== AF_INET
, "got family %#x\n", sa_get
.sin_family
);
5109 ok(sa_get
.sin_port
!= 0, "got zero port\n");
5110 ok(sa_get
.sin_addr
.s_addr
== INADDR_ANY
, "got addr %08lx\n", sa_get
.sin_addr
.s_addr
);
5112 ret
= memcmp(sa_get
.sin_zero
, null_padding
, 8);
5113 ok(ret
== 0, "getsockname did not zero the sockaddr_in structure\n");
5115 sa_get_len
= sizeof(sa_get
) - 1;
5116 WSASetLastError(0xdeadbeef);
5117 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
5118 ok(ret
== -1, "expected failure\n");
5119 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5120 ok(sa_get_len
== sizeof(sa_get
) - 1, "got size %d\n", sa_get_len
);
5124 h
= gethostbyname("");
5125 if (h
&& h
->h_length
== 4) /* this test is only meaningful in IPv4 */
5128 for (i
= 0; h
->h_addr_list
[i
]; i
++)
5132 ip
.s_addr
= *(ULONG
*) h
->h_addr_list
[i
];
5134 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
5135 ok(sock
!= INVALID_SOCKET
, "socket failed with %ld\n", GetLastError());
5137 memset(&sa_set
, 0, sizeof(sa_set
));
5138 sa_set
.sin_family
= AF_INET
;
5139 sa_set
.sin_addr
.s_addr
= ip
.s_addr
;
5140 /* The same address we bind must be the same address we get */
5141 ret
= bind(sock
, (struct sockaddr
*)&sa_set
, sizeof(sa_set
));
5142 ok(ret
== 0, "bind failed with %ld\n", GetLastError());
5143 sa_get_len
= sizeof(sa_get
);
5144 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
5145 ok(ret
== 0, "getsockname failed with %ld\n", GetLastError());
5146 strcpy(ipstr
, inet_ntoa(sa_get
.sin_addr
));
5147 ok(sa_get
.sin_addr
.s_addr
== sa_set
.sin_addr
.s_addr
,
5148 "address does not match: %s != %s\n", ipstr
, inet_ntoa(sa_set
.sin_addr
));
5157 static DWORD apc_error
, apc_size
;
5158 static OVERLAPPED
*apc_overlapped
;
5159 static unsigned int apc_count
;
5161 static void WINAPI
socket_apc(DWORD error
, DWORD size
, OVERLAPPED
*overlapped
, DWORD flags
)
5163 ok(!flags
, "got flags %#lx\n", flags
);
5167 apc_overlapped
= overlapped
;
5170 #define check_fionread_siocatmark(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, FALSE, FALSE)
5171 #define check_fionread_siocatmark_todo(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, TRUE, TRUE)
5172 #define check_fionread_siocatmark_todo_oob(a, b, c) check_fionread_siocatmark_(__LINE__, a, b, c, FALSE, TRUE)
5173 static void check_fionread_siocatmark_(int line
, SOCKET s
, unsigned int normal
, unsigned int oob
,
5174 BOOL todo_normal
, BOOL todo_oob
)
5180 WSASetLastError(0xdeadbeef);
5181 ret
= WSAIoctl(s
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, NULL
, NULL
);
5182 ok_(__FILE__
, line
)(!ret
, "expected success\n");
5183 ok_(__FILE__
, line
)(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5184 todo_wine_if (todo_normal
) ok_(__FILE__
, line
)(value
== normal
, "FIONBIO returned %u\n", value
);
5187 WSASetLastError(0xdeadbeef);
5188 ret
= WSAIoctl(s
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, NULL
, NULL
);
5189 ok_(__FILE__
, line
)(!ret
, "expected success\n");
5190 ok_(__FILE__
, line
)(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5191 todo_wine_if (todo_oob
) ok_(__FILE__
, line
)(value
== oob
, "SIOCATMARK returned %u\n", value
);
5194 static void test_fionread_siocatmark(void)
5196 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
5197 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5198 SOCKET client
, server
;
5205 tcp_socketpair(&client
, &server
);
5206 set_blocking(client
, FALSE
);
5207 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
5209 WSASetLastError(0xdeadbeef);
5210 ret
= ioctlsocket(client
, FIONREAD
, (u_long
*)1);
5211 ok(ret
== -1, "expected failure\n");
5212 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5214 WSASetLastError(0xdeadbeef);
5215 ret
= ioctlsocket(client
, SIOCATMARK
, (u_long
*)1);
5216 ok(ret
== -1, "expected failure\n");
5217 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5219 WSASetLastError(0xdeadbeef);
5220 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, NULL
, NULL
);
5221 ok(ret
== -1, "expected failure\n");
5222 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5224 WSASetLastError(0xdeadbeef);
5226 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
) - 1, &size
, NULL
, NULL
);
5227 ok(ret
== -1, "expected failure\n");
5228 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5229 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5231 WSASetLastError(0xdeadbeef);
5232 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, NULL
, NULL
);
5233 ok(ret
== -1, "expected failure\n");
5234 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5236 WSASetLastError(0xdeadbeef);
5238 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
) - 1, &size
, NULL
, NULL
);
5239 ok(ret
== -1, "expected failure\n");
5240 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5241 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5243 check_fionread_siocatmark(client
, 0, TRUE
);
5245 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 123, 0);
5247 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, NULL
);
5248 ok(ret
== -1, "expected failure\n");
5249 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5251 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, NULL
);
5252 ok(ret
== -1, "expected failure\n");
5253 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5255 WSASetLastError(0xdeadbeef);
5258 overlapped
.Internal
= 0xdeadbeef;
5259 overlapped
.InternalHigh
= 0xdeadbeef;
5260 ret
= WSAIoctl(client
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, NULL
);
5261 ok(!ret
, "expected success\n");
5262 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5263 ok(!value
, "got %u\n", value
);
5264 ok(size
== sizeof(value
), "got size %lu\n", size
);
5265 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5266 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5268 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5269 ok(ret
, "got error %lu\n", GetLastError());
5270 ok(!size
, "got size %lu\n", size
);
5271 ok(key
== 123, "got key %Iu\n", key
);
5272 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5274 WSASetLastError(0xdeadbeef);
5277 overlapped
.Internal
= 0xdeadbeef;
5278 overlapped
.InternalHigh
= 0xdeadbeef;
5279 ret
= WSAIoctl(client
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, NULL
);
5280 ok(!ret
, "expected success\n");
5281 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5282 ok(value
== TRUE
, "got %u\n", value
);
5283 ok(size
== sizeof(value
), "got size %lu\n", size
);
5284 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5285 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5287 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5288 ok(ret
, "got error %lu\n", GetLastError());
5289 ok(!size
, "got size %lu\n", size
);
5290 ok(key
== 123, "got key %Iu\n", key
);
5291 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5293 ret
= send(server
, "data", 5, 0);
5294 ok(ret
== 5, "got %d\n", ret
);
5296 /* wait for the data to be available */
5297 check_poll_mask(client
, POLLRDNORM
, POLLRDNORM
);
5299 check_fionread_siocatmark(client
, 5, TRUE
);
5301 ret
= send(server
, "a", 1, MSG_OOB
);
5302 ok(ret
== 1, "got %d\n", ret
);
5304 /* wait for the data to be available */
5305 check_poll_mask(client
, POLLRDBAND
, POLLRDBAND
);
5307 check_fionread_siocatmark_todo_oob(client
, 5, FALSE
);
5309 ret
= send(server
, "a", 1, MSG_OOB
);
5310 ok(ret
== 1, "got %d\n", ret
);
5312 check_fionread_siocatmark_todo(client
, 5, FALSE
);
5314 ret
= recv(client
, buffer
, 3, 0);
5315 ok(ret
== 3, "got %d\n", ret
);
5317 check_fionread_siocatmark_todo(client
, 2, FALSE
);
5319 ret
= recv(client
, buffer
, 1, MSG_OOB
);
5320 ok(ret
== 1, "got %d\n", ret
);
5322 /* wait for the data to be available */
5323 check_poll_mask_todo(client
, POLLRDBAND
, POLLRDBAND
);
5325 check_fionread_siocatmark_todo(client
, 2, FALSE
);
5327 ret
= recv(client
, buffer
, 5, 0);
5328 todo_wine
ok(ret
== 2, "got %d\n", ret
);
5330 check_fionread_siocatmark(client
, 0, FALSE
);
5332 ret
= recv(client
, buffer
, 1, MSG_OOB
);
5333 todo_wine
ok(ret
== 1, "got %d\n", ret
);
5335 check_fionread_siocatmark_todo_oob(client
, 0, TRUE
);
5337 ret
= send(server
, "a", 1, MSG_OOB
);
5338 ok(ret
== 1, "got %d\n", ret
);
5340 /* wait for the data to be available */
5341 check_poll_mask(client
, POLLRDBAND
, POLLRDBAND
);
5344 ret
= setsockopt(client
, SOL_SOCKET
, SO_OOBINLINE
, (char *)&ret
, sizeof(ret
));
5345 ok(!ret
, "got error %u\n", WSAGetLastError());
5347 check_fionread_siocatmark_todo_oob(client
, 1, FALSE
);
5349 ret
= recv(client
, buffer
, 1, 0);
5350 ok(ret
== 1, "got %d\n", ret
);
5352 check_fionread_siocatmark(client
, 0, TRUE
);
5354 ret
= send(server
, "a", 1, MSG_OOB
);
5355 ok(ret
== 1, "got %d\n", ret
);
5357 /* wait for the data to be available */
5358 check_poll_mask(client
, POLLRDNORM
, POLLRDNORM
);
5360 check_fionread_siocatmark(client
, 1, TRUE
);
5362 closesocket(client
);
5363 closesocket(server
);
5365 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5367 check_fionread_siocatmark(server
, 0, TRUE
);
5369 ret
= bind(server
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
5370 ok(!ret
, "got error %u\n", WSAGetLastError());
5372 check_fionread_siocatmark(server
, 0, TRUE
);
5374 closesocket(server
);
5375 CloseHandle(overlapped
.hEvent
);
5377 /* test with APCs */
5379 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5381 ret
= WSAIoctl(server
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, socket_apc
);
5382 ok(ret
== -1, "expected failure\n");
5383 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5385 ret
= WSAIoctl(server
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), NULL
, &overlapped
, socket_apc
);
5386 ok(ret
== -1, "expected failure\n");
5387 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5391 ret
= WSAIoctl(server
, FIONREAD
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, socket_apc
);
5392 ok(!ret
, "expected success\n");
5393 ok(size
== sizeof(value
), "got size %lu\n", size
);
5395 ret
= SleepEx(0, TRUE
);
5396 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5397 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5398 ok(!apc_error
, "got APC error %lu\n", apc_error
);
5399 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5400 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5404 ret
= WSAIoctl(server
, SIOCATMARK
, NULL
, 0, &value
, sizeof(value
), &size
, &overlapped
, socket_apc
);
5405 ok(!ret
, "expected success\n");
5406 ok(size
== sizeof(value
), "got size %lu\n", size
);
5408 ret
= SleepEx(0, TRUE
);
5409 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5410 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5411 ok(!apc_error
, "got APC error %lu\n", apc_error
);
5412 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5413 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5415 closesocket(server
);
5418 static void test_fionbio(void)
5420 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5421 u_long one
= 1, zero
= 0;
5429 event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
5430 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5431 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
5433 WSASetLastError(0xdeadbeef);
5434 ret
= ioctlsocket(s
, FIONBIO
, (u_long
*)1);
5435 ok(ret
== -1, "expected failure\n");
5436 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5438 WSASetLastError(0xdeadbeef);
5439 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, NULL
, NULL
);
5440 ok(ret
== -1, "expected failure\n");
5441 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5443 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) - 1, NULL
, 0, &size
, &overlapped
, NULL
);
5444 ok(ret
== -1, "expected failure\n");
5445 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5448 WSASetLastError(0xdeadbeef);
5449 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, NULL
, NULL
);
5450 ok(!ret
, "expected success\n");
5451 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5452 ok(!size
, "got size %lu\n", size
);
5454 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) + 1, NULL
, 0, &size
, NULL
, NULL
);
5455 ok(!ret
, "got error %u\n", WSAGetLastError());
5457 output
= VirtualAlloc(NULL
, 4, MEM_RESERVE
| MEM_COMMIT
, PAGE_NOACCESS
);
5458 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
) + 1, output
, 4, &size
, NULL
, NULL
);
5459 ok(!ret
, "got error %u\n", WSAGetLastError());
5460 VirtualFree(output
, 0, MEM_FREE
);
5462 overlapped
.Internal
= 0xdeadbeef;
5463 overlapped
.InternalHigh
= 0xdeadbeef;
5465 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, &overlapped
, NULL
);
5466 ok(!ret
, "expected success\n");
5467 ok(!size
, "got size %lu\n", size
);
5469 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5470 ok(ret
, "got error %lu\n", GetLastError());
5471 ok(!size
, "got size %lu\n", size
);
5472 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5473 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5474 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5476 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, &overlapped
, NULL
);
5477 ok(ret
== -1, "expected failure\n");
5478 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5480 ret
= WSAEventSelect(s
, event
, FD_READ
);
5481 ok(!ret
, "got error %u\n", WSAGetLastError());
5483 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, NULL
, NULL
);
5484 ok(!ret
, "got error %u\n", WSAGetLastError());
5487 ret
= WSAIoctl(s
, FIONBIO
, &zero
, sizeof(zero
), NULL
, 0, &size
, NULL
, NULL
);
5488 ok(ret
== -1, "expected failure\n");
5489 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
5490 todo_wine
ok(!size
, "got size %lu\n", size
);
5496 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5498 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, NULL
, &overlapped
, socket_apc
);
5499 ok(ret
== -1, "expected failure\n");
5500 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5504 ret
= WSAIoctl(s
, FIONBIO
, &one
, sizeof(one
), NULL
, 0, &size
, &overlapped
, socket_apc
);
5505 ok(!ret
, "expected success\n");
5506 ok(!size
, "got size %lu\n", size
);
5508 ret
= SleepEx(0, TRUE
);
5509 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5510 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5511 ok(!apc_error
, "got APC error %lu\n", apc_error
);
5512 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5513 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5518 static void test_keepalive_vals(void)
5520 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5521 struct tcp_keepalive kalive
;
5528 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5529 ok(sock
!= INVALID_SOCKET
, "Creating the socket failed: %d\n", WSAGetLastError());
5530 port
= CreateIoCompletionPort((HANDLE
)sock
, NULL
, 123, 0);
5532 WSASetLastError(0xdeadbeef);
5534 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, 0, NULL
, 0, &size
, NULL
, NULL
);
5535 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5536 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5537 ok(!size
, "got size %lu\n", size
);
5539 WSASetLastError(0xdeadbeef);
5541 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, NULL
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5542 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5543 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5544 ok(!size
, "got size %lu\n", size
);
5546 WSASetLastError(0xdeadbeef);
5548 make_keepalive(kalive
, 0, 0, 0);
5549 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5550 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5551 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5552 ok(!size
, "got size %lu\n", size
);
5554 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, NULL
, NULL
);
5555 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5556 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5558 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, &overlapped
, NULL
);
5559 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5560 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5562 WSASetLastError(0xdeadbeef);
5564 overlapped
.Internal
= 0xdeadbeef;
5565 overlapped
.InternalHigh
= 0xdeadbeef;
5566 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
) - 1, NULL
, 0, &size
, &overlapped
, NULL
);
5567 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5568 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5569 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5570 todo_wine
ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5571 ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
5573 WSASetLastError(0xdeadbeef);
5575 overlapped
.Internal
= 0xdeadbeef;
5576 overlapped
.InternalHigh
= 0xdeadbeef;
5577 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, &overlapped
, NULL
);
5578 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5579 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5580 todo_wine
ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5582 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5583 ok(ret
, "got error %lu\n", GetLastError());
5584 ok(!size
, "got size %lu\n", size
);
5585 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5586 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5587 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5589 make_keepalive(kalive
, 1, 0, 0);
5590 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5591 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5593 make_keepalive(kalive
, 1, 1000, 1000);
5594 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5595 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5597 make_keepalive(kalive
, 1, 10000, 10000);
5598 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5599 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5601 make_keepalive(kalive
, 1, 100, 100);
5602 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5603 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5605 make_keepalive(kalive
, 0, 100, 100);
5606 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, NULL
, NULL
);
5607 ok(ret
== 0, "WSAIoctl failed unexpectedly\n");
5612 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5614 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, NULL
, &overlapped
, socket_apc
);
5615 ok(ret
== -1, "expected failure\n");
5616 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5620 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(kalive
), NULL
, 0, &size
, &overlapped
, socket_apc
);
5621 ok(!ret
, "expected success\n");
5622 ok(!size
, "got size %lu\n", size
);
5624 ret
= SleepEx(0, TRUE
);
5625 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5626 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5627 ok(!apc_error
, "got APC error %lu\n", apc_error
);
5628 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5629 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5634 static void test_unsupported_ioctls(void)
5636 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5644 static const DWORD codes
[] = {0xdeadbeef, FIOASYNC
, 0x667e, SIO_FLUSH
};
5646 for (i
= 0; i
< ARRAY_SIZE(codes
); ++i
)
5648 winetest_push_context("ioctl %#lx", codes
[i
]);
5649 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5650 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
5652 WSASetLastError(0xdeadbeef);
5653 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, NULL
, &overlapped
, NULL
);
5654 ok(ret
== -1, "expected failure\n");
5655 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5657 WSASetLastError(0xdeadbeef);
5659 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, NULL
, NULL
);
5660 ok(ret
== -1, "expected failure\n");
5661 ok(WSAGetLastError() == WSAEOPNOTSUPP
, "got error %u\n", WSAGetLastError());
5662 ok(!size
, "got size %lu\n", size
);
5664 WSASetLastError(0xdeadbeef);
5666 overlapped
.Internal
= 0xdeadbeef;
5667 overlapped
.InternalHigh
= 0xdeadbeef;
5668 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, &overlapped
, NULL
);
5669 ok(ret
== -1, "expected failure\n");
5670 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
5671 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5673 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5674 ok(!ret
, "expected failure\n");
5675 ok(GetLastError() == ERROR_NOT_SUPPORTED
, "got error %lu\n", GetLastError());
5676 ok(!size
, "got size %lu\n", size
);
5677 ok(key
== 123, "got key %Iu\n", key
);
5678 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5679 ok((NTSTATUS
)overlapped
.Internal
== STATUS_NOT_SUPPORTED
,
5680 "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5681 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5686 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5688 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, NULL
, &overlapped
, socket_apc
);
5689 ok(ret
== -1, "expected failure\n");
5690 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5694 ret
= WSAIoctl(s
, codes
[i
], NULL
, 0, NULL
, 0, &size
, &overlapped
, socket_apc
);
5695 ok(ret
== -1, "expected failure\n");
5696 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
5697 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5699 ret
= SleepEx(0, TRUE
);
5700 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5701 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5702 ok(apc_error
== WSAEOPNOTSUPP
, "got APC error %lu\n", apc_error
);
5703 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5704 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5707 winetest_pop_context();
5711 static void test_get_extension_func(void)
5713 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5714 GUID acceptex_guid
= WSAID_ACCEPTEX
;
5715 GUID bogus_guid
= {0xdeadbeef};
5723 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5724 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
5726 WSASetLastError(0xdeadbeef);
5727 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
5728 &func
, sizeof(func
), NULL
, &overlapped
, NULL
);
5729 ok(ret
== -1, "expected failure\n");
5730 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5732 WSASetLastError(0xdeadbeef);
5734 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
5735 &func
, sizeof(func
), &size
, NULL
, NULL
);
5736 ok(!ret
, "expected success\n");
5737 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5738 ok(size
== sizeof(func
), "got size %lu\n", size
);
5740 WSASetLastError(0xdeadbeef);
5742 overlapped
.Internal
= 0xdeadbeef;
5743 overlapped
.InternalHigh
= 0xdeadbeef;
5744 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
5745 &func
, sizeof(func
), &size
, &overlapped
, NULL
);
5746 ok(!ret
, "expected success\n");
5747 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5748 ok(size
== sizeof(func
), "got size %lu\n", size
);
5750 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5751 ok(ret
, "got error %lu\n", GetLastError());
5752 ok(!size
, "got size %lu\n", size
);
5753 ok(key
== 123, "got key %Iu\n", key
);
5754 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5755 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5756 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5759 overlapped
.Internal
= 0xdeadbeef;
5760 overlapped
.InternalHigh
= 0xdeadbeef;
5761 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &bogus_guid
, sizeof(GUID
),
5762 &func
, sizeof(func
), &size
, &overlapped
, NULL
);
5763 ok(ret
== -1, "expected failure\n");
5764 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
5765 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5766 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5767 ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
5769 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5770 ok(!ret
, "expected failure\n");
5771 ok(GetLastError() == WAIT_TIMEOUT
, "got error %u\n", WSAGetLastError());
5776 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5778 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
5779 &func
, sizeof(func
), NULL
, &overlapped
, socket_apc
);
5780 ok(ret
== -1, "expected failure\n");
5781 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5785 ret
= WSAIoctl(s
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(GUID
),
5786 &func
, sizeof(func
), &size
, &overlapped
, socket_apc
);
5787 ok(!ret
, "got error %u\n", WSAGetLastError());
5788 ok(size
== sizeof(func
), "got size %lu\n", size
);
5790 ret
= SleepEx(0, TRUE
);
5791 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5792 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5793 ok(!apc_error
, "got APC error %lu\n", apc_error
);
5794 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5795 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5800 static void test_backlog_query(void)
5802 const struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
5803 GUID acceptex_guid
= WSAID_ACCEPTEX
;
5804 LPFN_ACCEPTEX pAcceptEx
;
5805 struct sockaddr_in destaddr
;
5811 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5812 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
5814 ret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(acceptex_guid
),
5815 &pAcceptEx
, sizeof(pAcceptEx
), &size
, NULL
, NULL
);
5816 ok(!ret
, "failed to get AcceptEx, error %u\n", WSAGetLastError());
5818 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
5819 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
5820 len
= sizeof(destaddr
);
5821 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
5822 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
5823 ret
= listen(listener
, 2);
5824 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
5826 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
5827 ret
= WSAIoctl(s
, SIO_IDEAL_SEND_BACKLOG_QUERY
, NULL
, 0, &backlog
, sizeof(backlog
), &size
, NULL
, NULL
);
5828 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTCONN
,
5829 "WSAIoctl() failed: %d/%d\n", ret
, WSAGetLastError());
5831 ret
= connect(s
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
5832 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
5833 ret
= WSAIoctl(s
, SIO_IDEAL_SEND_BACKLOG_QUERY
, NULL
, 0, &backlog
, sizeof(backlog
), &size
, NULL
, NULL
);
5834 ok(!ret
, "WSAIoctl() failed: %d\n", WSAGetLastError());
5835 ok(backlog
== 0x10000, "got %08lx\n", backlog
);
5837 closesocket(listener
);
5840 s
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
5843 ret
= WSAIoctl(s
, SIO_IDEAL_SEND_BACKLOG_QUERY
, NULL
, 0, &backlog
, sizeof(backlog
), &size
, NULL
, NULL
);
5844 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEOPNOTSUPP
,
5845 "WSAIoctl() failed: %d/%d\n", ret
, WSAGetLastError());
5849 static void test_base_handle(void)
5851 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
5861 int family
, type
, protocol
;
5865 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
5866 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
5867 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
5868 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
},
5871 for (i
= 0; i
< ARRAY_SIZE(tests
); ++i
)
5873 s
= socket(tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
);
5874 if (s
== INVALID_SOCKET
) continue;
5875 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
5877 WSASetLastError(0xdeadbeef);
5878 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), NULL
, &overlapped
, NULL
);
5879 ok(ret
== -1, "expected failure\n");
5880 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5882 WSASetLastError(0xdeadbeef);
5885 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, NULL
, NULL
);
5886 ok(!ret
, "expected success\n");
5887 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
5888 ok(size
== sizeof(base
), "got size %lu\n", size
);
5889 ok(base
== s
, "expected %#Ix, got %#Ix\n", s
, base
);
5891 WSASetLastError(0xdeadbeef);
5894 overlapped
.Internal
= 0xdeadbeef;
5895 overlapped
.InternalHigh
= 0xdeadbeef;
5896 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, &overlapped
, NULL
);
5897 ok(ret
== -1, "expected failure\n");
5898 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
5899 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5901 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
5902 ok(!ret
, "expected failure\n");
5903 ok(GetLastError() == ERROR_NOT_SUPPORTED
, "got error %lu\n", GetLastError());
5904 ok(!size
, "got size %lu\n", size
);
5905 ok(key
== 123, "got key %Iu\n", key
);
5906 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
5907 ok((NTSTATUS
)overlapped
.Internal
== STATUS_NOT_SUPPORTED
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
5908 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
5909 ok(base
== 0xdeadbeef, "expected %#Ix, got %#Ix\n", s
, base
);
5914 s
= socket(tests
[i
].family
, tests
[i
].type
, tests
[i
].protocol
);
5916 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), NULL
, &overlapped
, socket_apc
);
5917 ok(ret
== -1, "expected failure\n");
5918 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
5923 ret
= WSAIoctl(s
, SIO_BASE_HANDLE
, NULL
, 0, &base
, sizeof(base
), &size
, &overlapped
, socket_apc
);
5924 ok(ret
== -1, "expected failure\n");
5925 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
5926 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
5928 ret
= SleepEx(0, TRUE
);
5929 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
5930 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
5931 ok(apc_error
== WSAEOPNOTSUPP
, "got APC error %lu\n", apc_error
);
5932 ok(!apc_size
, "got APC size %lu\n", apc_size
);
5933 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
5934 ok(base
== 0xdeadbeef, "expected %#Ix, got %#Ix\n", s
, base
);
5940 static void test_circular_queueing(void)
5946 s
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
5947 ret
= WSAIoctl(s
, SIO_ENABLE_CIRCULAR_QUEUEING
, NULL
, 0, NULL
, 0, &size
, NULL
, NULL
);
5948 ok(!ret
, "expected 0, got %d\n", ret
);
5953 static BOOL drain_pause
= FALSE
;
5954 static DWORD WINAPI
drain_socket_thread(LPVOID arg
)
5957 SOCKET sock
= *(SOCKET
*)arg
;
5960 while ((ret
= recv(sock
, buffer
, sizeof(buffer
), 0)) != 0)
5964 if (WSAGetLastError() == WSAEWOULDBLOCK
)
5968 FD_SET(sock
, &readset
);
5969 select(sock
+1, &readset
, NULL
, NULL
, NULL
);
5980 static void test_send(void)
5982 SOCKET src
= INVALID_SOCKET
;
5983 SOCKET dst
= INVALID_SOCKET
;
5984 HANDLE hThread
= NULL
;
5985 const int buflen
= 1024*1024;
5986 char *buffer
= NULL
;
5987 int ret
, i
, zero
= 0;
5991 DWORD id
, bytes_sent
, dwRet
;
5993 memset(&ov
, 0, sizeof(ov
));
5995 tcp_socketpair(&src
, &dst
);
5997 set_blocking(dst
, FALSE
);
5998 /* force disable buffering so we can get a pending overlapped request */
5999 ret
= setsockopt(dst
, SOL_SOCKET
, SO_SNDBUF
, (char *) &zero
, sizeof(zero
));
6000 ok(!ret
, "setsockopt SO_SNDBUF failed: %d - %ld\n", ret
, GetLastError());
6002 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
6004 buffer
= malloc(buflen
);
6006 /* fill the buffer with some nonsense */
6007 for (i
= 0; i
< buflen
; ++i
)
6009 buffer
[i
] = (char) i
;
6012 ret
= send(src
, buffer
, buflen
, 0);
6013 ok(ret
== buflen
, "send should have sent %d bytes, but it only sent %d\n", buflen
, ret
);
6018 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6019 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %ld\n", GetLastError());
6024 WSASetLastError(12345);
6025 ret
= WSASend(dst
, &buf
, 1, &bytes_sent
, 0, &ov
, NULL
);
6026 ok(ret
== SOCKET_ERROR
, "expected failure\n");
6027 ok(WSAGetLastError() == ERROR_IO_PENDING
, "wrong error %u\n", WSAGetLastError());
6029 /* don't check for completion yet, we may need to drain the buffer while still sending */
6030 set_blocking(src
, FALSE
);
6031 for (i
= 0; i
< buflen
; ++i
)
6035 ret
= recv(src
, buffer
, 1, 0);
6036 while (ret
== SOCKET_ERROR
&& GetLastError() == WSAEWOULDBLOCK
&& j
< 100)
6040 ret
= recv(src
, buffer
, 1, 0);
6043 ok(ret
== 1, "Failed to receive data %d - %ld (got %d/%d)\n", ret
, GetLastError(), i
, buflen
);
6047 ok(buffer
[0] == (char) i
, "Received bad data at position %d\n", i
);
6050 dwRet
= WaitForSingleObject(ov
.hEvent
, 1000);
6051 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %ld - %ld\n", dwRet
, GetLastError());
6052 if (dwRet
== WAIT_OBJECT_0
)
6054 bret
= GetOverlappedResult((HANDLE
)dst
, &ov
, &bytes_sent
, FALSE
);
6055 ok(bret
&& bytes_sent
== buflen
,
6056 "Got %ld instead of %d (%d - %ld)\n", bytes_sent
, buflen
, bret
, GetLastError());
6059 WSASetLastError(12345);
6060 ret
= WSASend(INVALID_SOCKET
, &buf
, 1, NULL
, 0, &ov
, NULL
);
6061 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
6062 "WSASend failed %d - %d\n", ret
, WSAGetLastError());
6064 WSASetLastError(12345);
6065 ret
= WSASend(dst
, &buf
, 1, NULL
, 0, &ov
, NULL
);
6066 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
,
6067 "Failed to start overlapped send %d - %d\n", ret
, WSAGetLastError());
6070 if (src
!= INVALID_SOCKET
)
6072 if (dst
!= INVALID_SOCKET
)
6074 if (hThread
!= NULL
)
6076 dwRet
= WaitForSingleObject(hThread
, 500);
6077 ok(dwRet
== WAIT_OBJECT_0
, "failed to wait for thread termination: %ld\n", GetLastError());
6078 CloseHandle(hThread
);
6081 CloseHandle(ov
.hEvent
);
6085 #define WM_SOCKET (WM_USER+100)
6087 struct event_test_ctx
6095 static void select_events(struct event_test_ctx
*ctx
, SOCKET socket
, LONG events
)
6099 if (ctx
->is_message
)
6100 ret
= WSAAsyncSelect(socket
, ctx
->window
, WM_USER
, events
);
6102 ret
= WSAEventSelect(socket
, ctx
->event
, events
);
6103 ok(!ret
, "failed to select, error %u\n", WSAGetLastError());
6104 ctx
->socket
= socket
;
6107 #define check_events(a, b, c, d) check_events_(__LINE__, a, b, c, d, FALSE, FALSE)
6108 #define check_events_todo(a, b, c, d) check_events_(__LINE__, a, b, c, d, TRUE, TRUE)
6109 #define check_events_todo_event(a, b, c, d) check_events_(__LINE__, a, b, c, d, TRUE, FALSE)
6110 #define check_events_todo_msg(a, b, c, d) check_events_(__LINE__, a, b, c, d, FALSE, TRUE)
6111 static void check_events_(int line
, struct event_test_ctx
*ctx
,
6112 LONG flag1
, LONG flag2
, DWORD timeout
, BOOL todo_event
, BOOL todo_msg
)
6116 if (ctx
->is_message
)
6118 BOOL any_fail
= FALSE
;
6123 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
6124 while (!ret
&& !MsgWaitForMultipleObjects(0, NULL
, FALSE
, timeout
, QS_POSTMESSAGE
))
6125 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
6126 todo_wine_if (todo_msg
&& !ret
) ok_(__FILE__
, line
)(ret
, "expected a message\n");
6129 ok_(__FILE__
, line
)(msg
.wParam
== ctx
->socket
,
6130 "expected wparam %#Ix, got %#Ix\n", ctx
->socket
, msg
.wParam
);
6131 todo_wine_if (todo_msg
&& msg
.lParam
!= flag1
)
6132 ok_(__FILE__
, line
)(msg
.lParam
== flag1
, "got first event %#Ix\n", msg
.lParam
);
6133 if (msg
.lParam
!= flag1
) any_fail
= TRUE
;
6140 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
6141 while (!ret
&& !MsgWaitForMultipleObjects(0, NULL
, FALSE
, timeout
, QS_POSTMESSAGE
))
6142 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
6143 ok_(__FILE__
, line
)(ret
, "expected a message\n");
6144 ok_(__FILE__
, line
)(msg
.wParam
== ctx
->socket
, "got wparam %#Ix\n", msg
.wParam
);
6145 todo_wine_if (todo_msg
) ok_(__FILE__
, line
)(msg
.lParam
== flag2
, "got second event %#Ix\n", msg
.lParam
);
6147 ret
= PeekMessageA(&msg
, ctx
->window
, WM_USER
, WM_USER
, PM_REMOVE
);
6148 todo_wine_if (todo_msg
&& ret
) ok_(__FILE__
, line
)(!ret
, "got unexpected event %#Ix\n", msg
.lParam
);
6149 if (ret
) any_fail
= TRUE
;
6151 /* catch tests which succeed */
6152 todo_wine_if (todo_msg
) ok_(__FILE__
, line
)(!any_fail
, "event series matches\n");
6156 WSANETWORKEVENTS events
;
6159 memset(&events
, 0xcc, sizeof(events
));
6160 ret
= WaitForSingleObject(ctx
->event
, timeout
);
6162 todo_wine_if (todo_event
&& ret
) ok_(__FILE__
, line
)(!ret
, "event wait timed out\n");
6164 todo_wine_if (todo_event
) ok_(__FILE__
, line
)(ret
== WAIT_TIMEOUT
, "expected timeout\n");
6165 ret
= WSAEnumNetworkEvents(ctx
->socket
, ctx
->event
, &events
);
6166 ok_(__FILE__
, line
)(!ret
, "failed to get events, error %u\n", WSAGetLastError());
6167 todo_wine_if (todo_event
)
6168 ok_(__FILE__
, line
)(events
.lNetworkEvents
== LOWORD(flag1
| flag2
), "got events %#lx\n", events
.lNetworkEvents
);
6169 for (i
= 0; i
< ARRAY_SIZE(events
.iErrorCode
); ++i
)
6171 if ((1u << i
) == LOWORD(flag1
) && (events
.lNetworkEvents
& LOWORD(flag1
)))
6172 todo_wine_if (HIWORD(flag1
)) ok_(__FILE__
, line
)(events
.iErrorCode
[i
] == HIWORD(flag1
),
6173 "got error code %d for event %#x\n", events
.iErrorCode
[i
], 1u << i
);
6174 if ((1u << i
) == LOWORD(flag2
) && (events
.lNetworkEvents
& LOWORD(flag2
)))
6175 ok_(__FILE__
, line
)(events
.iErrorCode
[i
] == HIWORD(flag2
),
6176 "got error code %d for event %#x\n", events
.iErrorCode
[i
], 1u << i
);
6181 static void test_accept_events(struct event_test_ctx
*ctx
)
6183 const struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
6184 SOCKET listener
, server
, client
, client2
;
6185 GUID acceptex_guid
= WSAID_ACCEPTEX
;
6186 struct sockaddr_in destaddr
;
6187 OVERLAPPED overlapped
= {0};
6188 LPFN_ACCEPTEX pAcceptEx
;
6193 overlapped
.hEvent
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
6195 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6196 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6198 ret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptex_guid
, sizeof(acceptex_guid
),
6199 &pAcceptEx
, sizeof(pAcceptEx
), &size
, NULL
, NULL
);
6200 ok(!ret
, "failed to get AcceptEx, error %u\n", WSAGetLastError());
6202 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6204 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
6205 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
6206 len
= sizeof(destaddr
);
6207 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
6208 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
6209 ret
= listen(listener
, 2);
6210 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
6212 check_events(ctx
, 0, 0, 0);
6214 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6215 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6216 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6217 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6219 check_events(ctx
, FD_ACCEPT
, 0, 200);
6220 check_events(ctx
, 0, 0, 0);
6221 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6222 if (ctx
->is_message
)
6223 check_events(ctx
, FD_ACCEPT
, 0, 200);
6224 check_events(ctx
, 0, 0, 0);
6225 select_events(ctx
, listener
, 0);
6226 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6227 if (ctx
->is_message
)
6228 check_events(ctx
, FD_ACCEPT
, 0, 200);
6229 check_events(ctx
, 0, 0, 0);
6231 client2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6232 ok(client2
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6233 ret
= connect(client2
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6234 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6236 if (!ctx
->is_message
)
6237 check_events_todo(ctx
, FD_ACCEPT
, 0, 200);
6238 check_events(ctx
, 0, 0, 0);
6240 server
= accept(listener
, NULL
, NULL
);
6241 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6242 closesocket(server
);
6244 check_events(ctx
, FD_ACCEPT
, 0, 200);
6245 check_events(ctx
, 0, 0, 0);
6247 server
= accept(listener
, NULL
, NULL
);
6248 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6249 closesocket(server
);
6251 check_events(ctx
, 0, 0, 0);
6253 closesocket(client2
);
6254 closesocket(client
);
6256 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6257 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6258 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6259 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6261 check_events(ctx
, FD_ACCEPT
, 0, 200);
6263 server
= accept(listener
, NULL
, NULL
);
6264 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6265 closesocket(server
);
6266 closesocket(client
);
6268 check_events(ctx
, 0, 0, 200);
6270 closesocket(listener
);
6272 /* Connect and then select. */
6274 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6275 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6276 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
6277 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
6278 len
= sizeof(destaddr
);
6279 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
6280 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
6281 ret
= listen(listener
, 2);
6282 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
6284 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6285 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6286 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6287 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6289 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6291 check_events(ctx
, FD_ACCEPT
, 0, 200);
6293 server
= accept(listener
, NULL
, NULL
);
6294 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6295 closesocket(server
);
6296 closesocket(client
);
6298 /* As above, but select on a subset containing FD_ACCEPT first. */
6300 if (!ctx
->is_message
)
6302 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6304 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6305 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6306 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6307 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6309 ret
= WaitForSingleObject(ctx
->event
, 200);
6310 ok(!ret
, "wait timed out\n");
6312 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
6313 ret
= WaitForSingleObject(ctx
->event
, 0);
6314 ok(!ret
, "wait timed out\n");
6316 ResetEvent(ctx
->event
);
6318 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
6319 ret
= WaitForSingleObject(ctx
->event
, 0);
6320 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
6322 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6323 ret
= WaitForSingleObject(ctx
->event
, 0);
6324 ok(!ret
, "wait timed out\n");
6325 check_events(ctx
, FD_ACCEPT
, 0, 0);
6327 server
= accept(listener
, NULL
, NULL
);
6328 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6329 closesocket(server
);
6330 closesocket(client
);
6333 /* As above, but select on a subset not containing FD_ACCEPT first. */
6335 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
6337 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6338 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6339 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6340 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6342 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6343 check_events(ctx
, FD_ACCEPT
, 0, 200);
6345 server
= accept(listener
, NULL
, NULL
);
6346 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6347 closesocket(server
);
6348 closesocket(client
);
6350 /* As above, but call accept() before selecting. */
6352 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
);
6354 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6355 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6356 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6357 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6359 server
= accept(listener
, NULL
, NULL
);
6360 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6362 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6363 check_events(ctx
, 0, 0, 200);
6365 closesocket(server
);
6366 closesocket(client
);
6368 closesocket(listener
);
6370 /* The socket returned from accept() inherits the same parameters. */
6372 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6373 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6374 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
6375 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
6376 len
= sizeof(destaddr
);
6377 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
6378 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
6379 ret
= listen(listener
, 2);
6380 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
6382 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6383 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6384 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6385 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6387 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
| FD_WRITE
);
6388 check_events(ctx
, FD_ACCEPT
, 0, 200);
6390 server
= accept(listener
, NULL
, NULL
);
6391 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6392 ctx
->socket
= server
;
6393 check_events(ctx
, FD_WRITE
, 0, 200);
6394 check_events(ctx
, 0, 0, 0);
6396 closesocket(server
);
6397 closesocket(client
);
6399 /* Connect while there is a pending AcceptEx(). */
6401 select_events(ctx
, listener
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_ACCEPT
);
6403 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6404 ret
= pAcceptEx(listener
, server
, buffer
, 0, 0, sizeof(buffer
), NULL
, &overlapped
);
6405 ok(!ret
, "got %d\n", ret
);
6406 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
6408 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6409 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6410 ok(!ret
, "got error %u\n", WSAGetLastError());
6412 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
6413 ok(!ret
, "got %d\n", ret
);
6414 ret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &size
, FALSE
);
6415 ok(ret
, "got error %lu\n", GetLastError());
6416 ok(!size
, "got size %lu\n", size
);
6418 check_events(ctx
, 0, 0, 0);
6420 closesocket(server
);
6421 closesocket(client
);
6423 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6424 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6425 ok(!ret
, "got error %u\n", WSAGetLastError());
6427 check_events(ctx
, FD_ACCEPT
, 0, 200);
6428 check_events(ctx
, 0, 0, 0);
6430 server
= accept(listener
, NULL
, NULL
);
6431 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6432 closesocket(server
);
6433 closesocket(client
);
6435 closesocket(listener
);
6436 CloseHandle(overlapped
.hEvent
);
6439 static void test_connect_events(struct event_test_ctx
*ctx
)
6441 const struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
6442 SOCKET listener
, server
, client
;
6443 struct sockaddr_in destaddr
;
6446 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6447 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6448 ret
= bind(listener
, (const struct sockaddr
*)&addr
, sizeof(addr
));
6449 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
6450 len
= sizeof(destaddr
);
6451 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &len
);
6452 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
6453 ret
= listen(listener
, 2);
6454 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
6456 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6457 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6459 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6460 check_events(ctx
, 0, 0, 0);
6462 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6463 ok(!ret
|| WSAGetLastError() == WSAEWOULDBLOCK
, "failed to connect, error %u\n", WSAGetLastError());
6465 check_events(ctx
, FD_CONNECT
, FD_WRITE
, 200);
6466 check_events(ctx
, 0, 0, 0);
6467 select_events(ctx
, client
, 0);
6468 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6469 if (ctx
->is_message
)
6470 check_events(ctx
, FD_WRITE
, 0, 200);
6471 check_events(ctx
, 0, 0, 0);
6473 server
= accept(listener
, NULL
, NULL
);
6474 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6476 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6477 check_events(ctx
, FD_WRITE
, 0, 200);
6479 closesocket(client
);
6480 closesocket(server
);
6482 /* Connect and then select. */
6484 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6485 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6487 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6488 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
6490 server
= accept(listener
, NULL
, NULL
);
6491 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6493 ret
= send(client
, "data", 5, 0);
6494 ok(ret
== 5, "got %d\n", ret
);
6496 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6497 if (ctx
->is_message
)
6498 check_events(ctx
, FD_WRITE
, 0, 200);
6500 check_events(ctx
, FD_CONNECT
, FD_WRITE
, 200);
6502 closesocket(client
);
6503 closesocket(server
);
6505 /* As above, but select on a subset not containing FD_CONNECT first. */
6507 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6508 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
6510 select_events(ctx
, client
, FD_ACCEPT
| FD_CLOSE
| FD_OOB
| FD_READ
| FD_WRITE
);
6512 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
6513 ok(!ret
|| WSAGetLastError() == WSAEWOULDBLOCK
, "failed to connect, error %u\n", WSAGetLastError());
6515 server
= accept(listener
, NULL
, NULL
);
6516 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
6518 check_events(ctx
, FD_WRITE
, 0, 200);
6520 select_events(ctx
, client
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6522 if (ctx
->is_message
)
6523 check_events(ctx
, FD_WRITE
, 0, 200);
6525 check_events(ctx
, FD_CONNECT
, 0, 200);
6527 closesocket(client
);
6528 closesocket(server
);
6530 /* Test with UDP sockets. */
6532 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
6533 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
6535 select_events(ctx
, client
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6536 if (ctx
->is_message
)
6537 check_events(ctx
, FD_WRITE
, 0, 200);
6538 check_events_todo_event(ctx
, 0, 0, 0);
6540 ret
= bind(server
, (const struct sockaddr
*)&addr
, sizeof(addr
));
6541 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
6542 len
= sizeof(destaddr
);
6543 ret
= getsockname(server
, (struct sockaddr
*)&destaddr
, &len
);
6544 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
6545 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
6546 ok(!ret
, "got error %lu\n", GetLastError());
6548 if (ctx
->is_message
)
6549 check_events_todo(ctx
, FD_WRITE
, 0, 200);
6551 check_events_todo(ctx
, FD_CONNECT
, FD_WRITE
, 200);
6552 check_events(ctx
, 0, 0, 0);
6554 closesocket(client
);
6555 closesocket(server
);
6557 closesocket(listener
);
6560 /* perform a blocking recv() even on a nonblocking socket */
6561 static int sync_recv(SOCKET s
, void *buffer
, int len
, DWORD flags
)
6563 OVERLAPPED overlapped
= {0};
6568 overlapped
.hEvent
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
6569 wsabuf
.buf
= buffer
;
6571 ret
= WSARecv(s
, &wsabuf
, 1, &ret_len
, &flags
, &overlapped
, NULL
);
6572 if (ret
== -1 && WSAGetLastError() == ERROR_IO_PENDING
)
6574 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
6575 ok(!ret
, "wait timed out\n");
6576 ret
= WSAGetOverlappedResult(s
, &overlapped
, &ret_len
, FALSE
, &flags
);
6577 ret
= (ret
? 0 : -1);
6579 CloseHandle(overlapped
.hEvent
);
6580 if (!ret
) return ret_len
;
6584 static void test_write_events(struct event_test_ctx
*ctx
)
6586 static const int buffer_size
= 1024 * 1024;
6587 SOCKET server
, client
;
6591 buffer
= malloc(buffer_size
);
6593 tcp_socketpair(&client
, &server
);
6594 set_blocking(client
, FALSE
);
6596 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6597 check_events(ctx
, FD_WRITE
, 0, 200);
6598 check_events(ctx
, 0, 0, 0);
6599 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6600 if (ctx
->is_message
)
6601 check_events(ctx
, FD_WRITE
, 0, 200);
6602 check_events(ctx
, 0, 0, 0);
6603 select_events(ctx
, server
, 0);
6604 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6605 if (ctx
->is_message
)
6606 check_events(ctx
, FD_WRITE
, 0, 200);
6607 check_events(ctx
, 0, 0, 0);
6609 ret
= send(server
, "data", 5, 0);
6610 ok(ret
== 5, "got %d\n", ret
);
6612 check_events(ctx
, 0, 0, 0);
6614 ret
= sync_recv(client
, buffer
, buffer_size
, 0);
6615 ok(ret
== 5, "got %d\n", ret
);
6617 check_events(ctx
, 0, 0, 0);
6621 /* Windows will never send less than buffer_size bytes here, but Linux
6622 * may do a short write. */
6623 while ((ret
= send(server
, buffer
, buffer_size
, 0)) > 0);
6624 ok(ret
== -1, "got %d\n", ret
);
6625 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
6627 while (recv(client
, buffer
, buffer_size
, 0) > 0);
6628 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
6630 /* Broken on Windows versions older than win10v1607 (though sometimes
6631 * works regardless, for unclear reasons. */
6632 check_events(ctx
, FD_WRITE
, 0, 200);
6633 check_events(ctx
, 0, 0, 0);
6634 select_events(ctx
, server
, 0);
6635 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6636 if (ctx
->is_message
)
6637 check_events(ctx
, FD_WRITE
, 0, 200);
6638 check_events(ctx
, 0, 0, 0);
6641 closesocket(server
);
6642 closesocket(client
);
6644 /* Select on a subset not containing FD_WRITE first. */
6646 tcp_socketpair(&client
, &server
);
6647 set_blocking(client
, FALSE
);
6649 ret
= send(client
, "data", 5, 0);
6650 ok(ret
== 5, "got %d\n", ret
);
6652 select_events(ctx
, client
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
);
6653 if (!ctx
->is_message
)
6654 check_events(ctx
, FD_CONNECT
, 0, 200);
6655 check_events(ctx
, 0, 0, 0);
6657 select_events(ctx
, client
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6658 check_events(ctx
, FD_WRITE
, 0, 200);
6659 check_events(ctx
, 0, 0, 0);
6661 closesocket(client
);
6662 closesocket(server
);
6664 /* Despite the documentation, and unlike FD_ACCEPT and FD_RECV, calling
6665 * send() doesn't clear the FD_WRITE bit. */
6667 tcp_socketpair(&client
, &server
);
6669 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6671 ret
= send(server
, "data", 5, 0);
6672 ok(ret
== 5, "got %d\n", ret
);
6674 check_events(ctx
, FD_WRITE
, 0, 200);
6676 closesocket(server
);
6677 closesocket(client
);
6682 static void test_read_events(struct event_test_ctx
*ctx
)
6684 OVERLAPPED overlapped
= {0};
6685 SOCKET server
, client
;
6686 DWORD size
, flags
= 0;
6694 overlapped
.hEvent
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
6696 tcp_socketpair(&client
, &server
);
6697 set_blocking(client
, FALSE
);
6699 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6700 check_events(ctx
, 0, 0, 0);
6702 ret
= send(client
, "data", 5, 0);
6703 ok(ret
== 5, "got %d\n", ret
);
6705 check_events(ctx
, FD_READ
, 0, 200);
6706 check_events(ctx
, 0, 0, 0);
6707 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6708 if (ctx
->is_message
)
6709 check_events(ctx
, FD_READ
, 0, 200);
6710 check_events(ctx
, 0, 0, 0);
6711 select_events(ctx
, server
, 0);
6712 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6713 if (ctx
->is_message
)
6714 check_events(ctx
, FD_READ
, 0, 200);
6715 check_events(ctx
, 0, 0, 0);
6717 ret
= send(client
, "data", 5, 0);
6718 ok(ret
== 5, "got %d\n", ret
);
6720 if (!ctx
->is_message
)
6721 check_events_todo(ctx
, FD_READ
, 0, 200);
6722 check_events(ctx
, 0, 0, 0);
6724 ret
= recv(server
, buffer
, 2, 0);
6725 ok(ret
== 2, "got %d\n", ret
);
6727 check_events(ctx
, FD_READ
, 0, 200);
6728 check_events(ctx
, 0, 0, 0);
6730 ret
= recv(server
, buffer
, -1, 0);
6731 ok(ret
== -1, "got %d\n", ret
);
6732 ok(WSAGetLastError() == WSAEFAULT
|| WSAGetLastError() == WSAENOBUFS
/* < Windows 7 */,
6733 "got error %u\n", WSAGetLastError());
6735 if (ctx
->is_message
)
6736 check_events_todo_msg(ctx
, FD_READ
, 0, 200);
6737 check_events(ctx
, 0, 0, 0);
6739 for (i
= 0; i
< 8; ++i
)
6741 ret
= sync_recv(server
, buffer
, 1, 0);
6742 ok(ret
== 1, "got %d\n", ret
);
6745 check_events(ctx
, FD_READ
, 0, 200);
6746 check_events(ctx
, 0, 0, 0);
6749 /* Send data while we're not selecting. */
6751 select_events(ctx
, server
, 0);
6752 ret
= send(client
, "data", 5, 0);
6753 ok(ret
== 5, "got %d\n", ret
);
6754 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6756 check_events(ctx
, FD_READ
, 0, 200);
6758 ret
= recv(server
, buffer
, 5, 0);
6759 ok(ret
== 5, "got %d\n", ret
);
6761 select_events(ctx
, server
, 0);
6762 ret
= send(client
, "data", 5, 0);
6763 ok(ret
== 5, "got %d\n", ret
);
6764 ret
= sync_recv(server
, buffer
, 5, 0);
6765 ok(ret
== 5, "got %d\n", ret
);
6766 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
);
6768 check_events(ctx
, 0, 0, 200);
6770 /* Send data while we're polling for data but not selecting for FD_READ. */
6773 pollfd
.events
= POLLIN
;
6774 thread
= CreateThread(NULL
, 0, poll_async_thread
, &pollfd
, 0, NULL
);
6776 select_events(ctx
, server
, 0);
6777 ret
= send(client
, "data", 5, 0);
6778 ok(ret
== 5, "got %d\n", ret
);
6780 ret
= WaitForSingleObject(thread
, 1000);
6781 ok(!ret
, "wait timed out\n");
6782 CloseHandle(thread
);
6784 /* And check events, to show that WSAEnumNetworkEvents() should not clear
6785 * events we are not currently selecting for. */
6786 check_events(ctx
, 0, 0, 0);
6788 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
| FD_WRITE
);
6789 check_events(ctx
, FD_READ
, FD_WRITE
, 200);
6790 check_events(ctx
, 0, 0, 0);
6792 ret
= sync_recv(server
, buffer
, 5, 0);
6793 ok(ret
== 5, "got %d\n", ret
);
6795 /* Send data while there is a pending WSARecv(). */
6797 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6799 wsabuf
.buf
= buffer
;
6801 ret
= WSARecv(server
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
6802 ok(ret
== -1, "got %d\n", ret
);
6803 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
6805 ret
= send(client
, "a", 1, 0);
6806 ok(ret
== 1, "got %d\n", ret
);
6808 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
6809 ok(!ret
, "got %d\n", ret
);
6810 ret
= GetOverlappedResult((HANDLE
)server
, &overlapped
, &size
, FALSE
);
6811 ok(ret
, "got error %lu\n", GetLastError());
6812 ok(size
== 1, "got size %lu\n", size
);
6814 check_events(ctx
, 0, 0, 0);
6816 ret
= send(client
, "a", 1, 0);
6817 ok(ret
== 1, "got %d\n", ret
);
6819 check_events(ctx
, FD_READ
, 0, 200);
6820 check_events(ctx
, 0, 0, 0);
6822 closesocket(server
);
6823 closesocket(client
);
6824 CloseHandle(overlapped
.hEvent
);
6827 static void test_oob_events(struct event_test_ctx
*ctx
)
6829 SOCKET server
, client
;
6833 tcp_socketpair(&client
, &server
);
6834 set_blocking(client
, FALSE
);
6836 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6837 check_events(ctx
, 0, 0, 0);
6839 ret
= send(client
, "a", 1, MSG_OOB
);
6840 ok(ret
== 1, "got %d\n", ret
);
6842 check_events(ctx
, FD_OOB
, 0, 200);
6843 check_events(ctx
, 0, 0, 0);
6844 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6845 if (ctx
->is_message
)
6846 check_events(ctx
, FD_OOB
, 0, 200);
6847 check_events(ctx
, 0, 0, 0);
6848 select_events(ctx
, server
, 0);
6849 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6850 if (ctx
->is_message
)
6851 check_events(ctx
, FD_OOB
, 0, 200);
6852 check_events(ctx
, 0, 0, 0);
6854 ret
= send(client
, "b", 1, MSG_OOB
);
6855 ok(ret
== 1, "got %d\n", ret
);
6857 if (!ctx
->is_message
)
6858 check_events_todo_event(ctx
, FD_OOB
, 0, 200);
6859 check_events(ctx
, 0, 0, 0);
6861 ret
= recv(server
, buffer
, 1, MSG_OOB
);
6862 ok(ret
== 1, "got %d\n", ret
);
6864 check_events_todo(ctx
, FD_OOB
, 0, 200);
6865 check_events(ctx
, 0, 0, 0);
6867 ret
= recv(server
, buffer
, 1, MSG_OOB
);
6868 todo_wine
ok(ret
== 1, "got %d\n", ret
);
6870 check_events(ctx
, 0, 0, 0);
6872 /* Send data while we're not selecting. */
6874 select_events(ctx
, server
, 0);
6875 ret
= send(client
, "a", 1, MSG_OOB
);
6876 ok(ret
== 1, "got %d\n", ret
);
6877 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6879 check_events(ctx
, FD_OOB
, 0, 200);
6881 ret
= recv(server
, buffer
, 1, MSG_OOB
);
6882 ok(ret
== 1, "got %d\n", ret
);
6884 closesocket(server
);
6885 closesocket(client
);
6888 static void test_close_events(struct event_test_ctx
*ctx
)
6890 SOCKET server
, client
;
6894 /* Test closesocket(). */
6896 tcp_socketpair(&client
, &server
);
6898 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6900 closesocket(client
);
6902 check_events(ctx
, FD_CLOSE
, 0, 1000);
6903 check_events(ctx
, 0, 0, 0);
6904 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6905 if (ctx
->is_message
)
6906 check_events(ctx
, FD_CLOSE
, 0, 200);
6907 check_events(ctx
, 0, 0, 0);
6908 select_events(ctx
, server
, 0);
6909 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6910 if (ctx
->is_message
)
6911 check_events(ctx
, FD_CLOSE
, 0, 200);
6912 check_events(ctx
, 0, 0, 0);
6914 ret
= recv(server
, buffer
, 5, 0);
6915 ok(!ret
, "got %d\n", ret
);
6917 check_events(ctx
, 0, 0, 0);
6919 closesocket(server
);
6921 /* Test shutdown(remote end, SD_SEND). */
6923 tcp_socketpair(&client
, &server
);
6925 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6927 shutdown(client
, SD_SEND
);
6929 check_events(ctx
, FD_CLOSE
, 0, 1000);
6930 check_events(ctx
, 0, 0, 0);
6932 closesocket(client
);
6934 check_events(ctx
, 0, 0, 0);
6936 closesocket(server
);
6938 /* No other shutdown() call generates an event. */
6940 tcp_socketpair(&client
, &server
);
6942 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6944 shutdown(client
, SD_RECEIVE
);
6945 shutdown(server
, SD_BOTH
);
6947 check_events(ctx
, 0, 0, 200);
6949 shutdown(client
, SD_SEND
);
6951 check_events_todo(ctx
, FD_CLOSE
, 0, 200);
6952 check_events(ctx
, 0, 0, 0);
6954 closesocket(server
);
6955 closesocket(client
);
6957 /* Test sending data before calling closesocket(). */
6959 tcp_socketpair(&client
, &server
);
6961 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6963 ret
= send(client
, "data", 5, 0);
6964 ok(ret
== 5, "got %d\n", ret
);
6966 check_events(ctx
, FD_READ
, 0, 200);
6968 closesocket(client
);
6970 check_events_todo(ctx
, FD_CLOSE
, 0, 200);
6972 ret
= recv(server
, buffer
, 3, 0);
6973 ok(ret
== 3, "got %d\n", ret
);
6975 check_events(ctx
, FD_READ
, 0, 200);
6977 ret
= recv(server
, buffer
, 5, 0);
6978 ok(ret
== 2, "got %d\n", ret
);
6980 check_events_todo(ctx
, 0, 0, !strcmp(winetest_platform
, "wine") ? 200 : 0);
6982 closesocket(server
);
6984 /* Close and then select. */
6986 tcp_socketpair(&client
, &server
);
6987 closesocket(client
);
6989 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
6990 check_events(ctx
, FD_CLOSE
, 0, 200);
6992 closesocket(server
);
6994 /* As above, but select on a subset not containing FD_CLOSE first. */
6996 tcp_socketpair(&client
, &server
);
6998 select_events(ctx
, server
, FD_ACCEPT
| FD_CONNECT
| FD_OOB
| FD_READ
);
7000 closesocket(client
);
7002 check_events(ctx
, 0, 0, 200);
7003 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
7004 check_events(ctx
, FD_CLOSE
, 0, 200);
7006 closesocket(server
);
7010 tcp_socketpair(&client
, &server
);
7012 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
7014 close_with_rst(client
);
7016 check_events_todo_msg(ctx
, MAKELONG(FD_CLOSE
, WSAECONNABORTED
), 0, 200);
7017 check_events(ctx
, 0, 0, 0);
7018 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
7019 if (ctx
->is_message
)
7020 check_events_todo(ctx
, MAKELONG(FD_CLOSE
, WSAECONNABORTED
), 0, 200);
7021 check_events(ctx
, 0, 0, 0);
7022 select_events(ctx
, server
, 0);
7023 select_events(ctx
, server
, FD_ACCEPT
| FD_CLOSE
| FD_CONNECT
| FD_OOB
| FD_READ
);
7024 if (ctx
->is_message
)
7025 check_events_todo(ctx
, MAKELONG(FD_CLOSE
, WSAECONNABORTED
), 0, 200);
7026 check_events(ctx
, 0, 0, 0);
7028 closesocket(server
);
7031 static void test_events(void)
7033 struct event_test_ctx ctx
;
7035 ctx
.is_message
= FALSE
;
7036 ctx
.event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
7038 test_accept_events(&ctx
);
7039 test_connect_events(&ctx
);
7040 test_write_events(&ctx
);
7041 test_read_events(&ctx
);
7042 test_close_events(&ctx
);
7043 test_oob_events(&ctx
);
7045 CloseHandle(ctx
.event
);
7047 ctx
.is_message
= TRUE
;
7048 ctx
.window
= CreateWindowA("Message", NULL
, 0, 0, 0, 0, 0, HWND_MESSAGE
, NULL
, NULL
, NULL
);
7050 test_accept_events(&ctx
);
7051 test_connect_events(&ctx
);
7052 test_write_events(&ctx
);
7053 test_read_events(&ctx
);
7054 test_close_events(&ctx
);
7055 test_oob_events(&ctx
);
7057 DestroyWindow(ctx
.window
);
7060 static void test_ipv6only(void)
7062 SOCKET v4
= INVALID_SOCKET
, v6
;
7063 struct sockaddr_in sin4
;
7064 struct sockaddr_in6 sin6
;
7065 int ret
, enabled
, len
= sizeof(enabled
);
7067 memset(&sin4
, 0, sizeof(sin4
));
7068 sin4
.sin_family
= AF_INET
;
7069 sin4
.sin_port
= htons(SERVERPORT
);
7071 memset(&sin6
, 0, sizeof(sin6
));
7072 sin6
.sin6_family
= AF_INET6
;
7073 sin6
.sin6_port
= htons(SERVERPORT
);
7075 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
7076 if (v6
== INVALID_SOCKET
)
7078 skip("Could not create IPv6 socket (LastError: %d)\n", WSAGetLastError());
7083 ret
= getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7084 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7085 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
7087 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
7088 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
7090 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7091 ok(v4
!= INVALID_SOCKET
, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
7095 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7096 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7097 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
7101 len
= sizeof(enabled
);
7102 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
7103 ok(!ret
, "setsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7107 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7108 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7109 ok(!enabled
, "expected 0, got %d\n", enabled
);
7113 len
= sizeof(enabled
);
7114 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
7115 ok(!ret
, "setsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7117 /* bind on IPv4 socket should succeed - IPV6_V6ONLY is enabled by default */
7118 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
7119 ok(!ret
, "Could not bind IPv4 address (LastError: %d)\n", WSAGetLastError());
7123 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7124 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7125 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
7129 len
= sizeof(enabled
);
7130 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
7131 ok(ret
, "setsockopt(IPV6_V6ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
7135 ret
= getsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7136 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7137 ok(enabled
== 1, "expected 1, got %d\n", enabled
);
7141 len
= sizeof(enabled
);
7142 ret
= setsockopt(v4
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
7143 ok(ret
, "setsockopt(IPV6_V6ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
7148 /* Test again, this time disabling IPV6_V6ONLY. */
7149 sin4
.sin_port
= htons(SERVERPORT
+2);
7150 sin6
.sin6_port
= htons(SERVERPORT
+2);
7152 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
7153 ok(v6
!= INVALID_SOCKET
, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
7154 WSAGetLastError(), WSAEAFNOSUPPORT
);
7157 ret
= setsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, len
);
7158 ok(!ret
, "Could not disable IPV6_V6ONLY (LastError: %d).\n", WSAGetLastError());
7161 ret
= getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7162 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7163 ok(!enabled
, "expected 0, got %d\n", enabled
);
7167 On Windows, bind on both IPv4 and IPv6 with IPV6_V6ONLY disabled succeeds by default.
7168 Application must set SO_EXCLUSIVEADDRUSE on first socket to disallow another successful bind.
7169 In general, a standard application should not use SO_REUSEADDR.
7170 Setting both SO_EXCLUSIVEADDRUSE and SO_REUSEADDR on the same socket is not possible in
7171 either order, the later setsockopt call always fails.
7174 ret
= setsockopt(v6
, SOL_SOCKET
, SO_EXCLUSIVEADDRUSE
, (char*)&enabled
, len
);
7175 ok(!ret
, "Could not set SO_EXCLUSIVEADDRUSE on IPv6 socket (LastError: %d)\n", WSAGetLastError());
7177 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
7178 ok(!ret
, "Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
7181 len
= sizeof(enabled
);
7182 getsockopt(v6
, IPPROTO_IPV6
, IPV6_V6ONLY
, (char*)&enabled
, &len
);
7183 ok(!ret
, "getsockopt(IPV6_V6ONLY) failed (LastError: %d)\n", WSAGetLastError());
7184 ok(!enabled
, "IPV6_V6ONLY is enabled after bind\n");
7186 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
7187 ok(v4
!= INVALID_SOCKET
, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
7190 ret
= setsockopt(v4
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&enabled
, len
);
7191 ok(!ret
, "Could not set SO_REUSEADDR on IPv4 socket (LastError: %d)\n", WSAGetLastError());
7193 WSASetLastError(0xdeadbeef);
7194 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
7195 ok(ret
, "bind succeeded unexpectedly for the IPv4 socket\n");
7196 ok(WSAGetLastError() == WSAEACCES
, "Expected 10013, got %d\n", WSAGetLastError());
7199 if (v4
!= INVALID_SOCKET
)
7201 if (v6
!= INVALID_SOCKET
)
7205 static void test_WSASendMsg(void)
7208 struct sockaddr_in sendaddr
, sockaddr
;
7209 GUID WSASendMsg_GUID
= WSAID_WSASENDMSG
;
7210 LPFN_WSASENDMSG pWSASendMsg
= NULL
;
7211 char teststr
[12] = "hello world", buffer
[32];
7214 DWORD bytesSent
, err
;
7217 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
7219 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
7220 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
7222 /* Obtain the WSASendMsg function */
7223 WSAIoctl(sock
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSASendMsg_GUID
, sizeof(WSASendMsg_GUID
),
7224 &pWSASendMsg
, sizeof(pWSASendMsg
), &err
, NULL
, NULL
);
7228 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
7232 /* fake address for now */
7233 sendaddr
.sin_family
= AF_INET
;
7234 sendaddr
.sin_port
= htons(139);
7235 sendaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7237 memset(&msg
, 0, sizeof(msg
));
7238 iovec
[0].buf
= teststr
;
7239 iovec
[0].len
= sizeof(teststr
);
7240 iovec
[1].buf
= teststr
;
7241 iovec
[1].len
= sizeof(teststr
) / 2;
7242 msg
.name
= (struct sockaddr
*) &sendaddr
;
7243 msg
.namelen
= sizeof(sendaddr
);
7244 msg
.lpBuffers
= iovec
;
7245 msg
.dwBufferCount
= 1; /* send only one buffer for now */
7247 WSASetLastError(0xdeadbeef);
7248 ret
= pWSASendMsg(INVALID_SOCKET
, &msg
, 0, NULL
, NULL
, NULL
);
7249 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
7250 err
= WSAGetLastError();
7251 ok(err
== WSAENOTSOCK
, "expected 10038, got %ld instead\n", err
);
7253 WSASetLastError(0xdeadbeef);
7254 ret
= pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
);
7255 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
7256 err
= WSAGetLastError();
7257 ok(err
== WSAEFAULT
, "expected 10014, got %ld instead\n", err
);
7259 WSASetLastError(0xdeadbeef);
7260 ret
= pWSASendMsg(sock
, NULL
, 0, &bytesSent
, NULL
, NULL
);
7261 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
7262 err
= WSAGetLastError();
7263 ok(err
== WSAEFAULT
, "expected 10014, got %ld instead\n", err
);
7265 WSASetLastError(0xdeadbeef);
7266 ret
= pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
);
7267 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
7268 err
= WSAGetLastError();
7269 ok(err
== WSAEFAULT
, "expected 10014, got %ld instead\n", err
);
7273 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
7274 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
7276 dst
= socket(AF_INET
, SOCK_DGRAM
, 0);
7277 ok(dst
!= INVALID_SOCKET
, "socket() failed\n");
7279 memset(&sockaddr
, 0, sizeof(sockaddr
));
7280 sockaddr
.sin_family
= AF_INET
;
7281 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7282 ok(!bind(dst
, (struct sockaddr
*)&sockaddr
, sizeof(sockaddr
)),
7283 "bind should have worked\n");
7285 /* read address to find out the port number to be used in send */
7286 memset(&sendaddr
, 0, sizeof(sendaddr
));
7287 addrlen
= sizeof(sendaddr
);
7288 ok(!getsockname(dst
, (struct sockaddr
*) &sendaddr
, &addrlen
),
7289 "getsockname should have worked\n");
7290 ok(sendaddr
.sin_port
, "socket port should be != 0\n");
7292 /* ensure the sending socket is not bound */
7293 WSASetLastError(0xdeadbeef);
7294 addrlen
= sizeof(sockaddr
);
7295 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
7296 ok(ret
== SOCKET_ERROR
, "getsockname should have failed\n");
7297 err
= WSAGetLastError();
7298 ok(err
== WSAEINVAL
, "expected 10022, got %ld instead\n", err
);
7300 set_blocking(sock
, TRUE
);
7303 SetLastError(0xdeadbeef);
7304 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
7305 ok(!ret
, "WSASendMsg should have worked\n");
7306 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
7307 "Expected 0, got %ld\n", GetLastError());
7308 ok(bytesSent
== iovec
[0].len
, "incorrect bytes sent, expected %ld, sent %ld\n",
7309 iovec
[0].len
, bytesSent
);
7312 addrlen
= sizeof(sockaddr
);
7313 memset(buffer
, 0, sizeof(buffer
));
7314 SetLastError(0xdeadbeef);
7315 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
7316 ok(ret
== bytesSent
, "got %d, expected %ld\n",
7318 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7320 /* A successful call to WSASendMsg must have bound the socket */
7321 addrlen
= sizeof(sockaddr
);
7322 sockaddr
.sin_port
= 0;
7323 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7324 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
7325 ok(!ret
, "getsockname should have worked\n");
7326 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
7327 inet_ntoa(sockaddr
.sin_addr
));
7328 ok(sockaddr
.sin_port
, "sin_port should be != 0\n");
7330 msg
.dwBufferCount
= 2; /* send both buffers */
7333 SetLastError(0xdeadbeef);
7334 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
7335 ok(!ret
, "WSASendMsg should have worked\n");
7336 ok(bytesSent
== iovec
[0].len
+ iovec
[1].len
, "incorrect bytes sent, expected %ld, sent %ld\n",
7337 iovec
[0].len
+ iovec
[1].len
, bytesSent
);
7338 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
7339 "Expected 0, got %ld\n", GetLastError());
7342 addrlen
= sizeof(sockaddr
);
7343 memset(buffer
, 0, sizeof(buffer
));
7344 SetLastError(0xdeadbeef);
7345 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
7346 ok(ret
== bytesSent
, "got %d, expected %ld\n",
7348 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7353 /* a bad call to WSASendMsg will also bind the socket */
7354 addrlen
= sizeof(sockaddr
);
7355 sockaddr
.sin_port
= 0;
7356 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7357 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
7358 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
7359 ok(pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
7361 ok(!getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have worked\n");
7362 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
7363 inet_ntoa(sockaddr
.sin_addr
));
7364 ok(sockaddr
.sin_port
, "sin_port should be > 0\n");
7368 /* a bad call without msg parameter will not trigger the auto-bind */
7369 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
7370 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
7371 ok(pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
7372 ok(getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have failed\n");
7373 err
= WSAGetLastError();
7374 ok(err
== WSAEINVAL
, "expected 10022, got %ld instead\n", err
);
7377 /* SOCK_STREAM sockets are not supported */
7379 sock
= socket(AF_INET
, SOCK_STREAM
, 0);
7380 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
7381 SetLastError(0xdeadbeef);
7382 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
7383 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
7384 err
= WSAGetLastError();
7386 ok(err
== WSAEINVAL
, "expected 10014, got %ld instead\n", err
);
7390 static void test_WSASendTo(void)
7393 struct sockaddr_in addr
, ret_addr
;
7394 char buf
[12] = "hello world";
7399 addr
.sin_family
= AF_INET
;
7400 addr
.sin_port
= htons(139);
7401 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7402 data_buf
.len
= sizeof(buf
);
7405 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
7406 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
7408 WSASetLastError(12345);
7409 ret
= WSASendTo(INVALID_SOCKET
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
7410 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
7411 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
7413 len
= sizeof(ret_addr
);
7414 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr
, &len
);
7415 ok(ret
== -1, "expected failure\n");
7416 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7418 WSASetLastError(12345);
7419 ret
= WSASendTo(s
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
7420 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
7421 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
7423 WSASetLastError(12345);
7424 ret
= WSASendTo(s
, &data_buf
, 1, &bytesSent
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
7425 ok(!ret
, "expected success\n");
7426 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
7428 len
= sizeof(ret_addr
);
7429 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr
, &len
);
7430 ok(!ret
, "got error %u\n", WSAGetLastError());
7431 ok(ret_addr
.sin_family
== AF_INET
, "got family %u\n", ret_addr
.sin_family
);
7432 ok(ret_addr
.sin_port
, "expected nonzero port\n");
7435 struct recv_thread_apc_param
7438 unsigned int apc_count
;
7441 static void WINAPI
recv_thread_apc_func(ULONG_PTR param
)
7443 struct recv_thread_apc_param
*p
= (struct recv_thread_apc_param
*)param
;
7448 ret
= send(p
->sock
, "test", 4, 0);
7449 ok(ret
== 4, "got %d.\n", ret
);
7452 struct recv_thread_param
7458 static DWORD WINAPI
recv_thread(LPVOID arg
)
7460 struct recv_thread_param
*p
= arg
;
7461 SOCKET sock
= p
->sock
;
7470 wsa
.len
= sizeof(buffer
);
7473 ov
.hEvent
= WSACreateEvent();
7474 WSARecv(sock
, &wsa
, 1, NULL
, &flags
, &ov
, NULL
);
7476 WaitForSingleObject(ov
.hEvent
, 1000);
7477 WSACloseEvent(ov
.hEvent
);
7481 SetLastError(0xdeadbeef);
7482 ret
= WSARecv(sock
, &wsa
, 1, &len
, &flags
, NULL
, NULL
);
7483 ok(!ret
, "got ret %d.\n", ret
);
7484 ok(WSAGetLastError() == 0, "got error %d.\n", WSAGetLastError());
7485 ok(len
== 4, "got len %lu.\n", len
);
7490 static int completion_called
;
7492 static void WINAPI
io_completion(DWORD error
, DWORD transferred
, WSAOVERLAPPED
*overlapped
, DWORD flags
)
7494 completion_called
++;
7497 static void test_WSARecv(void)
7499 SOCKET src
, dest
, server
= INVALID_SOCKET
;
7500 struct recv_thread_apc_param apc_param
;
7501 struct recv_thread_param recv_param
;
7505 DWORD bytesReturned
, flags
, id
;
7506 struct sockaddr_in addr
;
7507 unsigned int apc_count
;
7511 HANDLE thread
, event
= NULL
, io_port
;
7513 tcp_socketpair(&src
, &dest
);
7515 memset(&ov
, 0, sizeof(ov
));
7520 /* Send 4 bytes and receive in two calls of 2 */
7521 SetLastError(0xdeadbeef);
7522 iret
= send(src
, "test", 4, 0);
7523 ok(iret
== 4, "Expected 4, got %d\n", iret
);
7524 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7525 SetLastError(0xdeadbeef);
7526 bytesReturned
= 0xdeadbeef;
7529 dwret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
7530 ok(dwret
, "QueueUserAPC returned %lu\n", dwret
);
7532 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
7533 ok(!iret
, "Expected 0, got %d\n", iret
);
7534 ok(bytesReturned
== 2, "Expected 2, got %ld\n", bytesReturned
);
7535 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7537 ok(!apc_count
, "got apc_count %u.\n", apc_count
);
7539 ok(apc_count
== 1, "got apc_count %u.\n", apc_count
);
7541 SetLastError(0xdeadbeef);
7542 bytesReturned
= 0xdeadbeef;
7543 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
7544 ok(!iret
, "Expected 0, got %d\n", iret
);
7545 ok(bytesReturned
== 2, "Expected 2, got %ld\n", bytesReturned
);
7546 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7549 SetLastError(0xdeadbeef);
7550 iret
= send(src
, "test", 4, 0);
7551 ok(iret
== 4, "Expected 4, got %d\n", iret
);
7552 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7553 SetLastError(0xdeadbeef);
7554 bytesReturned
= 0xdeadbeef;
7555 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
7556 ok(!iret
, "Expected 0, got %d\n", iret
);
7557 ok(bytesReturned
== 4, "Expected 4, got %ld\n", bytesReturned
);
7558 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7560 /* Test 2 buffers */
7563 bufs
[1].buf
= buf
+ 10;
7564 SetLastError(0xdeadbeef);
7565 iret
= send(src
, "deadbeefs", 9, 0);
7566 ok(iret
== 9, "Expected 9, got %d\n", iret
);
7567 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7568 SetLastError(0xdeadbeef);
7569 bytesReturned
= 0xdeadbeef;
7570 iret
= WSARecv(dest
, bufs
, 2, &bytesReturned
, &flags
, NULL
, NULL
);
7571 ok(!iret
, "Expected 0, got %d\n", iret
);
7572 ok(bytesReturned
== 9, "Expected 9, got %ld\n", bytesReturned
);
7573 bufs
[0].buf
[4] = '\0';
7574 bufs
[1].buf
[5] = '\0';
7575 ok(!strcmp(bufs
[0].buf
, "dead"), "buf[0] doesn't match: %s != dead\n", bufs
[0].buf
);
7576 ok(!strcmp(bufs
[1].buf
, "beefs"), "buf[1] doesn't match: %s != beefs\n", bufs
[1].buf
);
7577 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %ld\n", GetLastError());
7579 bufs
[0].len
= sizeof(buf
);
7580 ov
.hEvent
= event
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7581 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %ld\n", GetLastError());
7585 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, NULL
);
7586 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %ld\n", iret
, GetLastError());
7588 iret
= WSARecv(dest
, bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
7589 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %ld\n", iret
, GetLastError());
7591 close_with_rst(src
);
7593 dwret
= WaitForSingleObject(ov
.hEvent
, 1000);
7594 ok(dwret
== WAIT_OBJECT_0
, "Waiting for disconnect event failed with %ld + errno %ld\n", dwret
, GetLastError());
7596 bret
= GetOverlappedResult((HANDLE
)dest
, &ov
, &bytesReturned
, FALSE
);
7597 ok(!bret
, "expected failure\n");
7598 ok(GetLastError() == ERROR_NETNAME_DELETED
, "got error %lu\n", GetLastError());
7599 ok(bytesReturned
== 0, "Bytes received is %ld\n", bytesReturned
);
7601 dest
= INVALID_SOCKET
;
7603 src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
7604 ok(src
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
7605 if (src
== INVALID_SOCKET
) goto end
;
7607 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
7608 ok(server
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
7609 if (server
== INVALID_SOCKET
) goto end
;
7611 memset(&addr
, 0, sizeof(addr
));
7612 addr
.sin_family
= AF_INET
;
7613 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7614 iret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
7615 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
7618 iret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
7619 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
7621 iret
= listen(server
, 1);
7622 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
7624 iret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
7625 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
7628 dest
= accept(server
, (struct sockaddr
*)&addr
, &len
);
7629 ok(dest
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
7630 if (dest
== INVALID_SOCKET
) goto end
;
7632 send(src
, "test message", sizeof("test message"), 0);
7633 recv_param
.sock
= dest
;
7634 recv_param
.overlapped
= TRUE
;
7635 thread
= CreateThread(NULL
, 0, recv_thread
, &recv_param
, 0, &id
);
7636 WaitForSingleObject(thread
, 3000);
7637 CloseHandle(thread
);
7639 recv_param
.overlapped
= FALSE
;
7640 thread
= CreateThread(NULL
, 0, recv_thread
, &recv_param
, 0, &id
);
7641 apc_param
.apc_count
= 0;
7642 apc_param
.sock
= src
;
7643 dwret
= QueueUserAPC(recv_thread_apc_func
, thread
, (ULONG_PTR
)&apc_param
);
7644 ok(dwret
, "QueueUserAPC returned %lu\n", dwret
);
7645 WaitForSingleObject(thread
, 3000);
7646 ok(apc_param
.apc_count
== 1, "got apc_count %u.\n", apc_param
.apc_count
);
7648 CloseHandle(thread
);
7650 memset(&ov
, 0, sizeof(ov
));
7653 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, io_completion
);
7654 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %ld\n", iret
, GetLastError());
7655 send(src
, "test message", sizeof("test message"), 0);
7657 completion_called
= 0;
7658 dwret
= SleepEx(1000, TRUE
);
7659 ok(dwret
== WAIT_IO_COMPLETION
, "got %lu\n", dwret
);
7660 ok(completion_called
== 1, "completion not called\n");
7662 dwret
= WaitForSingleObject(event
, 1);
7663 ok(dwret
== WAIT_TIMEOUT
, "got %lu\n", dwret
);
7665 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, NULL
, 0, 0 );
7666 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
7668 /* Using completion function on socket associated with completion port is not allowed. */
7669 memset(&ov
, 0, sizeof(ov
));
7670 completion_called
= 0;
7671 iret
= WSARecv(dest
, bufs
, 1, NULL
, &flags
, &ov
, io_completion
);
7672 ok(iret
== SOCKET_ERROR
&& GetLastError() == WSAEINVAL
, "WSARecv failed - %d error %ld\n", iret
, GetLastError());
7673 ok(!completion_called
, "completion called\n");
7675 CloseHandle(io_port
);
7678 if (server
!= INVALID_SOCKET
)
7679 closesocket(server
);
7680 if (dest
!= INVALID_SOCKET
)
7682 if (src
!= INVALID_SOCKET
)
7685 WSACloseEvent(event
);
7688 struct write_watch_thread_args
7697 static DWORD CALLBACK
write_watch_thread( void *arg
)
7699 struct write_watch_thread_args
*args
= arg
;
7700 struct sockaddr addr
;
7701 int addr_len
= sizeof(addr
), ret
;
7702 DWORD bytes
, flags
= 0;
7708 ret
= recv( args
->dest
, args
->base
, args
->size
, 0 );
7709 ok( ret
== strlen(args
->expect
) + 1, "wrong len %d\n", ret
);
7710 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
7713 ret
= recvfrom( args
->dest
, args
->base
, args
->size
, 0, &addr
, &addr_len
);
7714 ok( ret
== strlen(args
->expect
) + 1, "wrong len %d\n", ret
);
7715 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
7718 buf
[0].len
= args
->size
;
7719 buf
[0].buf
= args
->base
;
7720 ret
= WSARecv( args
->dest
, buf
, 1, &bytes
, &flags
, NULL
, NULL
);
7721 ok( !ret
, "WSARecv failed %lu\n", GetLastError() );
7722 ok( bytes
== strlen(args
->expect
) + 1, "wrong len %ld\n", bytes
);
7723 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
7726 buf
[0].len
= args
->size
;
7727 buf
[0].buf
= args
->base
;
7728 ret
= WSARecvFrom( args
->dest
, buf
, 1, &bytes
, &flags
, &addr
, &addr_len
, NULL
, NULL
);
7729 ok( !ret
, "WSARecvFrom failed %lu\n", GetLastError() );
7730 ok( bytes
== strlen(args
->expect
) + 1, "wrong len %ld\n", bytes
);
7731 ok( !strcmp( args
->base
, args
->expect
), "wrong data\n" );
7737 static void test_write_watch(void)
7742 struct write_watch_thread_args args
;
7743 DWORD bytesReturned
, flags
, size
;
7744 struct sockaddr addr
;
7746 HANDLE thread
, event
;
7751 UINT (WINAPI
*pGetWriteWatch
)(DWORD
,LPVOID
,SIZE_T
,LPVOID
*,ULONG_PTR
*,ULONG
*);
7753 pGetWriteWatch
= (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" );
7754 if (!pGetWriteWatch
)
7756 win_skip( "write watched not supported\n" );
7760 /* Windows 11 no longer triggers write watches anymore. */
7762 tcp_socketpair(&src
, &dest
);
7764 memset(&ov
, 0, sizeof(ov
));
7765 ov
.hEvent
= event
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7766 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %ld\n", GetLastError());
7771 base
= VirtualAlloc( 0, size
, MEM_RESERVE
| MEM_COMMIT
| MEM_WRITE_WATCH
, PAGE_READWRITE
);
7772 ok( base
!= NULL
, "VirtualAlloc failed %lu\n", GetLastError() );
7774 memset( base
, 0, size
);
7776 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7777 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7778 ok( count
== 16, "wrong count %Iu\n", count
);
7782 bufs
[1].len
= 0x8000;
7783 bufs
[1].buf
= base
+ 0x4000;
7785 ret
= WSARecv( dest
, bufs
, 2, NULL
, &flags
, &ov
, NULL
);
7786 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
7787 "WSARecv failed - %d error %ld\n", ret
, GetLastError());
7790 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7791 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7792 ok( count
== 9 || !count
/* Win 11 */, "wrong count %Iu\n", count
);
7793 ok( !base
[0], "data set\n" );
7795 send(src
, "test message", sizeof("test message"), 0);
7797 ret
= GetOverlappedResult( (HANDLE
)dest
, &ov
, &bytesReturned
, TRUE
);
7798 ok( ret
, "GetOverlappedResult failed %lu\n", GetLastError() );
7799 ok( bytesReturned
== sizeof("test message"), "wrong size %lu\n", bytesReturned
);
7800 ok( !memcmp( base
, "test ", 5 ), "wrong data %s\n", base
);
7801 ok( !memcmp( base
+ 0x4000, "message", 8 ), "wrong data %s\n", base
+ 0x4000 );
7804 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7805 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7806 ok( count
== 0, "wrong count %Iu\n", count
);
7808 memset( base
, 0, size
);
7810 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7811 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7812 ok( count
== 16, "wrong count %Iu\n", count
);
7814 bufs
[1].len
= 0x4000;
7815 bufs
[1].buf
= base
+ 0x2000;
7816 ret
= WSARecvFrom( dest
, bufs
, 2, NULL
, &flags
, &addr
, &addr_len
, &ov
, NULL
);
7817 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
7818 "WSARecv failed - %d error %ld\n", ret
, GetLastError());
7821 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7822 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7823 ok( count
== 5 || !count
/* Win 11 */, "wrong count %Iu\n", count
);
7824 ok( !base
[0], "data set\n" );
7826 send(src
, "test message", sizeof("test message"), 0);
7828 ret
= GetOverlappedResult( (HANDLE
)dest
, &ov
, &bytesReturned
, TRUE
);
7829 ok( ret
, "GetOverlappedResult failed %lu\n", GetLastError() );
7830 ok( bytesReturned
== sizeof("test message"), "wrong size %lu\n", bytesReturned
);
7831 ok( !memcmp( base
, "test ", 5 ), "wrong data %s\n", base
);
7832 ok( !memcmp( base
+ 0x2000, "message", 8 ), "wrong data %s\n", base
+ 0x2000 );
7835 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7836 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7837 ok( count
== 0, "wrong count %Iu\n", count
);
7839 memset( base
, 0, size
);
7841 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7842 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7843 ok( count
== 16, "wrong count %Iu\n", count
);
7848 args
.expect
= "test message";
7849 for (args
.func
= 0; args
.func
< 4; args
.func
++)
7851 thread
= CreateThread( NULL
, 0, write_watch_thread
, &args
, 0, NULL
);
7855 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7856 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7857 ok( count
== 8 || !count
/* Win 11 */, "wrong count %Iu\n", count
);
7859 send(src
, "test message", sizeof("test message"), 0);
7860 WaitForSingleObject( thread
, 10000 );
7861 CloseHandle( thread
);
7864 ret
= pGetWriteWatch( WRITE_WATCH_FLAG_RESET
, base
, size
, results
, &count
, &pagesize
);
7865 ok( !ret
, "GetWriteWatch failed %lu\n", GetLastError() );
7866 ok( count
== 0, "wrong count %Iu\n", count
);
7868 WSACloseEvent( event
);
7869 closesocket( dest
);
7871 VirtualFree( base
, 0, MEM_FREE
);
7874 static void test_WSAPoll(void)
7876 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
7878 SOCKET listener
, server
, client
;
7879 struct sockaddr_in address
;
7881 HANDLE thread_handle
;
7885 static const short invalid_flags
[] =
7886 {POLLERR
, POLLHUP
, POLLNVAL
, 0x8, POLLWRBAND
, 0x40, 0x80, POLLPRI
, 0x800, 0x1000, 0x2000, 0x4000, 0x8000};
7888 if (!pWSAPoll
) /* >= Vista */
7890 win_skip("WSAPoll is unsupported, some tests will be skipped.\n");
7894 /* Invalid parameters test */
7895 SetLastError(0xdeadbeef);
7896 ret
= pWSAPoll(NULL
, 0, 0);
7897 err
= GetLastError();
7898 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
7899 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
7900 SetLastError(0xdeadbeef);
7901 ret
= pWSAPoll(NULL
, 1, 0);
7902 err
= GetLastError();
7903 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
7904 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
7905 SetLastError(0xdeadbeef);
7906 ret
= pWSAPoll(NULL
, 0, 1);
7907 err
= GetLastError();
7908 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
7909 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
7910 SetLastError(0xdeadbeef);
7911 ret
= pWSAPoll(NULL
, 1, 1);
7912 err
= GetLastError();
7913 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
7914 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
7916 memset(&address
, 0, sizeof(address
));
7917 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7918 address
.sin_family
= AF_INET
;
7919 len
= sizeof(address
);
7920 listener
= setup_server_socket(&address
, &len
);
7922 for (i
= 0; i
< ARRAY_SIZE(invalid_flags
); ++i
)
7924 fds
[0].fd
= listener
;
7925 fds
[0].events
= invalid_flags
[i
];
7926 fds
[0].revents
= 0xdead;
7927 WSASetLastError(0xdeadbeef);
7928 ret
= pWSAPoll(fds
, 1, 0);
7929 todo_wine
ok(ret
== -1, "got %d\n", ret
);
7930 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7933 /* When no events are pending poll returns 0 with no error */
7934 fds
[0].fd
= listener
;
7935 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
7936 fds
[0].revents
= 0xdead;
7937 ret
= pWSAPoll(fds
, 1, 0);
7938 ok(ret
== 0, "got %d\n", ret
);
7939 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
7942 fds
[0].events
= POLLERR
;
7943 fds
[0].revents
= 0xdead;
7944 fds
[1].fd
= listener
;
7945 fds
[1].events
= POLLIN
;
7946 fds
[1].revents
= 0xdead;
7947 WSASetLastError(0xdeadbeef);
7948 ret
= pWSAPoll(fds
, 2, 0);
7949 ok(!ret
, "got %d\n", ret
);
7950 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
7951 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
7952 ok(!fds
[1].revents
, "got events %#x\n", fds
[1].revents
);
7954 fds
[0].fd
= listener
;
7955 fds
[0].events
= POLLIN
;
7956 fds
[0].revents
= 0xdead;
7957 fds
[1].fd
= 0xabacab;
7958 fds
[1].events
= POLLIN
;
7959 fds
[1].revents
= 0xdead;
7960 WSASetLastError(0xdeadbeef);
7961 ret
= pWSAPoll(fds
, 2, 0);
7962 ok(!ret
, "got %d\n", ret
);
7963 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
7964 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
7965 ok(fds
[1].revents
== POLLNVAL
, "got events %#x\n", fds
[1].revents
);
7967 fds
[0].fd
= listener
;
7968 fds
[0].events
= POLLIN
;
7969 fds
[0].revents
= 0xdead;
7970 fds
[1].fd
= 0xabacab;
7971 fds
[1].events
= POLLERR
;
7972 fds
[1].revents
= 0xdead;
7973 WSASetLastError(0xdeadbeef);
7974 ret
= pWSAPoll(fds
, 2, 0);
7975 todo_wine
ok(ret
== -1, "got %d\n", ret
);
7976 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
7977 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
7978 todo_wine
ok(!fds
[1].revents
, "got events %#x\n", fds
[1].revents
);
7981 fds
[0].events
= POLLERR
;
7982 fds
[0].revents
= 0xdead;
7983 fds
[1].fd
= 0xabacab;
7984 fds
[1].events
= POLLERR
;
7985 fds
[1].revents
= 0xdead;
7986 WSASetLastError(0xdeadbeef);
7987 ret
= pWSAPoll(fds
, 2, 0);
7988 ok(ret
== -1, "got %d\n", ret
);
7989 ok(WSAGetLastError() == WSAENOTSOCK
, "got error %u\n", WSAGetLastError());
7990 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
7991 ok(fds
[1].revents
== POLLNVAL
, "got events %#x\n", fds
[1].revents
);
7993 /* Test listening socket connection attempt notifications */
7994 client
= setup_connector_socket(&address
, len
, TRUE
);
7996 fds
[0].fd
= listener
;
7997 fds
[0].events
= POLLIN
;
7998 fds
[0].revents
= 0xdead;
7999 ret
= pWSAPoll(fds
, 1, 100);
8000 ok(ret
== 1, "got %d\n", ret
);
8001 ok(fds
[0].revents
== POLLRDNORM
, "got events %#x\n", fds
[0].revents
);
8003 fds
[0].revents
= 0xdead;
8004 ret
= pWSAPoll(fds
, 1, 0);
8005 ok(ret
== 1, "got %d\n", ret
);
8006 ok(fds
[0].revents
== POLLRDNORM
, "got events %#x\n", fds
[0].revents
);
8008 fds
[0].events
= POLLRDBAND
| POLLWRNORM
;
8009 fds
[0].revents
= 0xdead;
8010 ret
= pWSAPoll(fds
, 1, 0);
8011 ok(ret
== 0, "got %d\n", ret
);
8012 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
8014 server
= accept(listener
, NULL
, NULL
);
8015 ok(server
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
8016 set_blocking(client
, FALSE
);
8017 set_blocking(server
, FALSE
);
8019 for (i
= 0; i
< ARRAY_SIZE(invalid_flags
); ++i
)
8022 fds
[0].events
= invalid_flags
[i
];
8023 fds
[0].revents
= 0xdead;
8024 WSASetLastError(0xdeadbeef);
8025 ret
= pWSAPoll(fds
, 1, 0);
8026 todo_wine
ok(ret
== -1, "got %d\n", ret
);
8027 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8030 /* Test flags exposed by connected sockets. */
8032 fds
[0].fd
= listener
;
8033 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
8034 fds
[0].revents
= 0xdead;
8036 fds
[1].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
8037 fds
[1].revents
= 0xdead;
8039 fds
[2].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
8040 fds
[2].revents
= 0xdead;
8041 ret
= pWSAPoll(fds
, 3, 0);
8042 ok(ret
== 2, "got %d\n", ret
);
8043 ok(!fds
[0].revents
, "got events %#x\n", fds
[0].revents
);
8044 ok(fds
[1].revents
== POLLWRNORM
, "got events %#x\n", fds
[1].revents
);
8045 ok(fds
[2].revents
== POLLWRNORM
, "got events %#x\n", fds
[2].revents
);
8047 /* Test data receiving notifications */
8049 ret
= send(server
, "1234", 4, 0);
8050 ok(ret
== 4, "got %d\n", ret
);
8052 check_poll_mask(client
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
8053 check_poll(client
, POLLRDNORM
| POLLWRNORM
);
8054 check_poll(server
, POLLWRNORM
);
8056 ret
= sync_recv(client
, buffer
, sizeof(buffer
), 0);
8057 ok(ret
== 4, "got %d\n", ret
);
8059 check_poll(client
, POLLWRNORM
);
8060 check_poll(server
, POLLWRNORM
);
8062 /* Because the kernel asynchronously buffers data, this test is not reliable. */
8066 static const int large_buffer_size
= 1024 * 1024;
8067 char *large_buffer
= malloc(large_buffer_size
);
8069 while (send(server
, large_buffer
, large_buffer_size
, 0) == large_buffer_size
);
8071 check_poll(client
, POLLWRNORM
| POLLRDNORM
);
8072 check_poll(server
, 0);
8074 while (recv(client
, large_buffer
, large_buffer_size
, 0) > 0);
8076 check_poll(client
, POLLWRNORM
);
8077 check_poll(server
, POLLWRNORM
);
8082 /* Test OOB data notifications */
8084 ret
= send(client
, "A", 1, MSG_OOB
);
8085 ok(ret
== 1, "got %d\n", ret
);
8087 check_poll(client
, POLLWRNORM
);
8088 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDBAND
);
8089 check_poll(server
, POLLWRNORM
| POLLRDBAND
);
8092 ret
= recv(server
, buffer
, 1, MSG_OOB
);
8093 ok(ret
== 1, "got %d\n", ret
);
8094 ok(buffer
[0] == 'A', "got %#x\n", buffer
[0]);
8096 check_poll(client
, POLLWRNORM
);
8097 check_poll(server
, POLLWRNORM
);
8099 /* If the socket is OOBINLINED the notification is like normal data */
8102 ret
= setsockopt(server
, SOL_SOCKET
, SO_OOBINLINE
, (char *)&ret
, sizeof(ret
));
8103 ok(!ret
, "got error %u\n", WSAGetLastError());
8104 ret
= send(client
, "A", 1, MSG_OOB
);
8105 ok(ret
== 1, "got %d\n", ret
);
8107 check_poll(client
, POLLWRNORM
);
8108 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
8109 check_poll(server
, POLLWRNORM
| POLLRDNORM
);
8112 ret
= recv(server
, buffer
, 1, 0);
8113 ok(ret
== 1, "got %d\n", ret
);
8114 ok(buffer
[0] == 'A', "got %#x\n", buffer
[0]);
8116 check_poll(client
, POLLWRNORM
);
8117 check_poll_todo(server
, POLLWRNORM
);
8119 /* Test shutdown. */
8121 ret
= shutdown(client
, SD_RECEIVE
);
8122 ok(!ret
, "got error %u\n", WSAGetLastError());
8124 check_poll(client
, POLLWRNORM
);
8125 check_poll_todo(server
, POLLWRNORM
);
8127 ret
= shutdown(client
, SD_SEND
);
8128 ok(!ret
, "got error %u\n", WSAGetLastError());
8130 check_poll(client
, POLLWRNORM
);
8131 check_poll_mask_todo(server
, 0, POLLHUP
);
8132 check_poll_todo(server
, POLLWRNORM
| POLLHUP
);
8134 closesocket(client
);
8135 closesocket(server
);
8137 /* Test shutdown via closesocket(). */
8139 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8140 ret
= connect(client
, (struct sockaddr
*)&address
, sizeof(address
));
8141 ok(!ret
, "got error %u\n", WSAGetLastError());
8142 server
= accept(listener
, NULL
, NULL
);
8143 ok(server
!= -1, "got error %u\n", WSAGetLastError());
8145 closesocket(client
);
8147 check_poll_mask(server
, 0, POLLHUP
);
8148 check_poll(server
, POLLWRNORM
| POLLHUP
);
8150 closesocket(server
);
8152 /* Test shutdown with data in the pipe. */
8154 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8155 ret
= connect(client
, (struct sockaddr
*)&address
, sizeof(address
));
8156 ok(!ret
, "got error %u\n", WSAGetLastError());
8157 server
= accept(listener
, NULL
, NULL
);
8158 ok(server
!= -1, "got error %u\n", WSAGetLastError());
8160 ret
= send(client
, "data", 5, 0);
8161 ok(ret
== 5, "got %d\n", ret
);
8163 check_poll(client
, POLLWRNORM
);
8164 check_poll_mask(server
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
8165 check_poll(server
, POLLWRNORM
| POLLRDNORM
);
8167 ret
= shutdown(client
, SD_SEND
);
8169 check_poll(client
, POLLWRNORM
);
8170 check_poll_mask_todo(server
, 0, POLLHUP
);
8171 check_poll_todo(server
, POLLWRNORM
| POLLRDNORM
| POLLHUP
);
8173 closesocket(client
);
8174 closesocket(server
);
8176 /* Test closing a socket while selecting on it. */
8178 tcp_socketpair(&client
, &server
);
8180 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &client
, 0, NULL
);
8182 fds
[0].events
= POLLRDNORM
| POLLRDBAND
;
8183 fds
[0].revents
= 0xdead;
8185 ret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
8186 ok(ret
, "QueueUserAPC returned %d\n", ret
);
8187 ret
= pWSAPoll(fds
, 1, 2000);
8188 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
8189 ok(ret
== 1, "got %d\n", ret
);
8190 ok(fds
[0].revents
== POLLNVAL
, "got events %#x\n", fds
[0].revents
);
8191 ret
= WaitForSingleObject(thread_handle
, 1000);
8192 ok(!ret
, "wait failed\n");
8193 CloseHandle(thread_handle
);
8195 closesocket(server
);
8197 /* Test a failed connection.
8199 * The following WSAPoll() call times out on versions older than w10pro64,
8200 * but even on w10pro64 it takes over 2 seconds for an error to be reported,
8201 * so make the test interactive-only. */
8202 if (winetest_interactive
)
8204 const struct sockaddr_in invalid_addr
=
8206 .sin_family
= AF_INET
,
8207 .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
),
8212 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8213 set_blocking(client
, FALSE
);
8215 ret
= connect(client
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
8216 ok(ret
== -1, "got %d\n", ret
);
8217 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
8220 fds
[0].events
= POLLRDNORM
| POLLRDBAND
| POLLWRNORM
;
8221 fds
[0].revents
= 0xdead;
8222 ret
= pWSAPoll(fds
, 1, 10000);
8223 ok(ret
== 1, "got %d\n", ret
);
8224 todo_wine
ok(fds
[0].revents
== (POLLWRNORM
| POLLHUP
| POLLERR
), "got events %#x\n", fds
[0].revents
);
8228 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
8229 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
8230 ok(err
== WSAECONNREFUSED
, "got error %u\n", err
);
8234 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
8235 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
8236 ok(err
== WSAECONNREFUSED
, "got error %u\n", err
);
8238 check_poll_todo(client
, POLLWRNORM
| POLLHUP
| POLLERR
);
8240 closesocket(client
);
8242 /* test polling after a (synchronous) failure */
8244 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8246 ret
= connect(client
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
8247 ok(ret
== -1, "got %d\n", ret
);
8248 ok(WSAGetLastError() == WSAECONNREFUSED
, "got error %u\n", WSAGetLastError());
8250 check_poll_todo(client
, POLLWRNORM
| POLLHUP
| POLLERR
);
8254 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&err
, &len
);
8255 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
8256 todo_wine
ok(!err
, "got error %u\n", err
);
8258 closesocket(client
);
8261 closesocket(listener
);
8263 /* Test UDP sockets. */
8265 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
8266 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
8268 check_poll(client
, POLLWRNORM
);
8269 check_poll(server
, POLLWRNORM
);
8271 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
8272 ok(!ret
, "got error %u\n", WSAGetLastError());
8273 len
= sizeof(address
);
8274 ret
= getsockname(client
, (struct sockaddr
*)&address
, &len
);
8275 ok(!ret
, "got error %u\n", WSAGetLastError());
8277 check_poll(client
, POLLWRNORM
);
8278 check_poll(server
, POLLWRNORM
);
8280 ret
= sendto(server
, "data", 5, 0, (struct sockaddr
*)&address
, sizeof(address
));
8281 ok(ret
== 5, "got %d\n", ret
);
8283 check_poll_mask(client
, POLLRDNORM
| POLLRDBAND
, POLLRDNORM
);
8284 check_poll(client
, POLLWRNORM
| POLLRDNORM
);
8285 check_poll(server
, POLLWRNORM
);
8287 closesocket(client
);
8288 closesocket(server
);
8291 static void test_connect(void)
8293 SOCKET listener
= INVALID_SOCKET
;
8294 SOCKET acceptor
= INVALID_SOCKET
;
8295 SOCKET connector
= INVALID_SOCKET
;
8296 struct sockaddr_in address
, conaddress
;
8298 OVERLAPPED overlapped
;
8299 LPFN_CONNECTEX pConnectEx
;
8300 GUID connectExGuid
= WSAID_CONNECTEX
;
8301 DWORD bytesReturned
;
8307 memset(&overlapped
, 0, sizeof(overlapped
));
8309 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
8310 ok(listener
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8312 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8313 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8315 memset(&address
, 0, sizeof(address
));
8316 address
.sin_family
= AF_INET
;
8317 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8318 iret
= bind(listener
, (struct sockaddr
*)&address
, sizeof(address
));
8319 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8321 addrlen
= sizeof(address
);
8322 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
8323 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
8325 iret
= listen(listener
, 1);
8326 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
8328 iret
= set_blocking(listener
, TRUE
);
8329 ok(!iret
, "failed to set nonblocking, error %u\n", WSAGetLastError());
8331 bytesReturned
= 0xdeadbeef;
8332 iret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectExGuid
, sizeof(connectExGuid
),
8333 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
8334 ok(!iret
, "failed to get ConnectEx, error %u\n", WSAGetLastError());
8336 ok(bytesReturned
== sizeof(pConnectEx
), "expected sizeof(pConnectEx), got %lu\n", bytesReturned
);
8338 WSASetLastError(0xdeadbeef);
8339 iret
= connect(listener
, (struct sockaddr
*)&address
, sizeof(address
));
8340 ok(iret
== -1, "got %d\n", iret
);
8341 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8343 WSASetLastError(0xdeadbeef);
8344 overlapped
.Internal
= 0xdeadbeef;
8345 overlapped
.InternalHigh
= 0xdeadbeef;
8346 iret
= pConnectEx(listener
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
8347 ok(!iret
, "got %d\n", iret
);
8348 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8349 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8350 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
8352 bret
= pConnectEx(INVALID_SOCKET
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
8353 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "ConnectEx on invalid socket "
8354 "returned %d + errno %d\n", bret
, WSAGetLastError());
8356 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
8357 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "ConnectEx on a unbound socket "
8358 "returned %d + errno %d\n", bret
, WSAGetLastError());
8360 /* ConnectEx needs a bound socket */
8361 memset(&conaddress
, 0, sizeof(conaddress
));
8362 conaddress
.sin_family
= AF_INET
;
8363 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8364 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
8365 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8367 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, NULL
);
8368 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "ConnectEx on a NULL overlapped "
8369 "returned %d + errno %d\n", bret
, WSAGetLastError());
8371 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8373 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
8374 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
8375 "returned %d + errno %d\n", bret
, WSAGetLastError());
8376 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
8377 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %ld + errno %ld\n", dwret
, GetLastError());
8379 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
8380 ok(bret
, "Connecting failed, error %ld\n", GetLastError());
8381 ok(bytesReturned
== 0, "Bytes sent is %ld\n", bytesReturned
);
8383 closesocket(connector
);
8384 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8385 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8386 /* ConnectEx needs a bound socket */
8387 memset(&conaddress
, 0, sizeof(conaddress
));
8388 conaddress
.sin_family
= AF_INET
;
8389 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8390 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
8391 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8393 acceptor
= accept(listener
, NULL
, NULL
);
8394 ok(acceptor
!= INVALID_SOCKET
, "failed to accept socket, error %u\n", WSAGetLastError());
8399 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, buffer
, 3, &bytesReturned
, &overlapped
);
8400 memset(buffer
, 0, 3);
8401 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
8402 "returned %d + errno %d\n", bret
, WSAGetLastError());
8403 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
8404 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %ld + errno %ld\n", dwret
, GetLastError());
8406 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
8407 ok(bret
, "Connecting failed, error %ld\n", GetLastError());
8408 ok(bytesReturned
== 3, "Bytes sent is %ld\n", bytesReturned
);
8410 acceptor
= accept(listener
, NULL
, NULL
);
8411 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket error %d\n", WSAGetLastError());
8413 bytesReturned
= recv(acceptor
, buffer
, 3, 0);
8415 ok(bytesReturned
== 3, "Didn't get all sent data, got only %ld\n", bytesReturned
);
8416 ok(buffer
[0] == '1' && buffer
[1] == '2' && buffer
[2] == '3',
8417 "Failed to get the right data, expected '123', got '%s'\n", buffer
);
8419 WSASetLastError(0xdeadbeef);
8420 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
8421 ok(iret
== -1, "got %d\n", iret
);
8422 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8424 WSASetLastError(0xdeadbeef);
8425 iret
= connect(acceptor
, (struct sockaddr
*)&address
, sizeof(address
));
8426 ok(iret
== -1, "got %d\n", iret
);
8427 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8429 WSASetLastError(0xdeadbeef);
8430 overlapped
.Internal
= 0xdeadbeef;
8431 overlapped
.InternalHigh
= 0xdeadbeef;
8432 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
8433 ok(!bret
, "got %d\n", bret
);
8434 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8435 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8436 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
8438 WSASetLastError(0xdeadbeef);
8439 overlapped
.Internal
= 0xdeadbeef;
8440 overlapped
.InternalHigh
= 0xdeadbeef;
8441 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
8442 ok(!bret
, "got %d\n", bret
);
8443 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8444 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8445 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
8447 closesocket(connector
);
8448 closesocket(acceptor
);
8450 tcp_socketpair(&connector
, &acceptor
);
8452 WSASetLastError(0xdeadbeef);
8453 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
8454 ok(iret
== -1, "got %d\n", iret
);
8455 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8457 WSASetLastError(0xdeadbeef);
8458 iret
= connect(acceptor
, (struct sockaddr
*)&address
, sizeof(address
));
8459 ok(iret
== -1, "got %d\n", iret
);
8460 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8462 WSASetLastError(0xdeadbeef);
8463 overlapped
.Internal
= 0xdeadbeef;
8464 overlapped
.InternalHigh
= 0xdeadbeef;
8465 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
8466 ok(!bret
, "got %d\n", bret
);
8467 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8468 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8469 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
8471 WSASetLastError(0xdeadbeef);
8472 overlapped
.Internal
= 0xdeadbeef;
8473 overlapped
.InternalHigh
= 0xdeadbeef;
8474 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&address
, sizeof(address
), NULL
, 0, &bytesReturned
, &overlapped
);
8475 ok(!bret
, "got %d\n", bret
);
8476 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
8477 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8478 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
8480 closesocket(connector
);
8481 closesocket(acceptor
);
8483 /* Connect with error */
8485 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8486 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8487 /* ConnectEx needs a bound socket */
8488 memset(&conaddress
, 0, sizeof(conaddress
));
8489 conaddress
.sin_family
= AF_INET
;
8490 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8491 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
8492 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8494 address
.sin_port
= htons(1);
8496 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
8497 ok(bret
== FALSE
&& GetLastError() == ERROR_IO_PENDING
, "ConnectEx to bad destination failed: "
8498 "returned %d + errno %ld\n", bret
, GetLastError());
8499 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
8500 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %ld + errno %ld\n", dwret
, GetLastError());
8502 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
8503 ok(bret
== FALSE
&& GetLastError() == ERROR_CONNECTION_REFUSED
,
8504 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
8506 WSACloseEvent(overlapped
.hEvent
);
8507 closesocket(connector
);
8511 /* Wait in connect() is alertable. This may take a very long time before connection fails,
8512 * so disable the test. Testing with localhost is unreliable as that may avoid waiting in
8514 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8515 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8516 address
.sin_addr
.s_addr
= inet_addr("8.8.8.8");
8517 address
.sin_port
= htons(255);
8521 ok(apc_count
== 0, "got apc_count %d.\n", apc_count
);
8522 bret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
8523 ok(bret
, "QueueUserAPC returned %d\n", bret
);
8524 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
8525 ok(apc_count
== 1, "got apc_count %d.\n", apc_count
);
8526 ok(iret
== -1 && (WSAGetLastError() == WSAECONNREFUSED
|| WSAGetLastError() == WSAETIMEDOUT
),
8527 "unexpected iret %d, error %d.\n", iret
, WSAGetLastError());
8528 closesocket(connector
);
8531 /* Test connect after previous connect attempt failure. */
8532 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8533 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8535 conaddress
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
8536 conaddress
.sin_port
= htons(255);
8537 iret
= connect(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
8538 ok(iret
== -1, "connection succeeded.\n");
8540 ok(WSAGetLastError() == WSAECONNREFUSED
, "got error %u\n", WSAGetLastError());
8541 set_blocking( connector
, FALSE
);
8542 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
8543 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
8545 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
8546 ok(iret
== -1 && WSAGetLastError() == WSAEWOULDBLOCK
, "unexpected iret %d, error %d.\n",
8547 iret
, WSAGetLastError());
8548 acceptor
= accept(listener
, NULL
, NULL
);
8549 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket error %d\n", WSAGetLastError());
8551 closesocket(acceptor
);
8552 closesocket(connector
);
8553 closesocket(listener
);
8556 static void test_AcceptEx(void)
8558 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
8559 SOCKET listener
, acceptor
, acceptor2
, connector
, connector2
;
8560 struct sockaddr_in bindAddress
, peerAddress
, *readBindAddress
, *readRemoteAddress
;
8561 int socklen
, iret
, localSize
= sizeof(struct sockaddr_in
), remoteSize
= localSize
;
8562 GUID acceptExGuid
= WSAID_ACCEPTEX
, getAcceptExGuid
= WSAID_GETACCEPTEXSOCKADDRS
;
8563 GUID connectex_guid
= WSAID_CONNECTEX
;
8564 LPFN_ACCEPTEX pAcceptEx
= NULL
;
8565 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs
= NULL
;
8566 LPFN_CONNECTEX pConnectEx
= NULL
;
8567 fd_set fds_accept
, fds_send
;
8568 static const struct timeval timeout
= {1, 0};
8569 char buffer
[1024], ipbuffer
[32];
8570 OVERLAPPED overlapped
= {0}, overlapped2
= {0};
8571 DWORD bytesReturned
, dwret
;
8574 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8575 overlapped2
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8577 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
8578 ok(listener
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8580 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
8581 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
8583 memset(&bindAddress
, 0, sizeof(bindAddress
));
8584 bindAddress
.sin_family
= AF_INET
;
8585 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8586 iret
= bind(listener
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8587 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
8589 socklen
= sizeof(bindAddress
);
8590 iret
= getsockname(listener
, (struct sockaddr
*)&bindAddress
, &socklen
);
8591 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
8593 iret
= set_blocking(listener
, FALSE
);
8594 ok(!iret
, "Failed to set nonblocking, error %u\n", WSAGetLastError());
8596 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
8597 &pAcceptEx
, sizeof(pAcceptEx
), &bytesReturned
, NULL
, NULL
);
8598 ok(!iret
, "Failed to get AcceptEx, error %u\n", WSAGetLastError());
8600 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &getAcceptExGuid
, sizeof(getAcceptExGuid
),
8601 &pGetAcceptExSockaddrs
, sizeof(pGetAcceptExSockaddrs
), &bytesReturned
, NULL
, NULL
);
8602 ok(!iret
, "Failed to get GetAcceptExSockaddrs, error %u\n", WSAGetLastError());
8604 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
8605 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
8606 ok(!iret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
8608 overlapped
.Internal
= 0xdeadbeef;
8609 bret
= pAcceptEx(INVALID_SOCKET
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
8610 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8611 &bytesReturned
, &overlapped
);
8612 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid listening socket "
8613 "returned %d + errno %d\n", bret
, WSAGetLastError());
8614 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8616 overlapped
.Internal
= 0xdeadbeef;
8617 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
8618 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8619 &bytesReturned
, &overlapped
);
8621 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "AcceptEx on a non-listening socket "
8622 "returned %d + errno %d\n", bret
, WSAGetLastError());
8623 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8624 if (!bret
&& WSAGetLastError() == ERROR_IO_PENDING
)
8625 CancelIo((HANDLE
)listener
);
8627 iret
= listen(listener
, 5);
8628 ok(!iret
, "failed to listen, error %lu\n", GetLastError());
8630 overlapped
.Internal
= 0xdeadbeef;
8631 bret
= pAcceptEx(listener
, INVALID_SOCKET
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
8632 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8633 &bytesReturned
, &overlapped
);
8634 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid accepting socket "
8635 "returned %d + errno %d\n", bret
, WSAGetLastError());
8636 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8638 overlapped
.Internal
= 0xdeadbeef;
8639 bret
= pAcceptEx(listener
, acceptor
, NULL
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
8640 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8641 &bytesReturned
, &overlapped
);
8642 todo_wine
ok(bret
== FALSE
&& WSAGetLastError() == WSAEFAULT
,
8643 "AcceptEx on NULL buffer returned %d + errno %d\n", bret
, WSAGetLastError());
8644 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8646 overlapped
.Internal
= 0xdeadbeef;
8647 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
8648 &bytesReturned
, &overlapped
);
8649 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
,
8650 "AcceptEx on too small local address size returned %d + errno %d\n",
8651 bret
, WSAGetLastError());
8652 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8654 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8655 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8656 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8657 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
8658 iret
= getsockname(connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
8659 ok(!iret
, "getsockname failed, error %u\n", WSAGetLastError());
8661 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
8662 ok(!dwret
, "wait failed\n");
8663 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
8664 ok(bret
, "got error %lu\n", GetLastError());
8665 ok(!(NTSTATUS
)overlapped
.Internal
, "got %#Ix\n", overlapped
.Internal
);
8666 ok(!bytesReturned
, "got size %lu\n", bytesReturned
);
8668 readBindAddress
= readRemoteAddress
= (struct sockaddr_in
*)0xdeadbeef;
8669 localSize
= remoteSize
= 0xdeadbeef;
8670 pGetAcceptExSockaddrs(buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
8671 (struct sockaddr
**)&readBindAddress
, &localSize
, (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
8672 todo_wine
ok(readBindAddress
== (struct sockaddr_in
*)0xdeadbeef, "got local addr %p\n", readBindAddress
);
8673 ok(!memcmp(readRemoteAddress
, &peerAddress
, sizeof(peerAddress
)), "remote addr didn't match\n");
8674 todo_wine
ok(localSize
== 0xdeadbeef, "got local size %u\n", localSize
);
8675 ok(remoteSize
== sizeof(struct sockaddr_in
), "got remote size %u\n", remoteSize
);
8677 closesocket(connector
);
8678 closesocket(acceptor
);
8680 /* A UDP socket cannot be accepted into. */
8682 acceptor
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
8684 overlapped
.Internal
= 0xdeadbeef;
8685 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8686 ok(!bret
, "expected failure\n");
8687 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8688 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8689 if (WSAGetLastError() == ERROR_IO_PENDING
)
8690 CancelIo((HANDLE
)listener
);
8692 closesocket(acceptor
);
8694 /* A bound socket cannot be accepted into. */
8696 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8697 iret
= bind(acceptor
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
8698 ok(!iret
, "got error %u\n", WSAGetLastError());
8700 overlapped
.Internal
= 0xdeadbeef;
8701 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8702 ok(!bret
, "expected failure\n");
8703 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8704 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8705 if (WSAGetLastError() == ERROR_IO_PENDING
)
8706 CancelIo((HANDLE
)listener
);
8708 closesocket(acceptor
);
8710 /* A connected socket cannot be accepted into. */
8712 tcp_socketpair(&acceptor
, &acceptor2
);
8714 overlapped
.Internal
= 0xdeadbeef;
8715 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8716 ok(!bret
, "expected failure\n");
8717 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8718 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8719 if (WSAGetLastError() == ERROR_IO_PENDING
)
8720 CancelIo((HANDLE
)listener
);
8722 overlapped
.Internal
= 0xdeadbeef;
8723 bret
= pAcceptEx(listener
, acceptor2
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8724 ok(!bret
, "expected failure\n");
8725 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8726 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
8727 if (WSAGetLastError() == ERROR_IO_PENDING
)
8728 CancelIo((HANDLE
)listener
);
8730 closesocket(acceptor
);
8731 closesocket(acceptor2
);
8733 /* Pass an insufficient local address size. */
8735 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8736 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8738 overlapped
.Internal
= 0xdeadbeef;
8739 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 3,
8740 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8741 ok(!bret
&& WSAGetLastError() == ERROR_IO_PENDING
, "got %d, error %u\n", bret
, WSAGetLastError());
8742 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got %#Ix\n", overlapped
.Internal
);
8744 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8745 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8746 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8747 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
8749 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
8750 ok(!dwret
, "wait failed\n");
8751 bytesReturned
= 0xdeadbeef;
8752 SetLastError(0xdeadbeef);
8753 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
8754 ok(!bret
, "expected failure\n");
8755 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "got error %lu\n", GetLastError());
8756 ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "got %#Ix\n", overlapped
.Internal
);
8757 ok(!bytesReturned
, "got size %lu\n", bytesReturned
);
8759 closesocket(acceptor
);
8761 /* The above connection request is not accepted. */
8762 acceptor
= accept(listener
, NULL
, NULL
);
8763 todo_wine
ok(acceptor
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
8764 closesocket(acceptor
);
8766 closesocket(connector
);
8768 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8769 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8771 overlapped
.Internal
= 0xdeadbeef;
8772 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 4,
8773 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8774 ok(!bret
&& WSAGetLastError() == ERROR_IO_PENDING
, "got %d, error %u\n", bret
, WSAGetLastError());
8775 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got %#Ix\n", overlapped
.Internal
);
8777 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8778 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8779 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8780 ok(!iret
, "failed to connect, error %u\n", WSAGetLastError());
8782 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
8783 ok(!dwret
, "wait failed\n");
8784 bytesReturned
= 0xdeadbeef;
8785 SetLastError(0xdeadbeef);
8786 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
8787 todo_wine
ok(!bret
, "expected failure\n");
8788 todo_wine
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "got error %lu\n", GetLastError());
8789 todo_wine
ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "got %#Ix\n", overlapped
.Internal
);
8790 ok(!bytesReturned
, "got size %lu\n", bytesReturned
);
8792 closesocket(acceptor
);
8794 /* The above connection request is not accepted. */
8795 acceptor
= accept(listener
, NULL
, NULL
);
8796 todo_wine
ok(acceptor
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
8797 closesocket(acceptor
);
8799 closesocket(connector
);
8801 acceptor
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8802 ok(acceptor
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8804 overlapped
.Internal
= 0xdeadbeef;
8805 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 15,
8806 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8807 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx on too small local address "
8808 "size returned %d + errno %d\n",
8809 bret
, WSAGetLastError());
8810 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8811 bret
= CancelIo((HANDLE
) listener
);
8812 ok(bret
, "Failed to cancel pending accept socket\n");
8814 overlapped
.Internal
= 0xdeadbeef;
8815 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16, 0,
8816 &bytesReturned
, &overlapped
);
8817 ok(bret
== FALSE
&& WSAGetLastError() == WSAEFAULT
,
8818 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
8819 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8821 overlapped
.Internal
= 0xdeadbeef;
8822 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
8823 sizeof(struct sockaddr_in
) + 15, &bytesReturned
, &overlapped
);
8824 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
,
8825 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
8826 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8827 bret
= CancelIo((HANDLE
) listener
);
8828 ok(bret
, "Failed to cancel pending accept socket\n");
8830 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
8831 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8832 &bytesReturned
, NULL
);
8833 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
8834 "returned %d + errno %d\n", bret
, WSAGetLastError());
8836 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, 0, &bytesReturned
, NULL
);
8837 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
8838 "returned %d + errno %d\n", bret
, WSAGetLastError());
8840 overlapped
.Internal
= 0xdeadbeef;
8841 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
8842 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8843 &bytesReturned
, &overlapped
);
8844 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
8845 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8847 /* try to accept into the same socket twice */
8848 overlapped
.Internal
= 0xdeadbeef;
8849 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
8850 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8851 &bytesReturned
, &overlapped
);
8852 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
,
8853 "AcceptEx on already pending socket returned %d + errno %d\n", bret
, WSAGetLastError());
8854 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8856 /* try to connect a socket that's being accepted into */
8857 iret
= connect(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8858 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
,
8859 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret
, WSAGetLastError());
8861 bret
= pConnectEx(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
),
8862 NULL
, 0, &bytesReturned
, &overlapped2
);
8863 ok(!bret
, "expected failure\n");
8864 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
8866 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
8867 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
8868 overlapped
.Internal
= 0xdeadbeef;
8869 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8870 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8872 dwret
= WaitForSingleObject(overlapped
.hEvent
, INFINITE
);
8873 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
8874 ok(overlapped
.Internal
== STATUS_SUCCESS
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8876 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
8877 ok(bret
, "GetOverlappedResult failed, error %ld\n", GetLastError());
8878 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %ld\n", bytesReturned
);
8880 /* Try to call getsockname on the acceptor socket.
8882 * On Windows, this requires setting SO_UPDATE_ACCEPT_CONTEXT. */
8883 iret
= setsockopt(acceptor
, SOL_SOCKET
, SO_UPDATE_ACCEPT_CONTEXT
, (char *)&listener
, sizeof(SOCKET
));
8884 ok(!iret
, "Failed to set accept context %ld\n", GetLastError());
8885 iret
= getsockname(acceptor
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
8886 ok(!iret
, "getsockname failed.\n");
8887 ok(remoteSize
== sizeof(struct sockaddr_in
), "got remote size %u\n", remoteSize
);
8889 closesocket(connector
);
8890 connector
= INVALID_SOCKET
;
8891 closesocket(acceptor
);
8893 /* Test short reads */
8895 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
8896 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
8897 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8898 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
8899 overlapped
.Internal
= 0xdeadbeef;
8900 bret
= pAcceptEx(listener
, acceptor
, buffer
, 2,
8901 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8902 &bytesReturned
, &overlapped
);
8903 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
8904 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8906 /* AcceptEx() still won't complete until we send data */
8907 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8908 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8910 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
8911 ok(dwret
== WAIT_TIMEOUT
, "Waiting for accept event timeout failed with %ld + errno %ld\n", dwret
, GetLastError());
8912 ok(overlapped
.Internal
== STATUS_PENDING
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8914 iret
= getsockname( connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
8915 ok( !iret
, "getsockname failed.\n");
8917 /* AcceptEx() could complete any time now */
8918 iret
= send(connector
, buffer
, 1, 0);
8919 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
8921 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
8922 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
8923 ok(overlapped
.Internal
== STATUS_SUCCESS
, "got %08lx\n", (ULONG
)overlapped
.Internal
);
8925 /* Check if the buffer from AcceptEx is decoded correctly */
8926 pGetAcceptExSockaddrs(buffer
, 2, sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8927 (struct sockaddr
**)&readBindAddress
, &localSize
,
8928 (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
8929 strcpy( ipbuffer
, inet_ntoa(readBindAddress
->sin_addr
));
8930 ok( readBindAddress
->sin_addr
.s_addr
== bindAddress
.sin_addr
.s_addr
,
8931 "Local socket address is different %s != %s\n",
8932 ipbuffer
, inet_ntoa(bindAddress
.sin_addr
));
8933 ok( readBindAddress
->sin_port
== bindAddress
.sin_port
,
8934 "Local socket port is different: %d != %d\n",
8935 readBindAddress
->sin_port
, bindAddress
.sin_port
);
8936 strcpy( ipbuffer
, inet_ntoa(readRemoteAddress
->sin_addr
));
8937 ok( readRemoteAddress
->sin_addr
.s_addr
== peerAddress
.sin_addr
.s_addr
,
8938 "Remote socket address is different %s != %s\n",
8939 ipbuffer
, inet_ntoa(peerAddress
.sin_addr
));
8940 ok( readRemoteAddress
->sin_port
== peerAddress
.sin_port
,
8941 "Remote socket port is different: %d != %d\n",
8942 readRemoteAddress
->sin_port
, peerAddress
.sin_port
);
8944 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
8945 ok(bret
, "GetOverlappedResult failed, error %ld\n", GetLastError());
8946 ok(bytesReturned
== 1, "bytesReturned isn't supposed to be %ld\n", bytesReturned
);
8948 closesocket(connector
);
8949 connector
= INVALID_SOCKET
;
8950 closesocket(acceptor
);
8952 /* Test CF_DEFER & AcceptEx interaction */
8954 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
8955 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
8956 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8957 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
8958 connector2
= socket(AF_INET
, SOCK_STREAM
, 0);
8959 ok(connector2
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
8961 iret
= set_blocking(connector
, FALSE
);
8962 ok(!iret
, "failed to set nonblocking, error %lu\n", GetLastError());
8963 iret
= set_blocking(connector2
, FALSE
);
8964 ok(!iret
, "failed to set nonblocking, error %lu\n", GetLastError());
8966 /* Connect socket #1 */
8967 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8968 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8972 FD_ZERO(&fds_accept
);
8973 FD_SET(listener
, &fds_accept
);
8974 iret
= select(0, &fds_accept
, NULL
, NULL
, &timeout
);
8975 ok(iret
== 1, "wait timed out\n");
8977 acceptor2
= WSAAccept(listener
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
8978 ok(acceptor2
== INVALID_SOCKET
, "expected failure\n");
8979 ok(WSAGetLastError() == WSATRY_AGAIN
, "got error %u\n", WSAGetLastError());
8980 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
8981 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
8982 ok(!bret
, "expected failure\n");
8983 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
8986 FD_SET(connector
, &fds_send
);
8987 iret
= select(0, NULL
, &fds_send
, NULL
, &timeout
);
8988 ok(iret
== 1, "wait timed out\n");
8990 iret
= send(connector
, "1", 1, 0);
8991 ok(iret
== 1, "got ret %d, error %u\n", iret
, WSAGetLastError());
8993 iret
= connect(connector2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8994 ok(iret
== SOCKET_ERROR
, "expected failure\n");
8995 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
8997 iret
= select(0, &fds_accept
, NULL
, NULL
, &timeout
);
8998 ok(iret
== 1, "wait timed out\n");
9000 acceptor2
= accept(listener
, NULL
, NULL
);
9001 ok(acceptor2
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
9002 closesocket(acceptor2
);
9005 FD_SET(connector2
, &fds_send
);
9006 iret
= select(0, NULL
, &fds_send
, NULL
, &timeout
);
9007 ok(iret
== 1, "wait timed out\n");
9009 iret
= send(connector2
, "2", 1, 0);
9010 ok(iret
== 1, "got ret %d, error %u\n", iret
, WSAGetLastError());
9012 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
9013 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
9015 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
9016 ok(bret
, "GetOverlappedResult failed, error %ld\n", GetLastError());
9017 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %ld\n", bytesReturned
);
9019 set_blocking(acceptor
, TRUE
);
9020 iret
= recv( acceptor
, buffer
, 2, 0);
9021 ok(iret
== 1, "Failed to get data, %d, errno: %d\n", iret
, WSAGetLastError());
9022 ok(buffer
[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer
[0]);
9024 closesocket(connector
);
9025 closesocket(connector2
);
9026 closesocket(acceptor
);
9028 /* clean up in case of failures */
9029 while ((acceptor
= accept(listener
, NULL
, NULL
)) != INVALID_SOCKET
)
9030 closesocket(acceptor
);
9032 /* Disconnect during receive? */
9034 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
9035 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9036 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9037 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9038 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
9039 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9040 &bytesReturned
, &overlapped
);
9041 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
9043 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9044 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
9046 closesocket(connector
);
9047 connector
= INVALID_SOCKET
;
9049 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9050 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
9052 bytesReturned
= 123456;
9053 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
9054 ok(bret
, "GetOverlappedResult failed, error %ld\n", GetLastError());
9055 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %ld\n", bytesReturned
);
9057 closesocket(acceptor
);
9059 /* Test closing with pending requests */
9061 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
9062 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9063 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
9064 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9065 &bytesReturned
, &overlapped
);
9066 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
9068 closesocket(acceptor
);
9070 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9071 ok(dwret
== WAIT_OBJECT_0
,
9072 "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
9073 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
9074 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %ld\n", GetLastError());
9076 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
9077 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9078 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
9079 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9080 &bytesReturned
, &overlapped
);
9081 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
9083 CancelIo((HANDLE
) acceptor
);
9085 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9086 ok(dwret
== WAIT_TIMEOUT
, "Waiting for timeout failed with %ld + errno %ld\n", dwret
, GetLastError());
9088 closesocket(acceptor
);
9090 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
9091 ok(acceptor
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9092 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
9093 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9094 &bytesReturned
, &overlapped
);
9095 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
9097 closesocket(listener
);
9099 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9100 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %ld + errno %ld\n", dwret
, GetLastError());
9102 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
9103 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %ld\n", GetLastError());
9105 CloseHandle(overlapped
.hEvent
);
9106 CloseHandle(overlapped2
.hEvent
);
9107 closesocket(acceptor
);
9108 closesocket(connector2
);
9111 static void test_shutdown(void)
9113 struct sockaddr_in addr
, server_addr
, client_addr
;
9114 SOCKET listener
, client
, server
;
9115 OVERLAPPED overlapped
= {0};
9116 DWORD size
, flags
= 0;
9121 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
9122 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9123 ok(listener
!= INVALID_SOCKET
, "failed to create listener socket, error %d\n", WSAGetLastError());
9125 memset(&addr
, 0, sizeof(addr
));
9126 addr
.sin_family
= AF_INET
;
9127 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9128 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
9129 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9130 addrlen
= sizeof(server_addr
);
9131 ret
= getsockname(listener
, (struct sockaddr
*)&server_addr
, &addrlen
);
9132 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
9134 ret
= listen(listener
, 1);
9135 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
9137 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9138 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9140 WSASetLastError(0xdeadbeef);
9141 ret
= shutdown(client
, SD_SEND
);
9142 ok(ret
== -1, "expected failure\n");
9143 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
9145 WSASetLastError(0xdeadbeef);
9146 ret
= shutdown(client
, SD_RECEIVE
);
9147 ok(ret
== -1, "expected failure\n");
9148 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
9150 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9151 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9152 server
= accept(listener
, NULL
, NULL
);
9153 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9154 set_blocking(client
, FALSE
);
9156 WSASetLastError(0xdeadbeef);
9157 ret
= shutdown(client
, SD_SEND
);
9158 ok(!ret
, "expected success\n");
9159 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9161 WSASetLastError(0xdeadbeef);
9162 ret
= shutdown(client
, SD_SEND
);
9163 ok(!ret
, "expected success\n");
9164 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9166 WSASetLastError(0xdeadbeef);
9167 ret
= send(client
, "test", 5, 0);
9168 ok(ret
== -1, "got %d\n", ret
);
9169 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9171 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9172 ok(!ret
, "got %d\n", ret
);
9173 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9174 ok(!ret
, "got %d\n", ret
);
9176 WSASetLastError(0xdeadbeef);
9177 ret
= shutdown(server
, SD_RECEIVE
);
9178 ok(!ret
, "expected success\n");
9179 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9181 WSASetLastError(0xdeadbeef);
9182 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9183 ok(ret
== -1, "got %d\n", ret
);
9184 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9186 ret
= send(server
, "test", 5, 0);
9187 ok(ret
== 5, "got %d\n", ret
);
9189 ret
= sync_recv(client
, buffer
, sizeof(buffer
), 0);
9190 ok(ret
== 5, "got %d\n", ret
);
9191 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
9193 WSASetLastError(0xdeadbeef);
9194 ret
= shutdown(client
, SD_RECEIVE
);
9195 ok(!ret
, "expected success\n");
9196 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9198 WSASetLastError(0xdeadbeef);
9199 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
9200 ok(ret
== -1, "got %d\n", ret
);
9201 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9203 WSASetLastError(0xdeadbeef);
9204 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
9205 ok(ret
== -1, "got %d\n", ret
);
9206 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9208 WSASetLastError(0xdeadbeef);
9209 ret
= shutdown(server
, SD_SEND
);
9210 ok(!ret
, "expected success\n");
9211 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9213 WSASetLastError(0xdeadbeef);
9214 ret
= send(server
, "test", 5, 0);
9215 ok(ret
== -1, "got %d\n", ret
);
9216 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9218 addrlen
= sizeof(addr
);
9219 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
9220 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
9221 todo_wine
ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
9223 addrlen
= sizeof(client_addr
);
9224 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
9225 ok(!ret
, "got error %u\n", WSAGetLastError());
9226 addrlen
= sizeof(addr
);
9227 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
9228 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
9229 todo_wine
ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
9231 WSASetLastError(0xdeadbeef);
9232 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9233 ok(ret
== -1, "got %d\n", ret
);
9234 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
9236 WSASetLastError(0xdeadbeef);
9237 ret
= shutdown(client
, 0xdeadbeef);
9238 ok(ret
== -1, "expected failure\n");
9239 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
9241 closesocket(client
);
9242 closesocket(server
);
9246 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9247 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9248 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9249 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9250 server
= accept(listener
, NULL
, NULL
);
9251 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9253 WSASetLastError(0xdeadbeef);
9254 ret
= shutdown(client
, SD_BOTH
);
9255 ok(!ret
, "expected success\n");
9256 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9258 WSASetLastError(0xdeadbeef);
9259 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
9260 ok(ret
== -1, "got %d\n", ret
);
9261 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9263 WSASetLastError(0xdeadbeef);
9264 ret
= send(client
, "test", 5, 0);
9265 ok(ret
== -1, "got %d\n", ret
);
9266 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9268 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9269 ok(!ret
, "got %d\n", ret
);
9271 WSASetLastError(0xdeadbeef);
9272 ret
= shutdown(server
, SD_BOTH
);
9273 ok(!ret
, "expected success\n");
9274 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9276 WSASetLastError(0xdeadbeef);
9277 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9278 ok(ret
== -1, "got %d\n", ret
);
9279 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9281 WSASetLastError(0xdeadbeef);
9282 ret
= send(server
, "test", 5, 0);
9283 ok(ret
== -1, "got %d\n", ret
);
9284 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9286 addrlen
= sizeof(addr
);
9287 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
9288 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
9289 todo_wine
ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
9291 addrlen
= sizeof(client_addr
);
9292 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
9293 ok(!ret
, "got error %u\n", WSAGetLastError());
9294 addrlen
= sizeof(addr
);
9295 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
9296 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
9297 todo_wine
ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
9299 closesocket(client
);
9300 closesocket(server
);
9302 /* Test shutting down with async I/O pending. */
9304 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9305 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9306 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9307 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9308 server
= accept(listener
, NULL
, NULL
);
9309 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9310 set_blocking(client
, FALSE
);
9312 wsabuf
.buf
= buffer
;
9313 wsabuf
.len
= sizeof(buffer
);
9314 WSASetLastError(0xdeadbeef);
9315 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
9316 ok(ret
== -1, "got %d\n", ret
);
9317 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
9319 ret
= shutdown(client
, SD_RECEIVE
);
9320 ok(!ret
, "got error %u\n", WSAGetLastError());
9322 WSASetLastError(0xdeadbeef);
9323 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
9324 ok(ret
== -1, "got %d\n", ret
);
9325 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9327 ret
= send(server
, "test", 5, 0);
9328 ok(ret
== 5, "got %d\n", ret
);
9330 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9331 ok(!ret
, "wait timed out\n");
9333 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
9334 ok(ret
, "got error %lu\n", GetLastError());
9335 ok(size
== 5, "got size %lu\n", size
);
9336 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, size
));
9338 WSASetLastError(0xdeadbeef);
9339 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
9340 ok(ret
== -1, "got %d\n", ret
);
9341 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9343 WSASetLastError(0xdeadbeef);
9344 ret
= WSARecv(server
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
9345 ok(ret
== -1, "got %d\n", ret
);
9346 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
9348 ret
= shutdown(client
, SD_SEND
);
9349 ok(!ret
, "got error %u\n", WSAGetLastError());
9351 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9352 ok(!ret
, "wait timed out\n");
9354 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
9355 ok(ret
, "got error %lu\n", GetLastError());
9356 ok(!size
, "got size %lu\n", size
);
9358 closesocket(client
);
9359 closesocket(server
);
9361 /* Test shutting down a listening socket. */
9363 WSASetLastError(0xdeadbeef);
9364 ret
= shutdown(listener
, SD_SEND
);
9365 ok(ret
== -1, "expected failure\n");
9366 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
9368 WSASetLastError(0xdeadbeef);
9369 ret
= shutdown(listener
, SD_RECEIVE
);
9370 ok(ret
== -1, "expected failure\n");
9371 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
9373 closesocket(listener
);
9375 /* Test shutting down UDP sockets. */
9377 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
9378 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
9379 memset(&addr
, 0, sizeof(addr
));
9380 addr
.sin_family
= AF_INET
;
9381 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9382 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
9383 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9384 addrlen
= sizeof(server_addr
);
9385 ret
= getsockname(server
, (struct sockaddr
*)&server_addr
, &addrlen
);
9386 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
9387 set_blocking(server
, FALSE
);
9389 WSASetLastError(0xdeadbeef);
9390 ret
= shutdown(server
, SD_RECEIVE
);
9391 ok(!ret
, "expected success\n");
9392 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9394 WSASetLastError(0xdeadbeef);
9395 ret
= recvfrom(server
, buffer
, sizeof(buffer
), 0, NULL
, NULL
);
9396 ok(ret
== -1, "got %d\n", ret
);
9397 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9399 ret
= sendto(client
, "test", 5, 0, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9400 ok(ret
== 5, "got %d\n", ret
);
9402 WSASetLastError(0xdeadbeef);
9403 ret
= shutdown(client
, SD_SEND
);
9404 ok(!ret
, "expected success\n");
9405 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9407 WSASetLastError(0xdeadbeef);
9408 ret
= shutdown(client
, SD_SEND
);
9409 ok(!ret
, "expected success\n");
9410 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9412 WSASetLastError(0xdeadbeef);
9413 ret
= sendto(client
, "test", 5, 0, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9414 ok(ret
== -1, "got %d\n", ret
);
9415 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9417 closesocket(client
);
9418 closesocket(server
);
9420 CloseHandle(overlapped
.hEvent
);
9423 static void test_DisconnectEx(void)
9425 struct sockaddr_in server_addr
, client_addr
, addr
;
9426 GUID disconnectex_guid
= WSAID_DISCONNECTEX
;
9427 SOCKET listener
, server
, client
;
9428 LPFN_DISCONNECTEX pDisconnectEx
;
9429 OVERLAPPED overlapped
= {0};
9434 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
9436 client
= socket(AF_INET
, SOCK_STREAM
, 0);
9437 ok(client
!= INVALID_SOCKET
, "failed to create connector socket, error %u\n", WSAGetLastError());
9439 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &disconnectex_guid
, sizeof(disconnectex_guid
),
9440 &pDisconnectEx
, sizeof(pDisconnectEx
), &size
, NULL
, NULL
);
9443 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
9444 closesocket(client
);
9448 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
9449 ok(listener
!= INVALID_SOCKET
, "failed to create listener socket, error %d\n", WSAGetLastError());
9451 memset(&addr
, 0, sizeof(addr
));
9452 addr
.sin_family
= AF_INET
;
9453 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9454 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
9455 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
9456 addrlen
= sizeof(server_addr
);
9457 ret
= getsockname(listener
, (struct sockaddr
*)&server_addr
, &addrlen
);
9458 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
9459 ret
= listen(listener
, 1);
9460 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
9462 WSASetLastError(0xdeadbeef);
9463 ret
= pDisconnectEx(INVALID_SOCKET
, &overlapped
, 0, 0);
9464 ok(!ret
, "expected failure\n");
9465 ok(WSAGetLastError() == WSAENOTSOCK
, "got error %u\n", WSAGetLastError());
9467 WSASetLastError(0xdeadbeef);
9468 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
9469 ok(!ret
, "expected failure\n");
9470 ok(WSAGetLastError() == WSAENOTCONN
, "got error %u\n", WSAGetLastError());
9472 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9473 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9474 server
= accept(listener
, NULL
, NULL
);
9475 ok(server
!= INVALID_SOCKET
, "failed to accept, error %u\n", WSAGetLastError());
9477 WSASetLastError(0xdeadbeef);
9478 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
9479 ok(!ret
, "expected failure\n");
9480 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
9482 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
9483 ok(!ret
, "wait timed out\n");
9485 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
9486 ok(ret
, "got error %lu\n", GetLastError());
9487 ok(!size
, "got size %lu\n", size
);
9489 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9490 ok(ret
== -1, "expected failure\n");
9491 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
9493 WSASetLastError(0xdeadbeef);
9494 ret
= send(client
, "test", 5, 0);
9495 ok(ret
== -1, "expected failure\n");
9496 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9498 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9499 ok(!ret
, "got %d\n", ret
);
9501 ret
= send(server
, "test", 5, 0);
9502 ok(ret
== 5, "got %d\n", ret
);
9504 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
9505 ok(ret
== 5, "got %d\n", ret
);
9506 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
9508 addrlen
= sizeof(addr
);
9509 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
9510 ok(!ret
, "got error %u\n", WSAGetLastError());
9511 ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
9513 addrlen
= sizeof(client_addr
);
9514 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
9515 ok(!ret
, "got error %u\n", WSAGetLastError());
9516 addrlen
= sizeof(addr
);
9517 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
9518 ok(!ret
, "got error %u\n", WSAGetLastError());
9519 ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
9521 closesocket(client
);
9522 closesocket(server
);
9524 /* Test the synchronous case. */
9526 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9527 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
9528 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9529 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
9530 server
= accept(listener
, NULL
, NULL
);
9531 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
9533 WSASetLastError(0xdeadbeef);
9534 ret
= pDisconnectEx(client
, NULL
, 0, 0);
9535 ok(ret
, "expected success\n");
9536 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9538 WSASetLastError(0xdeadbeef);
9539 ret
= pDisconnectEx(client
, NULL
, 0, 0);
9540 ok(ret
, "expected success\n");
9541 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
9543 ret
= connect(client
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
));
9544 ok(ret
== -1, "expected failure\n");
9545 ok(WSAGetLastError() == WSAEISCONN
, "got error %u\n", WSAGetLastError());
9547 WSASetLastError(0xdeadbeef);
9548 ret
= send(client
, "test", 5, 0);
9549 ok(ret
== -1, "expected failure\n");
9550 ok(WSAGetLastError() == WSAESHUTDOWN
, "got error %u\n", WSAGetLastError());
9552 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
9553 ok(!ret
, "got %d\n", ret
);
9555 ret
= send(server
, "test", 5, 0);
9556 ok(ret
== 5, "got %d\n", ret
);
9558 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
9559 ok(ret
== 5, "got %d\n", ret
);
9560 ok(!strcmp(buffer
, "test"), "got %s\n", debugstr_an(buffer
, ret
));
9562 addrlen
= sizeof(addr
);
9563 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &addrlen
);
9564 ok(!ret
, "got error %u\n", WSAGetLastError());
9565 ok(!memcmp(&addr
, &server_addr
, sizeof(server_addr
)), "address didn't match\n");
9567 addrlen
= sizeof(client_addr
);
9568 ret
= getsockname(client
, (struct sockaddr
*)&client_addr
, &addrlen
);
9569 ok(!ret
, "got error %u\n", WSAGetLastError());
9570 addrlen
= sizeof(addr
);
9571 ret
= getpeername(server
, (struct sockaddr
*)&addr
, &addrlen
);
9572 ok(!ret
, "got error %u\n", WSAGetLastError());
9573 ok(!memcmp(&addr
, &client_addr
, sizeof(addr
)), "address didn't match\n");
9575 closesocket(client
);
9576 closesocket(server
);
9578 closesocket(listener
);
9579 CloseHandle(overlapped
.hEvent
);
9582 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
9584 static void compare_file2(HANDLE handle
, SOCKET sock
, int offset
, const char *file
, int line
)
9586 char buf1
[256], buf2
[256];
9590 SetFilePointer(handle
, offset
, NULL
, FILE_BEGIN
);
9593 DWORD n1
= 0, n2
= 0;
9595 success
= ReadFile(handle
, buf1
, sizeof(buf1
), &n1
, NULL
);
9596 ok_(file
,line
)(success
, "Failed to read from file.\n");
9597 if (success
&& n1
== 0)
9601 n2
= recv(sock
, buf2
, n1
, 0);
9602 ok_(file
,line
)(n1
== n2
, "Block %d size mismatch (%ld != %ld)\n", i
, n1
, n2
);
9603 ok_(file
,line
)(memcmp(buf1
, buf2
, n2
) == 0, "Block %d failed\n", i
);
9608 static void test_TransmitFile(void)
9610 DWORD num_bytes
, err
, file_size
, total_sent
;
9611 GUID transmitFileGuid
= WSAID_TRANSMITFILE
;
9612 LPFN_TRANSMITFILE pTransmitFile
= NULL
;
9613 HANDLE file
= INVALID_HANDLE_VALUE
;
9614 char header_msg
[] = "hello world";
9615 char footer_msg
[] = "goodbye!!!";
9616 char system_ini_path
[MAX_PATH
];
9617 struct sockaddr_in bindAddress
;
9618 TRANSMIT_FILE_BUFFERS buffers
;
9619 SOCKET client
, server
, dest
;
9625 memset( &ov
, 0, sizeof(ov
) );
9627 /* Setup sockets for testing TransmitFile */
9628 client
= socket(AF_INET
, SOCK_STREAM
, 0);
9629 ok(client
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9630 server
= socket(AF_INET
, SOCK_STREAM
, 0);
9631 ok(server
!= INVALID_SOCKET
, "failed to create socket, error %lu\n", GetLastError());
9632 iret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &transmitFileGuid
, sizeof(transmitFileGuid
),
9633 &pTransmitFile
, sizeof(pTransmitFile
), &num_bytes
, NULL
, NULL
);
9634 ok(!iret
, "failed to get TransmitFile, error %lu\n", GetLastError());
9635 GetSystemWindowsDirectoryA(system_ini_path
, MAX_PATH
);
9636 strcat(system_ini_path
, "\\system.ini");
9637 file
= CreateFileA(system_ini_path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
9638 ok(file
!= INVALID_HANDLE_VALUE
, "failed to open file, error %lu\n", GetLastError());
9639 file_size
= GetFileSize(file
, NULL
);
9641 /* Test TransmitFile with an invalid socket */
9642 bret
= pTransmitFile(INVALID_SOCKET
, file
, 0, 0, NULL
, NULL
, 0);
9643 err
= WSAGetLastError();
9644 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9645 ok(err
== WSAENOTSOCK
, "TransmitFile triggered unexpected errno (%ld != %d)\n", err
, WSAENOTSOCK
);
9647 /* Test a bogus TransmitFile without a connected socket */
9648 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, TF_REUSE_SOCKET
);
9649 err
= WSAGetLastError();
9650 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9651 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%ld != %d)\n", err
, WSAENOTCONN
);
9653 /* Setup a properly connected socket for transfers */
9654 memset(&bindAddress
, 0, sizeof(bindAddress
));
9655 bindAddress
.sin_family
= AF_INET
;
9656 bindAddress
.sin_port
= htons(SERVERPORT
+1);
9657 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9658 iret
= bind(server
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9659 ok(!iret
, "failed to bind socket, error %lu\n", GetLastError());
9660 iret
= listen(server
, 1);
9661 ok(!iret
, "failed to listen, error %lu\n", GetLastError());
9662 iret
= connect(client
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9663 ok(!iret
, "failed to connect, error %lu\n", GetLastError());
9664 len
= sizeof(bindAddress
);
9665 dest
= accept(server
, (struct sockaddr
*)&bindAddress
, &len
);
9666 ok(dest
!= INVALID_SOCKET
, "failed to accept, error %lu\n", GetLastError());
9667 iret
= set_blocking(dest
, FALSE
);
9668 ok(!iret
, "failed to set nonblocking, error %lu\n", GetLastError());
9670 /* Test TransmitFile with no possible buffer */
9671 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
9672 ok(bret
, "TransmitFile failed unexpectedly.\n");
9673 iret
= recv(dest
, buf
, sizeof(buf
), 0);
9674 ok(iret
== -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret
);
9676 /* Test TransmitFile with only buffer data */
9677 buffers
.Head
= &header_msg
[0];
9678 buffers
.HeadLength
= sizeof(header_msg
);
9679 buffers
.Tail
= &footer_msg
[0];
9680 buffers
.TailLength
= sizeof(footer_msg
);
9681 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, &buffers
, 0);
9682 ok(bret
, "TransmitFile failed unexpectedly.\n");
9683 iret
= recv(dest
, buf
, sizeof(buf
), 0);
9684 ok(iret
== sizeof(header_msg
)+sizeof(footer_msg
),
9685 "Returned an unexpected buffer from TransmitFile: %d\n", iret
);
9686 ok(memcmp(&buf
[0], &header_msg
[0], sizeof(header_msg
)) == 0,
9687 "TransmitFile header buffer did not match!\n");
9688 ok(memcmp(&buf
[sizeof(header_msg
)], &footer_msg
[0], sizeof(footer_msg
)) == 0,
9689 "TransmitFile footer buffer did not match!\n");
9691 /* Test TransmitFile with only file data */
9692 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, NULL
, 0);
9693 ok(bret
, "TransmitFile failed unexpectedly.\n");
9694 compare_file(file
, dest
, 0);
9696 /* Test TransmitFile with both file and buffer data */
9697 buffers
.Head
= &header_msg
[0];
9698 buffers
.HeadLength
= sizeof(header_msg
);
9699 buffers
.Tail
= &footer_msg
[0];
9700 buffers
.TailLength
= sizeof(footer_msg
);
9701 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
9702 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, &buffers
, 0);
9703 ok(bret
, "TransmitFile failed unexpectedly.\n");
9704 iret
= recv(dest
, buf
, sizeof(header_msg
), 0);
9705 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)) == 0,
9706 "TransmitFile header buffer did not match!\n");
9707 compare_file(file
, dest
, 0);
9708 iret
= recv(dest
, buf
, sizeof(footer_msg
), 0);
9709 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)) == 0,
9710 "TransmitFile footer buffer did not match!\n");
9712 /* Test overlapped TransmitFile */
9713 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
9714 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
9715 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
9716 err
= WSAGetLastError();
9717 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9718 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%ld != %d)\n",
9719 err
, ERROR_IO_PENDING
);
9720 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
9721 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
9722 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
9723 ok(total_sent
== file_size
,
9724 "Overlapped TransmitFile sent an unexpected number of bytes (%ld != %ld).\n",
9725 total_sent
, file_size
);
9726 compare_file(file
, dest
, 0);
9728 /* Test overlapped TransmitFile w/ start offset */
9729 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
9730 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
9732 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
9733 err
= WSAGetLastError();
9734 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9735 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%ld != %d)\n", err
, ERROR_IO_PENDING
);
9736 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
9737 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
9738 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
9739 ok(total_sent
== (file_size
- ov
.Offset
),
9740 "Overlapped TransmitFile sent an unexpected number of bytes (%ld != %ld).\n",
9741 total_sent
, file_size
- ov
.Offset
);
9742 compare_file(file
, dest
, ov
.Offset
);
9744 /* Test overlapped TransmitFile w/ file and buffer data */
9745 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
9746 buffers
.Head
= &header_msg
[0];
9747 buffers
.HeadLength
= sizeof(header_msg
);
9748 buffers
.Tail
= &footer_msg
[0];
9749 buffers
.TailLength
= sizeof(footer_msg
);
9750 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
9752 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, &buffers
, 0);
9753 err
= WSAGetLastError();
9754 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9755 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%ld != %d)\n", err
, ERROR_IO_PENDING
);
9756 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
9757 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
9758 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
9759 ok(total_sent
== (file_size
+ buffers
.HeadLength
+ buffers
.TailLength
),
9760 "Overlapped TransmitFile sent an unexpected number of bytes (%ld != %ld).\n",
9761 total_sent
, file_size
+ buffers
.HeadLength
+ buffers
.TailLength
);
9762 iret
= recv(dest
, buf
, sizeof(header_msg
), 0);
9763 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)) == 0,
9764 "TransmitFile header buffer did not match!\n");
9765 compare_file(file
, dest
, 0);
9766 iret
= recv(dest
, buf
, sizeof(footer_msg
), 0);
9767 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)) == 0,
9768 "TransmitFile footer buffer did not match!\n");
9770 /* Test TransmitFile with a UDP datagram socket */
9771 closesocket(client
);
9772 client
= socket(AF_INET
, SOCK_DGRAM
, 0);
9773 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
9774 err
= WSAGetLastError();
9775 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
9776 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%ld != %d)\n", err
, WSAENOTCONN
);
9779 CloseHandle(ov
.hEvent
);
9780 closesocket(client
);
9781 closesocket(server
);
9784 static void test_getpeername(void)
9787 struct sockaddr_in sa
, sa_out
;
9788 SOCKADDR_STORAGE ss
;
9790 const char buf
[] = "hello world";
9793 /* Test the parameter validation order. */
9794 ret
= getpeername(INVALID_SOCKET
, NULL
, NULL
);
9795 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
9796 ok(WSAGetLastError() == WSAENOTSOCK
,
9797 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
9799 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
9800 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
9802 ret
= getpeername(sock
, NULL
, NULL
);
9803 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
9804 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
,
9805 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9807 memset(&sa
, 0, sizeof(sa
));
9808 sa
.sin_family
= AF_INET
;
9809 sa
.sin_port
= htons(139);
9810 sa
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
9812 /* sendto does not change a socket's connection state. */
9813 ret
= sendto(sock
, buf
, sizeof(buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
9814 ok(ret
!= SOCKET_ERROR
,
9815 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9817 ret
= getpeername(sock
, NULL
, NULL
);
9818 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
9819 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
,
9820 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9822 ret
= connect(sock
, (struct sockaddr
*)&sa
, sizeof(sa
));
9824 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9826 ret
= getpeername(sock
, NULL
, NULL
);
9827 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
9828 ok(WSAGetLastError() == WSAEFAULT
,
9829 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9831 /* Test crashes on Wine. */
9834 ret
= getpeername(sock
, (void*)0xdeadbeef, (void*)0xcafebabe);
9835 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
9836 ok(WSAGetLastError() == WSAEFAULT
,
9837 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9840 ret
= getpeername(sock
, (struct sockaddr
*)&sa_out
, NULL
);
9841 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
9842 ok(WSAGetLastError() == WSAEFAULT
,
9843 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9846 ret
= getpeername(sock
, NULL
, &sa_len
);
9847 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
9848 ok(WSAGetLastError() == WSAEFAULT
,
9849 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9850 ok(!sa_len
, "got %d\n", sa_len
);
9853 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
9854 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
9855 ok(WSAGetLastError() == WSAEFAULT
,
9856 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9857 ok(!sa_len
, "got %d\n", sa_len
);
9859 sa_len
= sizeof(ss
);
9860 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
9861 ok(ret
== 0, "Expected getpeername to return 0, got %d\n", ret
);
9862 ok(!memcmp(&sa
, &ss
, sizeof(sa
)),
9863 "Expected the returned structure to be identical to the connect structure\n");
9864 ok(sa_len
== sizeof(sa
), "got %d\n", sa_len
);
9869 static void test_sioRoutingInterfaceQuery(void)
9871 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
9872 struct sockaddr_in in
= {0}, out
= {0};
9879 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
9880 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
9881 port
= CreateIoCompletionPort((HANDLE
)sock
, NULL
, 123, 0);
9883 WSASetLastError(0xdeadbeef);
9884 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), NULL
, NULL
, NULL
);
9885 ok(ret
== -1, "expected failure\n");
9886 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9889 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
) - 1, &out
, sizeof(out
), &size
, NULL
, NULL
);
9890 ok(ret
== -1, "expected failure\n");
9891 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
9892 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9895 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, NULL
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
9896 ok(ret
== -1, "expected failure\n");
9897 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
9898 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9901 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
9902 ok(ret
== -1, "expected failure\n");
9903 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
9904 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9906 in
.sin_family
= AF_INET
;
9908 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
9909 todo_wine
ok(ret
== -1, "expected failure\n");
9910 todo_wine
ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
9911 todo_wine
ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9913 in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
9914 WSASetLastError(0xdeadbeef);
9916 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, NULL
, NULL
);
9917 ok(!ret
, "expected failure\n");
9918 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
9919 ok(size
== sizeof(out
), "got size %lu\n", size
);
9920 /* We expect the source address to be INADDR_LOOPBACK as well, but
9921 * there's no guarantee that a route to the loopback address exists,
9922 * so rather than introduce spurious test failures we do not test the
9927 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
) - 1, &size
, NULL
, NULL
);
9928 ok(ret
== -1, "expected failure\n");
9929 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9930 todo_wine
ok(size
== sizeof(out
), "got size %lu\n", size
);
9933 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), NULL
, sizeof(out
), &size
, NULL
, NULL
);
9934 ok(ret
== -1, "expected failure\n");
9935 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9936 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9938 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), NULL
, &overlapped
, NULL
);
9939 ok(ret
== -1, "expected failure\n");
9940 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9941 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
9943 WSASetLastError(0xdeadbeef);
9945 overlapped
.Internal
= 0xdeadbeef;
9946 overlapped
.InternalHigh
= 0xdeadbeef;
9947 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
), &out
, sizeof(out
), &size
, &overlapped
, NULL
);
9948 ok(!ret
, "expected failure\n");
9949 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
9950 ok(size
== sizeof(out
), "got size %lu\n", size
);
9952 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
9953 ok(ret
, "got error %lu\n", GetLastError());
9954 ok(!size
, "got size %lu\n", size
);
9955 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
9956 ok(!overlapped
.Internal
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
9957 ok(!overlapped
.InternalHigh
, "got size %Iu\n", overlapped
.InternalHigh
);
9962 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
9964 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
),
9965 &out
, sizeof(out
), NULL
, &overlapped
, socket_apc
);
9966 ok(ret
== -1, "expected failure\n");
9967 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
9971 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &in
, sizeof(in
),
9972 &out
, sizeof(out
), &size
, &overlapped
, socket_apc
);
9973 ok(!ret
, "expected success\n");
9974 ok(size
== sizeof(out
), "got size %lu\n", size
);
9976 ret
= SleepEx(0, TRUE
);
9977 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
9978 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
9979 ok(!apc_error
, "got APC error %lu\n", apc_error
);
9980 ok(!apc_size
, "got APC size %lu\n", apc_size
);
9981 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
9986 static void test_sioAddressListChange(void)
9988 struct sockaddr_in bindAddress
;
9989 struct in_addr net_address
;
9990 WSAOVERLAPPED overlapped
, *olp
;
9992 DWORD num_bytes
, error
, tick
;
9993 SOCKET sock
, sock2
, sock3
;
9994 WSAEVENT event2
, event3
;
10001 /* Use gethostbyname to find the list of local network interfaces */
10002 h
= gethostbyname("");
10003 ok(!!h
, "failed to get interface list, error %u\n", WSAGetLastError());
10004 for (acount
= 0; h
->h_addr_list
[acount
]; acount
++);
10007 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
10011 net_address
.s_addr
= *(ULONG
*) h
->h_addr_list
[0];
10013 sock
= socket(AF_INET
, 0, IPPROTO_TCP
);
10014 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
10016 memset(&bindAddress
, 0, sizeof(bindAddress
));
10017 bindAddress
.sin_family
= AF_INET
;
10018 bindAddress
.sin_addr
.s_addr
= net_address
.s_addr
;
10019 SetLastError(0xdeadbeef);
10020 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10021 ok (!ret
, "bind() failed with error %ld\n", GetLastError());
10022 set_blocking(sock
, FALSE
);
10024 memset(&overlapped
, 0, sizeof(overlapped
));
10025 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10026 SetLastError(0xdeadbeef);
10027 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10028 error
= GetLastError();
10029 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %ld\n", error
);
10030 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%lx\n", error
);
10032 CloseHandle(overlapped
.hEvent
);
10035 sock
= socket(AF_INET
, 0, IPPROTO_TCP
);
10036 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
10038 SetLastError(0xdeadbeef);
10039 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10040 ok (!ret
, "bind() failed with error %ld\n", GetLastError());
10041 set_blocking(sock
, TRUE
);
10043 memset(&overlapped
, 0, sizeof(overlapped
));
10044 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10045 SetLastError(0xdeadbeef);
10046 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10047 error
= GetLastError();
10048 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %ld\n", error
);
10049 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%lx\n", error
);
10051 CloseHandle(overlapped
.hEvent
);
10054 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10055 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
10057 SetLastError(0xdeadbeef);
10058 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10059 ok (!ret
, "bind() failed with error %ld\n", GetLastError());
10060 set_blocking(sock
, FALSE
);
10062 memset(&overlapped
, 0, sizeof(overlapped
));
10063 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10064 SetLastError(0xdeadbeef);
10065 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10066 error
= GetLastError();
10067 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %ld\n", error
);
10068 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%lx\n", error
);
10070 CloseHandle(overlapped
.hEvent
);
10073 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10074 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
10076 SetLastError(0xdeadbeef);
10077 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10078 ok (!ret
, "bind() failed with error %ld\n", GetLastError());
10079 set_blocking(sock
, TRUE
);
10081 memset(&overlapped
, 0, sizeof(overlapped
));
10082 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10083 SetLastError(0xdeadbeef);
10084 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10085 error
= GetLastError();
10086 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %ld\n", error
);
10087 ok (error
== ERROR_IO_PENDING
, "expected 0x3e5, got 0x%lx\n", error
);
10089 CloseHandle(overlapped
.hEvent
);
10092 /* When the socket is overlapped non-blocking and the list change is requested without
10093 * an overlapped structure the error will be different. */
10094 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10095 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
10097 SetLastError(0xdeadbeef);
10098 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10099 ok (!ret
, "bind() failed with error %ld\n", GetLastError());
10100 set_blocking(sock
, FALSE
);
10102 SetLastError(0xdeadbeef);
10103 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
10104 error
= GetLastError();
10105 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %ld\n", error
);
10106 ok (error
== WSAEWOULDBLOCK
, "expected 10035, got %ld\n", error
);
10108 io_port
= CreateIoCompletionPort( (HANDLE
)sock
, NULL
, 0, 0 );
10109 ok (io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10111 set_blocking(sock
, FALSE
);
10112 memset(&overlapped
, 0, sizeof(overlapped
));
10113 SetLastError(0xdeadbeef);
10114 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10115 error
= GetLastError();
10116 ok (ret
== SOCKET_ERROR
, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %lu\n", error
);
10117 ok (error
== ERROR_IO_PENDING
, "expected ERROR_IO_PENDING got %lu\n", error
);
10119 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10120 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 0 );
10121 ok(!bret
, "failed to get completion status %u\n", bret
);
10122 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10123 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10127 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10128 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 0 );
10129 ok(!bret
, "failed to get completion status %u\n", bret
);
10130 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %lu\n", GetLastError());
10131 ok(olp
== &overlapped
, "Overlapped structure is at %p\n", olp
);
10133 CloseHandle(io_port
);
10135 /* Misuse of the API by using a blocking socket and not using an overlapped structure,
10136 * this leads to a hang forever. */
10139 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10141 SetLastError(0xdeadbeef);
10142 bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10144 set_blocking(sock
, TRUE
);
10145 WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
10151 if (!winetest_interactive
)
10153 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
10157 /* Bind an overlapped socket to the first found network interface */
10158 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10159 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
10160 sock2
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10161 ok(sock2
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
10162 sock3
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
10163 ok(sock3
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
10165 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10166 ok(!ret
, "bind failed unexpectedly\n");
10167 ret
= bind(sock2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10168 ok(!ret
, "bind failed unexpectedly\n");
10169 ret
= bind(sock3
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10170 ok(!ret
, "bind failed unexpectedly\n");
10172 set_blocking(sock2
, FALSE
);
10173 set_blocking(sock3
, FALSE
);
10175 /* Wait for address changes, request that the user connects/disconnects an interface */
10176 memset(&overlapped
, 0, sizeof(overlapped
));
10177 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10178 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
10179 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
10180 ok(WSAGetLastError() == WSA_IO_PENDING
, "Expected pending last error, got %d\n", WSAGetLastError());
10182 ret
= WSAIoctl(sock2
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, NULL
, NULL
);
10183 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
10184 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "Expected would block last error, got %d\n", WSAGetLastError());
10186 event2
= WSACreateEvent();
10187 event3
= WSACreateEvent();
10188 ret
= WSAEventSelect (sock2
, event2
, FD_ADDRESS_LIST_CHANGE
);
10189 ok(!ret
, "WSAEventSelect failed with %d\n", WSAGetLastError());
10190 /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */
10191 ret
= WSAEventSelect (sock3
, event3
, FD_ADDRESS_LIST_CHANGE
);
10192 ok(!ret
, "WSAEventSelect failed with %d\n", WSAGetLastError());
10194 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
10195 " change the ipv4 address of any of the local network interfaces (15 second timeout).\n");
10196 tick
= GetTickCount();
10197 ret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
10198 ok(ret
== WAIT_OBJECT_0
, "failed to get overlapped event %u\n", ret
);
10200 ret
= WaitForSingleObject(event2
, 500);
10202 ok(ret
== WAIT_OBJECT_0
, "failed to get change event %u\n", ret
);
10204 ret
= WaitForSingleObject(event3
, 500);
10205 ok(ret
== WAIT_TIMEOUT
, "unexpected change event\n");
10207 trace("Spent %ld ms waiting.\n", GetTickCount() - tick
);
10209 WSACloseEvent(event2
);
10210 WSACloseEvent(event3
);
10213 closesocket(sock2
);
10214 closesocket(sock3
);
10218 * Provide consistent initialization for the AcceptEx IOCP tests.
10220 static SOCKET
setup_iocp_src(struct sockaddr_in
*bindAddress
)
10225 src
= socket(AF_INET
, SOCK_STREAM
, 0);
10226 ok(src
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10228 memset(bindAddress
, 0, sizeof(*bindAddress
));
10229 bindAddress
->sin_family
= AF_INET
;
10230 bindAddress
->sin_addr
.s_addr
= inet_addr("127.0.0.1");
10231 iret
= bind(src
, (struct sockaddr
*)bindAddress
, sizeof(*bindAddress
));
10232 ok(!iret
, "failed to bind, error %u\n", WSAGetLastError());
10234 socklen
= sizeof(*bindAddress
);
10235 iret
= getsockname(src
, (struct sockaddr
*)bindAddress
, &socklen
);
10236 ok(!iret
, "failed to get address, error %u\n", WSAGetLastError());
10238 iret
= set_blocking(src
, FALSE
);
10239 ok(!iret
, "failed to make socket non-blocking, error %u\n", WSAGetLastError());
10241 iret
= listen(src
, 5);
10242 ok(!iret
, "failed to listen, error %u\n", WSAGetLastError());
10247 static void test_completion_port(void)
10250 WSAOVERLAPPED ov
, *olp
;
10251 SOCKET src
, dest
, dup
, connector
= INVALID_SOCKET
;
10252 WSAPROTOCOL_INFOA info
;
10255 DWORD num_bytes
, flags
;
10259 struct sockaddr_in bindAddress
;
10260 GUID acceptExGuid
= WSAID_ACCEPTEX
;
10261 LPFN_ACCEPTEX pAcceptEx
= NULL
;
10264 memset(buf
, 0, sizeof(buf
));
10265 io_port
= CreateIoCompletionPort(INVALID_HANDLE_VALUE
, NULL
, 0, 0);
10266 ok( io_port
!= NULL
, "Failed to create completion port %lu\n", GetLastError());
10268 memset(&ov
, 0, sizeof(ov
));
10270 tcp_socketpair(&src
, &dest
);
10272 bufs
.len
= sizeof(buf
);
10276 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, io_port
, 125, 0 );
10277 ok(io_port
!= NULL
, "Failed to create completion port %lu\n", GetLastError());
10279 SetLastError(0xdeadbeef);
10281 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
10282 ok(iret
== SOCKET_ERROR
, "WSARecv returned %d\n", iret
);
10283 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10287 close_with_rst(src
);
10289 SetLastError(0xdeadbeef);
10291 num_bytes
= 0xdeadbeef;
10292 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10294 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10295 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
10296 ok(GetLastError() == ERROR_NETNAME_DELETED
, "Last error was %ld\n", GetLastError());
10297 ok(key
== 125, "Key is %Iu\n", key
);
10298 ok(num_bytes
== 0, "Number of bytes received is %lu\n", num_bytes
);
10299 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10301 SetLastError(0xdeadbeef);
10303 num_bytes
= 0xdeadbeef;
10304 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10306 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10307 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
10308 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10309 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10310 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10311 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10313 if (dest
!= INVALID_SOCKET
)
10316 memset(&ov
, 0, sizeof(ov
));
10318 tcp_socketpair(&src
, &dest
);
10320 bufs
.len
= sizeof(buf
);
10324 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
10325 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10327 set_blocking(dest
, FALSE
);
10329 close_with_rst(src
);
10333 num_bytes
= 0xdeadbeef;
10334 SetLastError(0xdeadbeef);
10336 iret
= WSASend(dest
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
10337 ok(iret
== SOCKET_ERROR
, "WSASend failed - %d\n", iret
);
10338 ok(GetLastError() == WSAECONNRESET
, "Last error was %ld\n", GetLastError());
10339 ok(num_bytes
== 0xdeadbeef, "Managed to send %ld\n", num_bytes
);
10341 SetLastError(0xdeadbeef);
10343 num_bytes
= 0xdeadbeef;
10344 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10346 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10347 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
10348 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10349 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10350 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10351 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10353 if (dest
!= INVALID_SOCKET
)
10356 /* Test IOCP response on successful immediate read. */
10357 tcp_socketpair(&src
, &dest
);
10359 bufs
.len
= sizeof(buf
);
10362 SetLastError(0xdeadbeef);
10364 iret
= WSASend(src
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
10365 ok(!iret
, "WSASend failed - %d, last error %lu\n", iret
, GetLastError());
10366 ok(num_bytes
== sizeof(buf
), "Managed to send %ld\n", num_bytes
);
10368 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
10369 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10370 set_blocking(dest
, FALSE
);
10372 FD_ZERO(&fds_recv
);
10373 FD_SET(dest
, &fds_recv
);
10374 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
10376 num_bytes
= 0xdeadbeef;
10379 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
10380 ok(!iret
, "WSARecv failed - %d, last error %lu\n", iret
, GetLastError());
10381 ok(num_bytes
== sizeof(buf
), "Managed to read %ld\n", num_bytes
);
10383 SetLastError(0xdeadbeef);
10385 num_bytes
= 0xdeadbeef;
10386 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10388 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10389 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
10390 ok(GetLastError() == 0xdeadbeef, "Last error was %ld\n", GetLastError());
10391 ok(key
== 125, "Key is %Iu\n", key
);
10392 ok(num_bytes
== sizeof(buf
), "Number of bytes transferred is %lu\n", num_bytes
);
10393 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10395 /* Test IOCP response on graceful shutdown. */
10398 FD_ZERO(&fds_recv
);
10399 FD_SET(dest
, &fds_recv
);
10400 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
10402 num_bytes
= 0xdeadbeef;
10404 memset(&ov
, 0, sizeof(ov
));
10406 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
10407 ok(!iret
, "WSARecv failed - %d, last error %lu\n", iret
, GetLastError());
10408 ok(!num_bytes
, "Managed to read %ld\n", num_bytes
);
10410 SetLastError(0xdeadbeef);
10412 num_bytes
= 0xdeadbeef;
10413 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10415 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10416 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
10417 ok(GetLastError() == 0xdeadbeef, "Last error was %ld\n", GetLastError());
10418 ok(key
== 125, "Key is %Iu\n", key
);
10419 ok(!num_bytes
, "Number of bytes transferred is %lu\n", num_bytes
);
10420 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10423 src
= INVALID_SOCKET
;
10425 dest
= INVALID_SOCKET
;
10427 /* Test IOCP response on hard shutdown. This was the condition that triggered
10428 * a crash in an actual app (bug 38980). */
10429 tcp_socketpair(&src
, &dest
);
10431 bufs
.len
= sizeof(buf
);
10434 memset(&ov
, 0, sizeof(ov
));
10436 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
10437 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10438 set_blocking(dest
, FALSE
);
10440 close_with_rst(src
);
10442 FD_ZERO(&fds_recv
);
10443 FD_SET(dest
, &fds_recv
);
10444 select(dest
+ 1, &fds_recv
, NULL
, NULL
, NULL
);
10446 num_bytes
= 0xdeadbeef;
10447 SetLastError(0xdeadbeef);
10449 /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */
10450 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
10451 todo_wine
ok(iret
== SOCKET_ERROR
, "WSARecv failed - %d\n", iret
);
10452 todo_wine
ok(GetLastError() == WSAECONNRESET
, "Last error was %ld\n", GetLastError());
10453 todo_wine
ok(num_bytes
== 0xdeadbeef, "Managed to read %ld\n", num_bytes
);
10455 SetLastError(0xdeadbeef);
10457 num_bytes
= 0xdeadbeef;
10458 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10460 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10461 todo_wine
ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
10462 todo_wine
ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10463 todo_wine
ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10464 todo_wine
ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10465 todo_wine
ok(!olp
, "Overlapped structure is at %p\n", olp
);
10469 /* Test reading from a non-connected socket, mostly because the above test is marked todo. */
10470 dest
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10471 ok(dest
!= INVALID_SOCKET
, "socket() failed\n");
10473 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 125, 0);
10474 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10475 set_blocking(dest
, FALSE
);
10477 num_bytes
= 0xdeadbeef;
10478 SetLastError(0xdeadbeef);
10479 memset(&ov
, 0, sizeof(ov
));
10481 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
10482 ok(iret
== SOCKET_ERROR
, "WSARecv failed - %d\n", iret
);
10483 ok(GetLastError() == WSAENOTCONN
, "Last error was %ld\n", GetLastError());
10484 ok(num_bytes
== 0xdeadbeef, "Managed to read %ld\n", num_bytes
);
10486 SetLastError(0xdeadbeef);
10488 num_bytes
= 0xdeadbeef;
10489 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10491 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10492 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
10493 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10494 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10495 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10496 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10498 num_bytes
= 0xdeadbeef;
10501 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
10502 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10504 iret
= WSAIoctl(dest
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
10505 &pAcceptEx
, sizeof(pAcceptEx
), &num_bytes
, NULL
, NULL
);
10506 ok(!iret
, "failed to get AcceptEx, error %u\n", WSAGetLastError());
10508 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
10510 src
= setup_iocp_src(&bindAddress
);
10512 SetLastError(0xdeadbeef);
10514 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10515 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10517 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10518 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10520 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10521 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10524 src
= INVALID_SOCKET
;
10526 SetLastError(0xdeadbeef);
10528 num_bytes
= 0xdeadbeef;
10529 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10531 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10532 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10533 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %ld\n", GetLastError());
10534 ok(key
== 125, "Key is %Iu\n", key
);
10535 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10536 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10537 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10539 SetLastError(0xdeadbeef);
10541 num_bytes
= 0xdeadbeef;
10542 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10543 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10544 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10545 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10546 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10547 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10548 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10550 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
10552 src
= setup_iocp_src(&bindAddress
);
10554 SetLastError(0xdeadbeef);
10556 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10557 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10559 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10560 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10562 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10563 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10566 src
= INVALID_SOCKET
;
10568 SetLastError(0xdeadbeef);
10570 num_bytes
= 0xdeadbeef;
10571 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10573 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10574 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10575 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %ld\n", GetLastError());
10576 ok(key
== 125, "Key is %Iu\n", key
);
10577 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10578 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10579 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10581 SetLastError(0xdeadbeef);
10583 num_bytes
= 0xdeadbeef;
10584 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10585 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10586 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10587 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10588 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10589 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10590 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10592 /* Test IOCP with duplicated handle */
10594 src
= setup_iocp_src(&bindAddress
);
10596 SetLastError(0xdeadbeef);
10598 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10599 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10601 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
10602 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
10603 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
10605 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10606 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10608 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10609 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10611 SetLastError(0xdeadbeef);
10613 num_bytes
= 0xdeadbeef;
10614 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10615 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10616 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10617 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10618 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10619 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10620 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10623 src
= INVALID_SOCKET
;
10625 dup
= INVALID_SOCKET
;
10627 SetLastError(0xdeadbeef);
10629 num_bytes
= 0xdeadbeef;
10630 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10631 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10632 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10633 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %ld\n", GetLastError());
10634 ok(key
== 125, "Key is %Iu\n", key
);
10635 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10636 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10637 ok(olp
&& olp
->Internal
== (ULONG
)STATUS_CANCELLED
, "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10639 SetLastError(0xdeadbeef);
10641 num_bytes
= 0xdeadbeef;
10642 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10643 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10644 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10645 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10646 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10647 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10648 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10650 /* Test IOCP with duplicated handle (closing duplicated handle) */
10652 src
= setup_iocp_src(&bindAddress
);
10654 SetLastError(0xdeadbeef);
10656 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10657 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10659 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
10660 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
10661 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
10663 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10664 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10666 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10667 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10670 dup
= INVALID_SOCKET
;
10672 SetLastError(0xdeadbeef);
10674 num_bytes
= 0xdeadbeef;
10675 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10676 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10677 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10678 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10679 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10680 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10681 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10683 SetLastError(0xdeadbeef);
10685 num_bytes
= 0xdeadbeef;
10686 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10687 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10688 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10689 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10690 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10691 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10692 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10695 src
= INVALID_SOCKET
;
10697 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10698 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10699 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %ld\n", GetLastError());
10700 ok(key
== 125, "Key is %Iu\n", key
);
10701 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10702 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10703 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10705 SetLastError(0xdeadbeef);
10707 num_bytes
= 0xdeadbeef;
10708 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10709 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10710 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10711 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10712 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10713 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10714 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10716 /* Test IOCP with duplicated handle (closing original handle) */
10718 src
= setup_iocp_src(&bindAddress
);
10720 SetLastError(0xdeadbeef);
10722 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10723 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10725 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
10726 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
10727 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
10729 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10730 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10732 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10733 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10736 src
= INVALID_SOCKET
;
10738 SetLastError(0xdeadbeef);
10740 num_bytes
= 0xdeadbeef;
10741 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10742 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10743 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10744 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10745 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10746 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10747 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10750 dup
= INVALID_SOCKET
;
10752 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10753 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10754 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %ld\n", GetLastError());
10755 ok(key
== 125, "Key is %Iu\n", key
);
10756 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10757 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10758 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10760 SetLastError(0xdeadbeef);
10762 num_bytes
= 0xdeadbeef;
10763 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10764 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10765 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10766 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10767 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10768 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10769 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10771 /* Test IOCP without AcceptEx */
10773 src
= setup_iocp_src(&bindAddress
);
10775 SetLastError(0xdeadbeef);
10777 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10778 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10781 src
= INVALID_SOCKET
;
10783 SetLastError(0xdeadbeef);
10785 num_bytes
= 0xdeadbeef;
10786 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10787 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10788 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10789 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10790 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10791 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10792 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10796 src
= setup_iocp_src(&bindAddress
);
10798 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
10799 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10801 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10802 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10804 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
10805 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10807 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10808 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10810 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10811 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10813 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10814 ok(iret
== 0, "connecting to accepting socket failed, error %ld\n", GetLastError());
10816 closesocket(connector
);
10817 connector
= INVALID_SOCKET
;
10819 SetLastError(0xdeadbeef);
10821 num_bytes
= 0xdeadbeef;
10822 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10824 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10825 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
10826 ok(GetLastError() == 0xdeadbeef, "Last error was %ld\n", GetLastError());
10827 ok(key
== 125, "Key is %Iu\n", key
);
10828 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10829 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10830 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10832 SetLastError(0xdeadbeef);
10834 num_bytes
= 0xdeadbeef;
10835 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10836 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10837 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10838 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10839 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10840 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10841 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10843 if (dest
!= INVALID_SOCKET
)
10845 if (src
!= INVALID_SOCKET
)
10850 src
= setup_iocp_src(&bindAddress
);
10852 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
10853 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10855 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
10856 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10858 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10859 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10861 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
10862 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10864 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10865 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10867 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10868 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10870 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10871 ok(iret
== 0, "connecting to accepting socket failed, error %ld\n", GetLastError());
10873 iret
= send(connector
, buf
, 1, 0);
10874 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
10879 dest
= INVALID_SOCKET
;
10881 SetLastError(0xdeadbeef);
10883 num_bytes
= 0xdeadbeef;
10884 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10886 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10887 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
10888 ok(GetLastError() == 0xdeadbeef, "Last error was %ld\n", GetLastError());
10889 ok(key
== 125, "Key is %Iu\n", key
);
10890 ok(num_bytes
== 1, "Number of bytes transferred is %lu\n", num_bytes
);
10891 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10892 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %Ix\n", olp
? olp
->Internal
: 0);
10894 SetLastError(0xdeadbeef);
10896 num_bytes
= 0xdeadbeef;
10897 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10898 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10899 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10900 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10901 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10902 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10903 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10905 if (src
!= INVALID_SOCKET
)
10907 if (connector
!= INVALID_SOCKET
)
10908 closesocket(connector
);
10912 src
= setup_iocp_src(&bindAddress
);
10914 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
10915 ok(dest
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10917 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
10918 ok(connector
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
10920 io_port
= CreateIoCompletionPort((HANDLE
)src
, io_port
, 125, 0);
10921 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10923 io_port
= CreateIoCompletionPort((HANDLE
)dest
, io_port
, 236, 0);
10924 ok(io_port
!= NULL
, "failed to create completion port %lu\n", GetLastError());
10926 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
10927 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
10929 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
10930 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %ld\n", GetLastError());
10932 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
10933 ok(iret
== 0, "connecting to accepting socket failed, error %ld\n", GetLastError());
10937 SetLastError(0xdeadbeef);
10939 num_bytes
= 0xdeadbeef;
10940 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10942 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
10943 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10944 ok(GetLastError() == ERROR_OPERATION_ABORTED
10945 || GetLastError() == ERROR_CONNECTION_ABORTED
, "got error %lu\n", GetLastError());
10946 ok(key
== 125, "Key is %Iu\n", key
);
10947 ok(num_bytes
== 0, "Number of bytes transferred is %lu\n", num_bytes
);
10948 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
10949 ok((NTSTATUS
)olp
->Internal
== STATUS_CANCELLED
10950 || (NTSTATUS
)olp
->Internal
== STATUS_CONNECTION_ABORTED
, "got status %#Ix\n", olp
->Internal
);
10952 SetLastError(0xdeadbeef);
10954 num_bytes
= 0xdeadbeef;
10955 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
10956 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
10957 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
10958 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %ld\n", GetLastError());
10959 ok(key
== 0xdeadbeef, "Key is %Iu\n", key
);
10960 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes
);
10961 ok(!olp
, "Overlapped structure is at %p\n", olp
);
10964 closesocket(connector
);
10965 CloseHandle(io_port
);
10968 static void test_connect_completion_port(void)
10970 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
10971 GUID connectex_guid
= WSAID_CONNECTEX
;
10972 SOCKET connector
, listener
, acceptor
;
10973 struct sockaddr_in addr
, destaddr
;
10974 LPFN_CONNECTEX pConnectEx
;
10980 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
10982 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10983 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
10985 memset(&addr
, 0, sizeof(addr
));
10986 addr
.sin_family
= AF_INET
;
10987 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
10988 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
10989 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
10990 addrlen
= sizeof(destaddr
);
10991 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &addrlen
);
10992 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
10994 ret
= listen(listener
, 1);
10995 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
10997 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
10998 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11000 ret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
11001 &pConnectEx
, sizeof(pConnectEx
), &size
, NULL
, NULL
);
11002 ok(!ret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
11004 /* connect() does not queue completion. */
11006 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11007 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11009 ret
= connect(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11010 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11011 acceptor
= accept(listener
, NULL
, NULL
);
11012 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11013 closesocket(acceptor
);
11015 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11016 ok(!ret
, "expected failure\n");
11017 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11019 closesocket(connector
);
11022 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11023 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11024 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11025 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11026 set_blocking(connector
, FALSE
);
11028 ret
= connect(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11029 ok(ret
== -1, "expected failure\n");
11030 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
11031 acceptor
= accept(listener
, NULL
, NULL
);
11032 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11033 closesocket(acceptor
);
11035 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11036 ok(!ret
, "expected failure\n");
11037 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11039 closesocket(connector
);
11042 /* ConnectEx() queues completion. */
11044 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11045 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11046 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11047 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11048 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
11049 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11051 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
11052 NULL
, 0, &size
, &overlapped
);
11053 ok(!ret
, "expected failure\n");
11054 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11055 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11056 ok(!ret
, "wait failed\n");
11057 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
11058 ok(ret
, "got error %lu\n", GetLastError());
11059 ok(!size
, "got %lu bytes\n", size
);
11060 acceptor
= accept(listener
, NULL
, NULL
);
11061 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11062 closesocket(acceptor
);
11066 overlapped_ptr
= NULL
;
11067 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11068 ok(ret
, "got error %lu\n", GetLastError());
11069 ok(!key
, "got key %#Ix\n", key
);
11070 ok(!size
, "got %lu bytes\n", size
);
11071 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
11073 closesocket(connector
);
11076 /* Test ConnectEx() with a non-empty buffer. */
11078 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11079 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11080 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11081 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11082 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
11083 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11085 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
11086 (void *)"one", 3, &size
, &overlapped
);
11087 ok(!ret
, "expected failure\n");
11088 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11089 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11090 ok(!ret
, "wait failed\n");
11091 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
11092 ok(ret
, "got error %lu\n", GetLastError());
11093 ok(size
== 3, "got %lu bytes\n", size
);
11094 acceptor
= accept(listener
, NULL
, NULL
);
11095 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11096 closesocket(acceptor
);
11100 overlapped_ptr
= NULL
;
11101 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11102 ok(ret
, "got error %lu\n", GetLastError());
11103 ok(!key
, "got key %#Ix\n", key
);
11104 ok(size
== 3, "got %lu bytes\n", size
);
11105 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
11107 closesocket(connector
);
11110 /* Suppress completion by setting the low bit. */
11112 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11113 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11114 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11115 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11116 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
11117 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11119 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
| 1);
11121 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
11122 NULL
, 0, &size
, &overlapped
);
11123 ok(!ret
, "expected failure\n");
11124 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11125 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11126 ok(!ret
, "wait failed\n");
11127 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
11128 ok(ret
, "got error %lu\n", GetLastError());
11129 ok(!size
, "got %lu bytes\n", size
);
11130 acceptor
= accept(listener
, NULL
, NULL
);
11131 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11132 closesocket(acceptor
);
11134 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11135 ok(!ret
, "expected failure\n");
11136 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11138 closesocket(connector
);
11141 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
& ~1);
11143 /* Skip completion on success. */
11145 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11146 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11147 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11148 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11149 ret
= SetFileCompletionNotificationModes((HANDLE
)connector
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
11150 ok(ret
, "got error %lu\n", GetLastError());
11151 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
11152 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11154 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
11155 NULL
, 0, &size
, &overlapped
);
11156 ok(!ret
, "expected failure\n");
11157 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11158 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11159 ok(!ret
, "wait failed\n");
11160 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
11161 ok(ret
, "got error %lu\n", GetLastError());
11162 ok(!size
, "got %lu bytes\n", size
);
11163 acceptor
= accept(listener
, NULL
, NULL
);
11164 ok(acceptor
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11165 closesocket(acceptor
);
11169 overlapped_ptr
= NULL
;
11170 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11171 ok(ret
, "got error %lu\n", GetLastError());
11172 ok(!key
, "got key %#Ix\n", key
);
11173 ok(!size
, "got %lu bytes\n", size
);
11174 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
11176 closesocket(connector
);
11179 closesocket(listener
);
11181 /* Connect to an invalid address. */
11183 connector
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11184 ok(connector
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11185 port
= CreateIoCompletionPort((HANDLE
)connector
, NULL
, 0, 0);
11186 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11187 ret
= SetFileCompletionNotificationModes((HANDLE
)connector
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
11188 ok(ret
, "got error %lu\n", GetLastError());
11189 ret
= bind(connector
, (struct sockaddr
*)&addr
, sizeof(addr
));
11190 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11192 ret
= pConnectEx(connector
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
),
11193 NULL
, 0, &size
, &overlapped
);
11194 ok(!ret
, "expected failure\n");
11195 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11196 ret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
11197 ok(!ret
, "wait failed\n");
11198 ret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &size
, FALSE
);
11199 ok(!ret
, "expected failure\n");
11200 ok(GetLastError() == ERROR_CONNECTION_REFUSED
, "got error %lu\n", GetLastError());
11201 ok(!size
, "got %lu bytes\n", size
);
11205 overlapped_ptr
= NULL
;
11206 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11207 ok(!ret
, "expected failure\n");
11208 ok(GetLastError() == ERROR_CONNECTION_REFUSED
, "got error %lu\n", GetLastError());
11209 ok(!key
, "got key %#Ix\n", key
);
11210 ok(!size
, "got %lu bytes\n", size
);
11211 ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
11213 closesocket(connector
);
11217 static void test_shutdown_completion_port(void)
11219 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
11220 GUID disconnectex_guid
= WSAID_DISCONNECTEX
;
11221 struct sockaddr_in addr
, destaddr
;
11222 LPFN_DISCONNECTEX pDisconnectEx
;
11223 SOCKET listener
, server
, client
;
11229 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
11231 listener
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11232 ok(listener
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11234 memset(&addr
, 0, sizeof(addr
));
11235 addr
.sin_family
= AF_INET
;
11236 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
11237 ret
= bind(listener
, (struct sockaddr
*)&addr
, sizeof(addr
));
11238 ok(!ret
, "failed to bind, error %u\n", WSAGetLastError());
11239 addrlen
= sizeof(destaddr
);
11240 ret
= getsockname(listener
, (struct sockaddr
*)&destaddr
, &addrlen
);
11241 ok(!ret
, "failed to get address, error %u\n", WSAGetLastError());
11243 ret
= listen(listener
, 1);
11244 ok(!ret
, "failed to listen, error %u\n", WSAGetLastError());
11246 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11247 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11249 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &disconnectex_guid
, sizeof(disconnectex_guid
),
11250 &pDisconnectEx
, sizeof(pDisconnectEx
), &size
, NULL
, NULL
);
11251 ok(!ret
, "Failed to get ConnectEx, error %u\n", WSAGetLastError());
11253 /* shutdown() does not queue completion. */
11255 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
11256 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11257 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11258 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11259 server
= accept(listener
, NULL
, NULL
);
11260 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11262 ret
= shutdown(client
, SD_BOTH
);
11263 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
11265 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11266 ok(!ret
, "expected failure\n");
11267 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11269 closesocket(server
);
11270 closesocket(client
);
11273 /* WSASendDisconnect() and WSARecvDisconnect() do not queue completion. */
11275 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11276 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11277 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
11278 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11279 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11280 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11281 server
= accept(listener
, NULL
, NULL
);
11282 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11284 ret
= WSASendDisconnect(client
, NULL
);
11285 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
11287 ret
= WSARecvDisconnect(client
, NULL
);
11288 ok(!ret
, "failed to shutdown, error %u\n", WSAGetLastError());
11290 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11291 ok(!ret
, "expected failure\n");
11292 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11294 closesocket(server
);
11295 closesocket(client
);
11298 /* DisconnectEx() queues completion. */
11300 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11301 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11302 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
11303 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11304 ret
= SetFileCompletionNotificationModes((HANDLE
)client
, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
);
11305 ok(ret
, "got error %lu\n", GetLastError());
11306 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11307 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11308 server
= accept(listener
, NULL
, NULL
);
11309 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11311 SetLastError(0xdeadbeef);
11312 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
11313 ok(!ret
, "expected failure\n");
11314 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11316 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11317 ok(!ret
, "wait failed\n");
11320 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, TRUE
);
11321 ok(ret
, "got error %lu\n", GetLastError());
11322 ok(!size
, "got %lu bytes\n", size
);
11326 overlapped_ptr
= NULL
;
11327 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11328 todo_wine
ok(ret
, "got error %lu\n", GetLastError());
11329 todo_wine
ok(!key
, "got key %#Ix\n", key
);
11330 todo_wine
ok(!size
, "got %lu bytes\n", size
);
11331 todo_wine
ok(overlapped_ptr
== &overlapped
, "got overlapped %p\n", overlapped_ptr
);
11333 closesocket(server
);
11334 closesocket(client
);
11337 /* Test passing a NULL overlapped structure to DisconnectEx(). */
11339 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11340 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11341 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
11342 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11343 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11344 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11345 server
= accept(listener
, NULL
, NULL
);
11346 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11348 SetLastError(0xdeadbeef);
11349 ret
= pDisconnectEx(client
, NULL
, 0, 0);
11350 ok(ret
, "expected success\n");
11351 ok(!GetLastError() || GetLastError() == 0xdeadbeef /* < 7 */, "got error %lu\n", GetLastError());
11353 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11354 ok(!ret
, "expected failure\n");
11355 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11357 closesocket(server
);
11358 closesocket(client
);
11361 /* Suppress completion by setting the low bit. */
11363 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11364 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
11365 port
= CreateIoCompletionPort((HANDLE
)client
, NULL
, 0, 0);
11366 ok(!!port
, "failed to create port, error %lu\n", GetLastError());
11367 ret
= connect(client
, (struct sockaddr
*)&destaddr
, sizeof(destaddr
));
11368 ok(!ret
, "failed to connect, error %u\n", WSAGetLastError());
11369 server
= accept(listener
, NULL
, NULL
);
11370 ok(server
!= -1, "failed to accept, error %u\n", WSAGetLastError());
11372 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
| 1);
11374 SetLastError(0xdeadbeef);
11375 ret
= pDisconnectEx(client
, &overlapped
, 0, 0);
11376 ok(!ret
, "expected failure\n");
11377 ok(GetLastError() == ERROR_IO_PENDING
, "got error %lu\n", GetLastError());
11379 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
11380 ok(!ret
, "wait failed\n");
11383 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, TRUE
);
11384 ok(ret
, "got error %lu\n", GetLastError());
11385 ok(!size
, "got %lu bytes\n", size
);
11387 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11388 ok(!ret
, "expected failure\n");
11389 ok(GetLastError() == WAIT_TIMEOUT
, "got error %lu\n", GetLastError());
11391 closesocket(server
);
11392 closesocket(client
);
11395 overlapped
.hEvent
= (HANDLE
)((ULONG_PTR
)overlapped
.hEvent
& ~1);
11397 CloseHandle(overlapped
.hEvent
);
11400 static void test_address_list_query(void)
11403 SOCKET_ADDRESS_LIST
*address_list
= (SOCKET_ADDRESS_LIST
*)buffer
;
11404 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
11405 DWORD size
, expect_size
;
11412 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11413 ok(s
!= INVALID_SOCKET
, "Failed to create socket, error %d.\n", WSAGetLastError());
11414 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
11417 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, 0, &size
, NULL
, NULL
);
11418 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11419 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11420 ok(size
>= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), "Got unexpected size %lu.\n", size
);
11421 expect_size
= size
;
11424 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, NULL
, NULL
);
11425 ok(!ret
, "Got unexpected ret %d.\n", ret
);
11426 ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
11427 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11429 expect_size
= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[address_list
->iAddressCount
]);
11430 for (i
= 0; i
< address_list
->iAddressCount
; ++i
)
11432 expect_size
+= address_list
->Address
[i
].iSockaddrLength
;
11434 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11436 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, NULL
, NULL
);
11437 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11438 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11441 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, sizeof(buffer
), &size
, NULL
, NULL
);
11442 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11443 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11444 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11447 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 0, &size
, NULL
, NULL
);
11448 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11449 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11450 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11453 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 1, &size
, NULL
, NULL
);
11454 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11455 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
11456 ok(!size
, "Got size %lu.\n", size
);
11459 memset(buffer
, 0xcc, sizeof(buffer
));
11460 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
,
11461 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &size
, NULL
, NULL
);
11462 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
11463 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11464 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11465 ok(address_list
->iAddressCount
== 0xcccccccc, "Got %u addresses.\n", address_list
->iAddressCount
);
11467 WSASetLastError(0xdeadbeef);
11468 overlapped
.Internal
= 0xdeadbeef;
11469 overlapped
.InternalHigh
= 0xdeadbeef;
11471 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 0, &size
, &overlapped
, NULL
);
11472 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
11473 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11474 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11475 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
11476 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
11478 overlapped
.Internal
= 0xdeadbeef;
11479 overlapped
.InternalHigh
= 0xdeadbeef;
11481 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, 1, &size
, &overlapped
, NULL
);
11482 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
11483 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
11484 ok(!size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11485 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
11486 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
11488 overlapped
.Internal
= 0xdeadbeef;
11489 overlapped
.InternalHigh
= 0xdeadbeef;
11491 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
,
11492 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &size
, &overlapped
, NULL
);
11493 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
11494 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
11495 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11496 ok(overlapped
.Internal
== 0xdeadbeef, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
11497 ok(overlapped
.InternalHigh
== 0xdeadbeef, "Got size %Iu.\n", overlapped
.InternalHigh
);
11498 ok(address_list
->iAddressCount
== 0xcccccccc, "Got %u addresses.\n", address_list
->iAddressCount
);
11500 overlapped
.Internal
= 0xdeadbeef;
11501 overlapped
.InternalHigh
= 0xdeadbeef;
11503 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, NULL
);
11504 ok(!ret
, "Got unexpected ret %d.\n", ret
);
11505 ok(!WSAGetLastError(), "Got unexpected error %d.\n", WSAGetLastError());
11506 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
11508 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11509 ok(ret
, "Got error %lu.\n", GetLastError());
11510 ok(!size
, "Got size %lu.\n", size
);
11511 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
11512 ok(!overlapped
.Internal
, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
11513 ok(!overlapped
.InternalHigh
, "Got size %Iu.\n", overlapped
.InternalHigh
);
11515 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 0);
11516 ok(!ret
, "Expected failure.\n");
11517 ok(GetLastError() == WAIT_TIMEOUT
, "Got error %lu.\n", GetLastError());
11522 /* Test with an APC. */
11524 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
11526 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, &overlapped
, socket_apc
);
11527 ok(ret
== -1, "expected failure\n");
11528 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
11532 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, socket_apc
);
11533 ok(!ret
, "expected success\n");
11534 ok(size
== expect_size
, "got size %lu\n", size
);
11536 ret
= SleepEx(0, TRUE
);
11537 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
11538 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
11539 ok(!apc_error
, "got APC error %lu\n", apc_error
);
11540 ok(!apc_size
, "got APC size %lu\n", apc_size
);
11541 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
11546 static void sync_read(SOCKET src
, SOCKET dst
)
11551 ret
= send(dst
, "Hello World!", 12, 0);
11552 ok(ret
== 12, "send returned %d\n", ret
);
11554 memset(data
, 0, sizeof(data
));
11555 ret
= recv(src
, data
, sizeof(data
), 0);
11556 ok(ret
== 12, "expected 12, got %d\n", ret
);
11557 ok(!memcmp(data
, "Hello World!", 12), "got %u bytes (%*s)\n", ret
, ret
, data
);
11560 static void iocp_async_read(SOCKET src
, SOCKET dst
)
11563 WSAOVERLAPPED ovl
, *ovl_iocp
;
11567 DWORD flags
, bytes
;
11570 memset(data
, 0, sizeof(data
));
11571 memset(&ovl
, 0, sizeof(ovl
));
11573 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
11574 ok(port
!= 0, "CreateIoCompletionPort error %lu\n", GetLastError());
11576 buf
.len
= sizeof(data
);
11578 bytes
= 0xdeadbeef;
11580 SetLastError(0xdeadbeef);
11581 ret
= WSARecv(src
, &buf
, 1, &bytes
, &flags
, &ovl
, NULL
);
11582 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
11583 ok(GetLastError() == ERROR_IO_PENDING
, "got %lu\n", GetLastError());
11584 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11586 bytes
= 0xdeadbeef;
11588 ovl_iocp
= (void *)0xdeadbeef;
11589 SetLastError(0xdeadbeef);
11590 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11591 ok(!ret
, "got %d\n", ret
);
11592 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11593 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11594 ok(key
== 0xdeadbeef, "got key %#Ix\n", key
);
11595 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11597 ret
= send(dst
, "Hello World!", 12, 0);
11598 ok(ret
== 12, "send returned %d\n", ret
);
11600 bytes
= 0xdeadbeef;
11603 SetLastError(0xdeadbeef);
11604 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11605 ok(ret
, "got %d\n", ret
);
11606 ok(bytes
== 12, "got bytes %lu\n", bytes
);
11607 ok(key
== 0x12345678, "got key %#Ix\n", key
);
11608 ok(ovl_iocp
== &ovl
, "got ovl %p\n", ovl_iocp
);
11611 ok(ovl_iocp
->InternalHigh
== 12, "got %#Ix\n", ovl_iocp
->InternalHigh
);
11612 ok(!ovl_iocp
->Internal
, "got %#Ix\n", ovl_iocp
->Internal
);
11613 ok(!memcmp(data
, "Hello World!", 12), "got %lu bytes (%*s)\n", bytes
, (int)bytes
, data
);
11616 bytes
= 0xdeadbeef;
11618 ovl_iocp
= (void *)0xdeadbeef;
11619 SetLastError(0xdeadbeef);
11620 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11621 ok(!ret
, "got %d\n", ret
);
11622 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11623 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11624 ok(key
== 0xdeadbeef, "got key %#Ix\n", key
);
11625 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11630 static void iocp_async_read_closesocket(SOCKET src
, int how_to_close
)
11633 WSAOVERLAPPED ovl
, *ovl_iocp
;
11637 DWORD flags
, bytes
;
11642 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
11643 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
11644 ok(hwnd
!= 0, "CreateWindowEx failed\n");
11646 ret
= WSAAsyncSelect(src
, hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
11647 ok(!ret
, "got %d\n", ret
);
11650 memset(&msg
, 0, sizeof(msg
));
11651 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11652 ok(ret
, "got %d\n", ret
);
11653 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
11654 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
11655 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
11656 ok(msg
.lParam
== 2, "got %08Ix\n", msg
.lParam
);
11658 memset(data
, 0, sizeof(data
));
11659 memset(&ovl
, 0, sizeof(ovl
));
11661 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
11662 ok(port
!= 0, "CreateIoCompletionPort error %lu\n", GetLastError());
11665 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11666 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11668 buf
.len
= sizeof(data
);
11670 bytes
= 0xdeadbeef;
11672 SetLastError(0xdeadbeef);
11673 ret
= WSARecv(src
, &buf
, 1, &bytes
, &flags
, &ovl
, NULL
);
11674 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
11675 ok(GetLastError() == ERROR_IO_PENDING
, "got %lu\n", GetLastError());
11676 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11679 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11680 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11682 bytes
= 0xdeadbeef;
11684 ovl_iocp
= (void *)0xdeadbeef;
11685 SetLastError(0xdeadbeef);
11686 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11687 ok(!ret
, "got %d\n", ret
);
11688 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11689 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11690 ok(key
== 0xdeadbeef, "got key %#Ix\n", key
);
11691 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11694 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11695 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11697 switch (how_to_close
)
11703 CloseHandle((HANDLE
)src
);
11706 pNtClose((HANDLE
)src
);
11709 ok(0, "wrong value %d\n", how_to_close
);
11714 memset(&msg
, 0, sizeof(msg
));
11715 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11716 switch (how_to_close
)
11719 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11725 ok(ret
, "got %d\n", ret
);
11726 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
11727 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
11728 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
11729 ok(msg
.lParam
== 0x20, "got %08Ix\n", msg
.lParam
);
11733 ok(0, "wrong value %d\n", how_to_close
);
11737 bytes
= 0xdeadbeef;
11740 SetLastError(0xdeadbeef);
11741 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11742 ok(!ret
, "got %d\n", ret
);
11744 ok(GetLastError() == ERROR_CONNECTION_ABORTED
|| GetLastError() == ERROR_NETNAME_DELETED
/* XP */, "got %lu\n", GetLastError());
11745 ok(!bytes
, "got bytes %lu\n", bytes
);
11746 ok(key
== 0x12345678, "got key %#Ix\n", key
);
11747 ok(ovl_iocp
== &ovl
, "got ovl %p\n", ovl_iocp
);
11750 ok(!ovl_iocp
->InternalHigh
, "got %#Ix\n", ovl_iocp
->InternalHigh
);
11752 ok(ovl_iocp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
|| ovl_iocp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
/* XP */, "got %#Ix\n", ovl_iocp
->Internal
);
11755 bytes
= 0xdeadbeef;
11757 ovl_iocp
= (void *)0xdeadbeef;
11758 SetLastError(0xdeadbeef);
11759 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11760 ok(!ret
, "got %d\n", ret
);
11761 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11762 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11763 ok(key
== 0xdeadbeef, "got key %#Ix\n", key
);
11764 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11768 DestroyWindow(hwnd
);
11771 static void iocp_async_closesocket(SOCKET src
)
11774 WSAOVERLAPPED
*ovl_iocp
;
11781 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
11782 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
11783 ok(hwnd
!= 0, "CreateWindowEx failed\n");
11785 ret
= WSAAsyncSelect(src
, hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
11786 ok(!ret
, "got %d\n", ret
);
11789 memset(&msg
, 0, sizeof(msg
));
11790 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11791 ok(ret
, "got %d\n", ret
);
11792 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
11793 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
11794 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
11795 ok(msg
.lParam
== 2, "got %08Ix\n", msg
.lParam
);
11797 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
11798 ok(port
!= 0, "CreateIoCompletionPort error %lu\n", GetLastError());
11801 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11802 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11804 bytes
= 0xdeadbeef;
11806 ovl_iocp
= (void *)0xdeadbeef;
11807 SetLastError(0xdeadbeef);
11808 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11809 ok(!ret
, "got %d\n", ret
);
11810 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11811 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11812 ok(key
== 0xdeadbeef, "got key %Iu\n", key
);
11813 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11816 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11817 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11822 memset(&msg
, 0, sizeof(msg
));
11823 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11824 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11826 bytes
= 0xdeadbeef;
11828 ovl_iocp
= (void *)0xdeadbeef;
11829 SetLastError(0xdeadbeef);
11830 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11831 ok(!ret
, "got %d\n", ret
);
11832 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
11833 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11834 ok(key
== 0xdeadbeef, "got key %Iu\n", key
);
11835 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11839 DestroyWindow(hwnd
);
11842 struct wsa_async_select_info
11848 static DWORD WINAPI
wsa_async_select_thread(void *param
)
11850 struct wsa_async_select_info
*info
= param
;
11853 ret
= WSAAsyncSelect(info
->sock
, info
->hwnd
, WM_SOCKET
, FD_READ
| FD_WRITE
| FD_OOB
| FD_ACCEPT
| FD_CONNECT
| FD_CLOSE
);
11854 ok(!ret
, "got %d\n", ret
);
11859 struct wsa_recv_info
11866 static DWORD WINAPI
wsa_recv_thread(void *param
)
11868 struct wsa_recv_info
*info
= param
;
11870 DWORD flags
, bytes
;
11872 bytes
= 0xdeadbeef;
11874 SetLastError(0xdeadbeef);
11875 ret
= WSARecv(info
->sock
, &info
->wsa_buf
, 1, &bytes
, &flags
, &info
->ovl
, NULL
);
11876 ok(ret
== SOCKET_ERROR
, "got %d\n", ret
);
11877 ok(GetLastError() == ERROR_IO_PENDING
, "got %lu\n", GetLastError());
11878 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11883 static void iocp_async_read_thread_closesocket(SOCKET src
)
11885 struct wsa_async_select_info select_info
;
11886 struct wsa_recv_info recv_info
;
11887 HANDLE port
, thread
;
11888 WSAOVERLAPPED
*ovl_iocp
;
11896 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
11897 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
11898 ok(hwnd
!= 0, "CreateWindowEx failed\n");
11900 select_info
.sock
= src
;
11901 select_info
.hwnd
= hwnd
;
11902 thread
= CreateThread(NULL
, 0, wsa_async_select_thread
, &select_info
, 0, &tid
);
11903 ok(thread
!= 0, "CreateThread error %lu\n", GetLastError());
11904 ret
= WaitForSingleObject(thread
, 10000);
11905 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
11908 memset(&msg
, 0, sizeof(msg
));
11909 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11910 ok(ret
, "got %d\n", ret
);
11911 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
11912 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
11913 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
11914 ok(msg
.lParam
== 2, "got %08Ix\n", msg
.lParam
);
11916 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
11917 ok(port
!= 0, "CreateIoCompletionPort error %lu\n", GetLastError());
11920 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11921 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11923 memset(data
, 0, sizeof(data
));
11924 memset(&recv_info
.ovl
, 0, sizeof(recv_info
.ovl
));
11925 recv_info
.sock
= src
;
11926 recv_info
.wsa_buf
.len
= sizeof(data
);
11927 recv_info
.wsa_buf
.buf
= data
;
11928 thread
= CreateThread(NULL
, 0, wsa_recv_thread
, &recv_info
, 0, &tid
);
11929 ok(thread
!= 0, "CreateThread error %lu\n", GetLastError());
11930 ret
= WaitForSingleObject(thread
, 10000);
11931 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
11934 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11935 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11937 bytes
= 0xdeadbeef;
11939 ovl_iocp
= (void *)0xdeadbeef;
11940 SetLastError(0xdeadbeef);
11941 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11942 ok(!ret
, "got %d\n", ret
);
11943 ok(GetLastError() == WAIT_TIMEOUT
|| broken(GetLastError() == ERROR_OPERATION_ABORTED
) /* XP */,
11944 "got %lu\n", GetLastError());
11945 if (GetLastError() == WAIT_TIMEOUT
)
11947 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
11948 ok(key
== 0xdeadbeef, "got key %Ix\n", key
);
11949 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
11951 else /* document XP behaviour */
11953 ok(!bytes
, "got bytes %lu\n", bytes
);
11954 ok(key
== 0x12345678, "got key %#Ix\n", key
);
11955 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
11958 ok(!ovl_iocp
->InternalHigh
, "got %#Ix\n", ovl_iocp
->InternalHigh
);
11959 ok(ovl_iocp
->Internal
== STATUS_CANCELLED
, "got %#Ix\n", ovl_iocp
->Internal
);
11967 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11968 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11973 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
11974 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
11976 bytes
= 0xdeadbeef;
11979 SetLastError(0xdeadbeef);
11980 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
11981 ok(!ret
, "got %d\n", ret
);
11983 ok(GetLastError() == ERROR_CONNECTION_ABORTED
|| GetLastError() == ERROR_NETNAME_DELETED
/* XP */, "got %lu\n", GetLastError());
11984 ok(!bytes
, "got bytes %lu\n", bytes
);
11985 ok(key
== 0x12345678, "got key %#Ix\n", key
);
11986 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
11989 ok(!ovl_iocp
->InternalHigh
, "got %#Ix\n", ovl_iocp
->InternalHigh
);
11991 ok(ovl_iocp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
|| ovl_iocp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
/* XP */, "got %#Ix\n", ovl_iocp
->Internal
);
11995 bytes
= 0xdeadbeef;
11997 ovl_iocp
= (void *)0xdeadbeef;
11998 SetLastError(0xdeadbeef);
11999 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
12000 ok(!ret
, "got %d\n", ret
);
12001 ok(GetLastError() == WAIT_TIMEOUT
, "got %lu\n", GetLastError());
12002 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
12003 ok(key
== 0xdeadbeef, "got key %Iu\n", key
);
12004 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
12008 DestroyWindow(hwnd
);
12011 static void iocp_async_read_thread(SOCKET src
, SOCKET dst
)
12013 struct wsa_async_select_info select_info
;
12014 struct wsa_recv_info recv_info
;
12015 HANDLE port
, thread
;
12016 WSAOVERLAPPED
*ovl_iocp
;
12024 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
12025 0, 0, 0, 0, NULL
, NULL
, 0, NULL
);
12026 ok(hwnd
!= 0, "CreateWindowEx failed\n");
12028 select_info
.sock
= src
;
12029 select_info
.hwnd
= hwnd
;
12030 thread
= CreateThread(NULL
, 0, wsa_async_select_thread
, &select_info
, 0, &tid
);
12031 ok(thread
!= 0, "CreateThread error %lu\n", GetLastError());
12032 ret
= WaitForSingleObject(thread
, 10000);
12033 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
12036 memset(&msg
, 0, sizeof(msg
));
12037 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
12038 ok(ret
, "got %d\n", ret
);
12039 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
12040 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
12041 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
12042 ok(msg
.lParam
== 2, "got %08Ix\n", msg
.lParam
);
12044 port
= CreateIoCompletionPort((HANDLE
)src
, 0, 0x12345678, 0);
12045 ok(port
!= 0, "CreateIoCompletionPort error %lu\n", GetLastError());
12048 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
12049 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
12051 memset(data
, 0, sizeof(data
));
12052 memset(&recv_info
.ovl
, 0, sizeof(recv_info
.ovl
));
12053 recv_info
.sock
= src
;
12054 recv_info
.wsa_buf
.len
= sizeof(data
);
12055 recv_info
.wsa_buf
.buf
= data
;
12056 thread
= CreateThread(NULL
, 0, wsa_recv_thread
, &recv_info
, 0, &tid
);
12057 ok(thread
!= 0, "CreateThread error %lu\n", GetLastError());
12058 ret
= WaitForSingleObject(thread
, 10000);
12059 ok(ret
== WAIT_OBJECT_0
, "thread failed to terminate\n");
12062 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
12063 ok(!ret
, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
12065 bytes
= 0xdeadbeef;
12067 ovl_iocp
= (void *)0xdeadbeef;
12068 SetLastError(0xdeadbeef);
12069 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
12070 ok(!ret
, "got %d\n", ret
);
12071 ok(GetLastError() == WAIT_TIMEOUT
|| broken(GetLastError() == ERROR_OPERATION_ABORTED
) /* XP */, "got %lu\n", GetLastError());
12072 if (GetLastError() == WAIT_TIMEOUT
)
12074 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
12075 ok(key
== 0xdeadbeef, "got key %Iu\n", key
);
12076 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
12078 else /* document XP behaviour */
12080 ok(bytes
== 0, "got bytes %lu\n", bytes
);
12081 ok(key
== 0x12345678, "got key %#Ix\n", key
);
12082 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
12085 ok(!ovl_iocp
->InternalHigh
, "got %#Ix\n", ovl_iocp
->InternalHigh
);
12086 ok(ovl_iocp
->Internal
== STATUS_CANCELLED
, "got %#Ix\n", ovl_iocp
->Internal
);
12091 memset(&msg
, 0, sizeof(msg
));
12092 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
12093 ok(!ret
|| broken(msg
.hwnd
== hwnd
) /* XP */, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
12094 if (ret
) /* document XP behaviour */
12096 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
12097 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
12098 ok(msg
.lParam
== 1, "got %08Ix\n", msg
.lParam
);
12101 ret
= send(dst
, "Hello World!", 12, 0);
12102 ok(ret
== 12, "send returned %d\n", ret
);
12105 memset(&msg
, 0, sizeof(msg
));
12106 ret
= PeekMessageA(&msg
, hwnd
, WM_SOCKET
, WM_SOCKET
, PM_REMOVE
);
12107 ok(!ret
|| broken(msg
.hwnd
== hwnd
) /* XP */, "got %04x,%08Ix,%08Ix\n", msg
.message
, msg
.wParam
, msg
.lParam
);
12108 if (ret
) /* document XP behaviour */
12110 ok(msg
.hwnd
== hwnd
, "got %p\n", msg
.hwnd
);
12111 ok(msg
.message
== WM_SOCKET
, "got %04x\n", msg
.message
);
12112 ok(msg
.wParam
== src
, "got %08Ix\n", msg
.wParam
);
12113 ok(msg
.lParam
== 1, "got %08Ix\n", msg
.lParam
);
12116 bytes
= 0xdeadbeef;
12118 ovl_iocp
= (void *)0xdeadbeef;
12119 SetLastError(0xdeadbeef);
12120 ret
= GetQueuedCompletionStatus(port
, &bytes
, &key
, &ovl_iocp
, 100);
12121 ok(ret
|| broken(GetLastError() == WAIT_TIMEOUT
) /* XP */, "got %lu\n", GetLastError());
12124 ok(bytes
== 12, "got bytes %lu\n", bytes
);
12125 ok(key
== 0x12345678, "got key %#Ix\n", key
);
12126 ok(ovl_iocp
== &recv_info
.ovl
, "got ovl %p\n", ovl_iocp
);
12129 ok(ovl_iocp
->InternalHigh
== 12, "got %#Ix\n", ovl_iocp
->InternalHigh
);
12130 ok(!ovl_iocp
->Internal
, "got %#Ix\n", ovl_iocp
->Internal
);
12131 ok(!memcmp(data
, "Hello World!", 12), "got %lu bytes (%*s)\n", bytes
, (int)bytes
, data
);
12134 else /* document XP behaviour */
12136 ok(bytes
== 0xdeadbeef, "got bytes %lu\n", bytes
);
12137 ok(key
== 0xdeadbeef, "got key %Iu\n", key
);
12138 ok(!ovl_iocp
, "got ovl %p\n", ovl_iocp
);
12143 DestroyWindow(hwnd
);
12146 static void test_iocp(void)
12151 tcp_socketpair(&src
, &dst
);
12152 sync_read(src
, dst
);
12153 iocp_async_read(src
, dst
);
12157 tcp_socketpair(&src
, &dst
);
12158 iocp_async_read_thread(src
, dst
);
12162 for (i
= 0; i
<= 2; i
++)
12164 tcp_socketpair(&src
, &dst
);
12165 iocp_async_read_closesocket(src
, i
);
12169 tcp_socketpair(&src
, &dst
);
12170 iocp_async_closesocket(src
);
12173 tcp_socketpair(&src
, &dst
);
12174 iocp_async_read_thread_closesocket(src
);
12178 static void test_get_interface_list(void)
12180 OVERLAPPED overlapped
= {0}, *overlapped_ptr
;
12181 DWORD size
, expect_size
;
12182 unsigned int i
, count
;
12183 INTERFACE_INFO
*info
;
12184 BOOL loopback_found
;
12191 s
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
12192 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
12193 port
= CreateIoCompletionPort((HANDLE
)s
, NULL
, 123, 0);
12196 WSASetLastError(0xdeadbeef);
12197 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), &size
, NULL
, NULL
);
12198 ok(!ret
, "Got unexpected ret %d.\n", ret
);
12199 ok(!WSAGetLastError(), "Got error %u.\n", WSAGetLastError());
12200 ok(size
&& size
!= 0xdeadbeef && !(size
% sizeof(INTERFACE_INFO
)), "Got unexpected size %lu.\n", size
);
12201 expect_size
= size
;
12204 overlapped
.Internal
= 0xdeadbeef;
12205 overlapped
.InternalHigh
= 0xdeadbeef;
12206 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), &size
, &overlapped
, NULL
);
12207 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
12208 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
12209 ok(size
== 0xdeadbeef, "Got size %lu.\n", size
);
12211 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 100);
12212 ok(ret
, "Got error %lu.\n", GetLastError());
12213 ok(size
== expect_size
, "Expected size %lu, got %lu.\n", expect_size
, size
);
12214 ok(key
== 123, "Got key %Iu.\n", key
);
12215 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
12216 ok(!overlapped
.Internal
, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
12217 ok(overlapped
.InternalHigh
== expect_size
, "Expected size %lu, got %Iu.\n", expect_size
, overlapped
.InternalHigh
);
12219 info
= (INTERFACE_INFO
*)buffer
;
12220 count
= size
/ sizeof(INTERFACE_INFO
);
12221 loopback_found
= FALSE
;
12222 for (i
= 0; i
< count
; ++i
)
12224 if (info
[i
].iiFlags
& IFF_LOOPBACK
)
12225 loopback_found
= TRUE
;
12227 ok(info
[i
].iiAddress
.AddressIn
.sin_family
== AF_INET
, "Got unexpected sin_family %#x.\n",
12228 info
[i
].iiAddress
.AddressIn
.sin_family
);
12229 ok(info
[i
].iiNetmask
.AddressIn
.sin_family
== AF_INET
, "Got unexpected sin_family %#x.\n",
12230 info
[i
].iiNetmask
.AddressIn
.sin_family
);
12231 ok(info
[i
].iiBroadcastAddress
.AddressIn
.sin_family
12232 == (info
[i
].iiFlags
& IFF_BROADCAST
) ? AF_INET
: 0, "Got unexpected sin_family %#x.\n",
12233 info
[i
].iiBroadcastAddress
.AddressIn
.sin_family
);
12234 ok(info
[i
].iiAddress
.AddressIn
.sin_addr
.S_un
.S_addr
, "Got zero iiAddress.\n");
12235 ok(info
[i
].iiNetmask
.AddressIn
.sin_addr
.S_un
.S_addr
, "Got zero iiNetmask.\n");
12236 ok((info
[i
].iiFlags
& IFF_BROADCAST
) ? info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
.S_un
.S_addr
12237 : !info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
.S_un
.S_addr
,
12238 "Got unexpected iiBroadcastAddress %s.\n", inet_ntoa(info
[i
].iiBroadcastAddress
.AddressIn
.sin_addr
));
12241 ok(loopback_found
, "Loopback interface not found.\n");
12244 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(INTERFACE_INFO
) - 1, &size
, NULL
, NULL
);
12245 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
12246 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
12247 ok(!size
, "Got unexpected size %lu.\n", size
);
12250 overlapped
.Internal
= 0xdeadbeef;
12251 overlapped
.InternalHigh
= 0xdeadbeef;
12252 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(INTERFACE_INFO
) - 1, &size
, &overlapped
, NULL
);
12253 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
12254 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
12255 ok(size
== 0xdeadbeef, "Got size %lu.\n", size
);
12257 ret
= GetQueuedCompletionStatus(port
, &size
, &key
, &overlapped_ptr
, 100);
12258 ok(!ret
, "Expected failure.\n");
12259 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "Got error %lu.\n", GetLastError());
12260 ok(!size
, "Got size %lu.\n", size
);
12261 ok(key
== 123, "Got key %Iu.\n", key
);
12262 ok(overlapped_ptr
== &overlapped
, "Got overlapped %p.\n", overlapped_ptr
);
12263 ok((NTSTATUS
)overlapped
.Internal
== STATUS_BUFFER_TOO_SMALL
, "Got status %#lx.\n", (NTSTATUS
)overlapped
.Internal
);
12264 ok(!overlapped
.InternalHigh
, "Got size %Iu.\n", overlapped
.InternalHigh
);
12266 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
, sizeof(buffer
), NULL
, NULL
, NULL
);
12267 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
12268 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
12273 /* Test with an APC. */
12275 s
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
12276 ok(s
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
12280 ret
= WSAIoctl(s
, SIO_GET_INTERFACE_LIST
, NULL
, 0, buffer
,
12281 sizeof(INTERFACE_INFO
) - 1, &size
, &overlapped
, socket_apc
);
12282 ok(ret
== -1, "Got unexpected ret %d.\n", ret
);
12283 ok(WSAGetLastError() == ERROR_IO_PENDING
, "Got error %u.\n", WSAGetLastError());
12284 ok(size
== 0xdeadbeef, "Got size %lu.\n", size
);
12286 ret
= SleepEx(100, TRUE
);
12287 ok(ret
== WAIT_IO_COMPLETION
, "got %d\n", ret
);
12288 ok(apc_count
== 1, "APC was called %u times\n", apc_count
);
12289 ok(apc_error
== WSAEFAULT
, "got APC error %lu\n", apc_error
);
12290 ok(!apc_size
, "got APC size %lu\n", apc_size
);
12291 ok(apc_overlapped
== &overlapped
, "got APC overlapped %p\n", apc_overlapped
);
12296 static IP_ADAPTER_ADDRESSES
*get_adapters(void)
12298 ULONG err
, size
= 4096;
12299 IP_ADAPTER_ADDRESSES
*tmp
, *ret
;
12301 if (!(ret
= malloc( size
))) return NULL
;
12302 err
= GetAdaptersAddresses( AF_UNSPEC
, 0, NULL
, ret
, &size
);
12303 while (err
== ERROR_BUFFER_OVERFLOW
)
12305 if (!(tmp
= realloc( ret
, size
))) break;
12307 err
= GetAdaptersAddresses( AF_UNSPEC
, 0, NULL
, ret
, &size
);
12309 if (err
== ERROR_SUCCESS
) return ret
;
12314 static void test_bind(void)
12316 const struct sockaddr_in invalid_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= inet_addr("192.0.2.0")};
12317 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
12318 IP_ADAPTER_ADDRESSES
*adapters
, *adapter
;
12319 struct sockaddr addr
;
12323 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
12325 WSASetLastError(0xdeadbeef);
12326 ret
= bind(s
, NULL
, 0);
12327 ok(ret
== -1, "expected failure\n");
12328 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12330 WSASetLastError(0xdeadbeef);
12331 ret
= bind(s
, NULL
, sizeof(addr
));
12332 ok(ret
== -1, "expected failure\n");
12333 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12335 addr
.sa_family
= AF_INET
;
12336 WSASetLastError(0xdeadbeef);
12337 ret
= bind(s
, &addr
, 0);
12338 ok(ret
== -1, "expected failure\n");
12339 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12341 addr
.sa_family
= 0xdead;
12342 WSASetLastError(0xdeadbeef);
12343 ret
= bind(s
, &addr
, sizeof(addr
));
12344 ok(ret
== -1, "expected failure\n");
12345 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "got error %u\n", WSAGetLastError());
12347 WSASetLastError(0xdeadbeef);
12348 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
) - 1);
12349 ok(ret
== -1, "expected failure\n");
12350 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12352 WSASetLastError(0xdeadbeef);
12353 ret
= bind(s
, (const struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
12354 ok(ret
== -1, "expected failure\n");
12355 ok(WSAGetLastError() == WSAEADDRNOTAVAIL
, "got error %u\n", WSAGetLastError());
12357 WSASetLastError(0xdeadbeef);
12358 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
12359 ok(!ret
, "expected success\n");
12360 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* win <7 */, "got error %u\n", WSAGetLastError());
12362 WSASetLastError(0xdeadbeef);
12363 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
12364 ok(ret
== -1, "expected failure\n");
12365 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
12367 len
= sizeof(addr
);
12368 ret
= getsockname(s
, &addr
, &len
);
12369 ok(!ret
, "got error %u\n", WSAGetLastError());
12371 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
12373 WSASetLastError(0xdeadbeef);
12374 ret
= bind(s2
, &addr
, sizeof(addr
));
12375 ok(ret
== -1, "expected failure\n");
12376 ok(WSAGetLastError() == WSAEADDRINUSE
, "got error %u\n", WSAGetLastError());
12381 s
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
12383 WSASetLastError(0xdeadbeef);
12384 ret
= bind(s
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
12385 ok(!ret
, "expected success\n");
12386 ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* win <7 */, "got error %u\n", WSAGetLastError());
12390 adapters
= get_adapters();
12391 ok(adapters
!= NULL
, "can't get adapters\n");
12393 for (adapter
= adapters
; adapter
!= NULL
; adapter
= adapter
->Next
)
12395 const IP_ADAPTER_UNICAST_ADDRESS
*unicast_addr
;
12397 if (adapter
->OperStatus
!= IfOperStatusUp
) continue;
12399 for (unicast_addr
= adapter
->FirstUnicastAddress
; unicast_addr
!= NULL
; unicast_addr
= unicast_addr
->Next
)
12401 short family
= unicast_addr
->Address
.lpSockaddr
->sa_family
;
12403 s
= socket(family
, SOCK_STREAM
, IPPROTO_TCP
);
12404 ok(s
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
12406 ret
= bind(s
, unicast_addr
->Address
.lpSockaddr
, unicast_addr
->Address
.iSockaddrLength
);
12407 ok(!ret
, "got error %u\n", WSAGetLastError());
12411 if (family
== AF_INET6
)
12413 struct sockaddr_in6 addr6
, ret_addr6
;
12415 memcpy(&addr6
, unicast_addr
->Address
.lpSockaddr
, sizeof(addr6
));
12417 ok(unicast_addr
->Address
.iSockaddrLength
== sizeof(struct sockaddr_in6
),
12418 "got unexpected length %u\n", unicast_addr
->Address
.iSockaddrLength
);
12420 s
= socket(family
, SOCK_STREAM
, IPPROTO_TCP
);
12421 ok(s
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
12423 ret
= bind(s
, unicast_addr
->Address
.lpSockaddr
, sizeof(struct sockaddr_in6_old
));
12424 ok(ret
== -1, "expected failure\n");
12425 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12427 addr6
.sin6_scope_id
= 0xabacab;
12428 ret
= bind(s
, (struct sockaddr
*)&addr6
, sizeof(addr6
));
12429 todo_wine_if (!((const struct sockaddr_in6
*)unicast_addr
->Address
.lpSockaddr
)->sin6_scope_id
)
12431 ok(ret
== -1, "expected failure\n");
12432 ok(WSAGetLastError() == WSAEADDRNOTAVAIL
, "got error %u\n", WSAGetLastError());
12435 addr6
.sin6_scope_id
= 0;
12436 ret
= bind(s
, (struct sockaddr
*)&addr6
, sizeof(addr6
));
12437 todo_wine_if (!((const struct sockaddr_in6
*)unicast_addr
->Address
.lpSockaddr
)->sin6_scope_id
)
12438 ok(!ret
, "got error %u\n", WSAGetLastError());
12440 memcpy(&addr6
, unicast_addr
->Address
.lpSockaddr
, sizeof(addr6
));
12442 len
= sizeof(struct sockaddr_in6_old
);
12443 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr6
, &len
);
12444 ok(ret
== -1, "expected failure\n");
12445 ok(WSAGetLastError() == WSAEFAULT
, "got error %u\n", WSAGetLastError());
12447 len
= sizeof(ret_addr6
);
12448 memset(&ret_addr6
, 0, sizeof(ret_addr6
));
12449 ret
= getsockname(s
, (struct sockaddr
*)&ret_addr6
, &len
);
12450 ok(!ret
, "got error %u\n", WSAGetLastError());
12451 ok(ret_addr6
.sin6_family
== AF_INET6
, "got family %u\n", ret_addr6
.sin6_family
);
12452 ok(ret_addr6
.sin6_port
!= 0, "expected nonzero port\n");
12453 ok(!memcmp(&ret_addr6
.sin6_addr
, &addr6
.sin6_addr
, sizeof(addr6
.sin6_addr
)), "address didn't match\n");
12454 ok(ret_addr6
.sin6_scope_id
== addr6
.sin6_scope_id
, "got scope %lu\n", ret_addr6
.sin6_scope_id
);
12464 /* Test calling methods on a socket which is currently connecting. */
12465 static void test_connecting_socket(void)
12467 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_ANY
)};
12468 const struct sockaddr_in invalid_addr
=
12470 .sin_family
= AF_INET
,
12471 .sin_addr
.s_addr
= inet_addr("192.0.2.0"),
12474 OVERLAPPED overlapped
= {0}, overlapped2
= {0};
12475 GUID connectex_guid
= WSAID_CONNECTEX
;
12476 LPFN_CONNECTEX pConnectEx
;
12477 struct sockaddr_in addr
;
12483 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
12484 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
12485 set_blocking(client
, FALSE
);
12487 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
12488 ok(!ret
, "expected success\n");
12489 ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
12491 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
12492 ok(ret
== -1, "got %d\n", ret
);
12493 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got %u\n", WSAGetLastError());
12495 /* Mortal Kombat 11 connects to the same address twice and expects the
12496 * second to return WSAEALREADY. */
12497 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
12498 ok(ret
== -1, "got %d\n", ret
);
12499 ok(WSAGetLastError() == WSAEALREADY
, "got %u\n", WSAGetLastError());
12501 ret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectex_guid
, sizeof(connectex_guid
),
12502 &pConnectEx
, sizeof(pConnectEx
), &size
, NULL
, NULL
);
12503 ok(!ret
, "failed to get ConnectEx, error %u\n", WSAGetLastError());
12504 overlapped
.Internal
= 0xdeadbeef;
12505 overlapped
.InternalHigh
= 0xdeadbeef;
12506 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped
);
12507 ok(!ret
, "got %d\n", ret
);
12508 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
12509 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
12510 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
12512 len
= sizeof(addr
);
12513 ret
= getsockname(client
, (struct sockaddr
*)&addr
, &len
);
12514 ok(!ret
, "got error %u\n", WSAGetLastError());
12515 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
12516 ok(addr
.sin_port
, "expected nonzero port\n");
12518 len
= sizeof(addr
);
12519 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &len
);
12520 todo_wine
ok(!ret
, "got error %u\n", WSAGetLastError());
12523 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
12524 ok(addr
.sin_addr
.s_addr
== inet_addr("192.0.2.0"), "got address %#08lx\n", addr
.sin_addr
.s_addr
);
12525 ok(addr
.sin_port
== 255, "expected nonzero port\n");
12528 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
12529 ok(ret
== -1, "got %d\n", ret
);
12530 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
12532 ret
= send(client
, "data", 5, 0);
12533 ok(ret
== -1, "got %d\n", ret
);
12534 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
12536 closesocket(client
);
12538 /* Test with ConnectEx(). */
12540 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
12541 ok(client
!= -1, "failed to create socket, error %u\n", WSAGetLastError());
12542 set_blocking(client
, FALSE
);
12544 ret
= bind(client
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
12545 ok(!ret
, "expected success\n");
12546 ok(!WSAGetLastError(), "got %u\n", WSAGetLastError());
12548 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped2
);
12549 ok(!ret
, "got %d\n", ret
);
12550 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
12552 ret
= connect(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
));
12553 ok(ret
== -1, "got %d\n", ret
);
12554 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
12556 overlapped
.Internal
= 0xdeadbeef;
12557 overlapped
.InternalHigh
= 0xdeadbeef;
12558 ret
= pConnectEx(client
, (struct sockaddr
*)&invalid_addr
, sizeof(invalid_addr
), NULL
, 0, &size
, &overlapped
);
12559 ok(!ret
, "got %d\n", ret
);
12560 ok(WSAGetLastError() == WSAEINVAL
, "got %u\n", WSAGetLastError());
12561 ok((NTSTATUS
)overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
12562 todo_wine
ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
12564 len
= sizeof(addr
);
12565 ret
= getsockname(client
, (struct sockaddr
*)&addr
, &len
);
12566 ok(!ret
, "got error %u\n", WSAGetLastError());
12567 ok(addr
.sin_family
== AF_INET
, "got family %u\n", addr
.sin_family
);
12568 ok(addr
.sin_port
, "expected nonzero port\n");
12570 len
= sizeof(addr
);
12571 ret
= getpeername(client
, (struct sockaddr
*)&addr
, &len
);
12572 ok(ret
== -1, "got %d\n", ret
);
12573 ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
12575 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
12576 ok(ret
== -1, "got %d\n", ret
);
12577 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
12579 ret
= send(client
, "data", 5, 0);
12580 ok(ret
== -1, "got %d\n", ret
);
12581 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "got %u\n", WSAGetLastError());
12583 closesocket(client
);
12586 static DWORD
map_status( NTSTATUS status
)
12588 static const struct
12595 {STATUS_PENDING
, ERROR_IO_INCOMPLETE
},
12597 {STATUS_BUFFER_OVERFLOW
, WSAEMSGSIZE
},
12599 {STATUS_NOT_IMPLEMENTED
, WSAEOPNOTSUPP
},
12600 {STATUS_ACCESS_VIOLATION
, WSAEFAULT
},
12601 {STATUS_PAGEFILE_QUOTA
, WSAENOBUFS
},
12602 {STATUS_INVALID_HANDLE
, WSAENOTSOCK
},
12603 {STATUS_NO_SUCH_DEVICE
, WSAENETDOWN
},
12604 {STATUS_NO_SUCH_FILE
, WSAENETDOWN
},
12605 {STATUS_NO_MEMORY
, WSAENOBUFS
},
12606 {STATUS_CONFLICTING_ADDRESSES
, WSAENOBUFS
},
12607 {STATUS_ACCESS_DENIED
, WSAEACCES
},
12608 {STATUS_BUFFER_TOO_SMALL
, WSAEFAULT
},
12609 {STATUS_OBJECT_TYPE_MISMATCH
, WSAENOTSOCK
},
12610 {STATUS_OBJECT_NAME_NOT_FOUND
, WSAENETDOWN
},
12611 {STATUS_OBJECT_PATH_NOT_FOUND
, WSAENETDOWN
},
12612 {STATUS_SHARING_VIOLATION
, WSAEADDRINUSE
},
12613 {STATUS_QUOTA_EXCEEDED
, WSAENOBUFS
},
12614 {STATUS_TOO_MANY_PAGING_FILES
, WSAENOBUFS
},
12615 {STATUS_INSUFFICIENT_RESOURCES
, WSAENOBUFS
},
12616 {STATUS_WORKING_SET_QUOTA
, WSAENOBUFS
},
12617 {STATUS_DEVICE_NOT_READY
, WSAEWOULDBLOCK
},
12618 {STATUS_PIPE_DISCONNECTED
, WSAESHUTDOWN
},
12619 {STATUS_IO_TIMEOUT
, WSAETIMEDOUT
},
12620 {STATUS_NOT_SUPPORTED
, WSAEOPNOTSUPP
},
12621 {STATUS_REMOTE_NOT_LISTENING
, WSAECONNREFUSED
},
12622 {STATUS_BAD_NETWORK_PATH
, WSAENETUNREACH
},
12623 {STATUS_NETWORK_BUSY
, WSAENETDOWN
},
12624 {STATUS_INVALID_NETWORK_RESPONSE
, WSAENETDOWN
},
12625 {STATUS_UNEXPECTED_NETWORK_ERROR
, WSAENETDOWN
},
12626 {STATUS_REQUEST_NOT_ACCEPTED
, WSAEWOULDBLOCK
},
12627 {STATUS_CANCELLED
, ERROR_OPERATION_ABORTED
},
12628 {STATUS_COMMITMENT_LIMIT
, WSAENOBUFS
},
12629 {STATUS_LOCAL_DISCONNECT
, WSAECONNABORTED
},
12630 {STATUS_REMOTE_DISCONNECT
, WSAECONNRESET
},
12631 {STATUS_REMOTE_RESOURCES
, WSAENOBUFS
},
12632 {STATUS_LINK_FAILED
, WSAECONNRESET
},
12633 {STATUS_LINK_TIMEOUT
, WSAETIMEDOUT
},
12634 {STATUS_INVALID_CONNECTION
, WSAENOTCONN
},
12635 {STATUS_INVALID_ADDRESS
, WSAEADDRNOTAVAIL
},
12636 {STATUS_INVALID_BUFFER_SIZE
, WSAEMSGSIZE
},
12637 {STATUS_INVALID_ADDRESS_COMPONENT
, WSAEADDRNOTAVAIL
},
12638 {STATUS_TOO_MANY_ADDRESSES
, WSAENOBUFS
},
12639 {STATUS_ADDRESS_ALREADY_EXISTS
, WSAEADDRINUSE
},
12640 {STATUS_CONNECTION_DISCONNECTED
, WSAECONNRESET
},
12641 {STATUS_CONNECTION_RESET
, WSAECONNRESET
},
12642 {STATUS_TRANSACTION_ABORTED
, WSAECONNABORTED
},
12643 {STATUS_CONNECTION_REFUSED
, WSAECONNREFUSED
},
12644 {STATUS_GRACEFUL_DISCONNECT
, WSAEDISCON
},
12645 {STATUS_CONNECTION_ACTIVE
, WSAEISCONN
},
12646 {STATUS_NETWORK_UNREACHABLE
, WSAENETUNREACH
},
12647 {STATUS_HOST_UNREACHABLE
, WSAEHOSTUNREACH
},
12648 {STATUS_PROTOCOL_UNREACHABLE
, WSAENETUNREACH
},
12649 {STATUS_PORT_UNREACHABLE
, WSAECONNRESET
},
12650 {STATUS_REQUEST_ABORTED
, WSAEINTR
},
12651 {STATUS_CONNECTION_ABORTED
, WSAECONNABORTED
},
12652 {STATUS_DATATYPE_MISALIGNMENT_ERROR
,WSAEFAULT
},
12653 {STATUS_HOST_DOWN
, WSAEHOSTDOWN
},
12654 {0x80070000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
12655 {0xc0010000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
12656 {0xc0070000 | ERROR_IO_INCOMPLETE
, ERROR_IO_INCOMPLETE
},
12661 for (i
= 0; i
< ARRAY_SIZE(errors
); ++i
)
12663 if (errors
[i
].status
== status
)
12664 return errors
[i
].error
;
12667 return NT_SUCCESS(status
) ? RtlNtStatusToDosErrorNoTeb(status
) : WSAEINVAL
;
12670 static void test_WSAGetOverlappedResult(void)
12672 OVERLAPPED overlapped
= {0};
12680 static const NTSTATUS ranges
[][2] =
12683 {0x40000000, 0x40001000},
12684 {0x80000000, 0x80001000},
12685 {0x80070000, 0x80080000},
12686 {0xc0000000, 0xc0001000},
12687 {0xc0070000, 0xc0080000},
12688 {0xd0000000, 0xd0001000},
12689 {0xd0070000, 0xd0080000},
12692 WSASetLastError(0xdeadbeef);
12693 ret
= WSAGetOverlappedResult(0xdeadbeef, &overlapped
, &size
, FALSE
, &flags
);
12694 ok(!ret
, "got %d.\n", ret
);
12695 ok(WSAGetLastError() == WSAENOTSOCK
, "got %u.\n", WSAGetLastError());
12697 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
12699 ret
= DuplicateHandle(GetCurrentProcess(), (HANDLE
)s
, GetCurrentProcess(), &h
, 0, FALSE
, DUPLICATE_SAME_ACCESS
);
12700 ok(ret
, "got %d.\n", ret
);
12701 ret
= WSAGetOverlappedResult((SOCKET
)h
, &overlapped
, &size
, FALSE
, &flags
);
12702 ok(!ret
, "got %d.\n", ret
);
12703 ok(WSAGetLastError() == WSAENOTSOCK
, "got %u.\n", WSAGetLastError());
12706 for (i
= 0; i
< ARRAY_SIZE(ranges
); ++i
)
12708 for (status
= ranges
[i
][0]; status
< ranges
[i
][1]; ++status
)
12710 BOOL expect_ret
= NT_SUCCESS(status
) && status
!= STATUS_PENDING
;
12711 DWORD expect
= map_status(status
);
12713 overlapped
.Internal
= status
;
12714 WSASetLastError(0xdeadbeef);
12715 ret
= WSAGetOverlappedResult(s
, &overlapped
, &size
, FALSE
, &flags
);
12716 ok(ret
== expect_ret
, "status %#lx: expected %d, got %d\n", status
, expect_ret
, ret
);
12719 ok(WSAGetLastError() == expect
/* >= win10 1809 */
12720 || !WSAGetLastError() /* < win10 1809 */
12721 || WSAGetLastError() == 0xdeadbeef, /* < win7 */
12722 "status %#lx: expected error %lu, got %u\n", status
, expect
, WSAGetLastError());
12726 ok(WSAGetLastError() == expect
12727 || (status
== (0xc0070000 | ERROR_IO_INCOMPLETE
) && WSAGetLastError() == WSAEINVAL
), /* < win8 */
12728 "status %#lx: expected error %lu, got %u\n", status
, expect
, WSAGetLastError());
12733 overlapped
.Internal
= STATUS_PENDING
;
12734 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, TRUE
, NULL
);
12737 ret
= QueueUserAPC(apc_func
, GetCurrentThread(), (ULONG_PTR
)&apc_count
);
12738 ok(ret
, "QueueUserAPC returned %d\n", ret
);
12739 ret
= WSAGetOverlappedResult(s
, &overlapped
, &size
, TRUE
, &flags
);
12740 ok(ret
&& (GetLastError() == ERROR_IO_PENDING
|| !WSAGetLastError()),
12741 "Got ret %d, err %lu.\n", ret
, GetLastError());
12742 ok(!apc_count
, "got apc_count %d.\n", apc_count
);
12744 ok(apc_count
== 1, "got apc_count %d.\n", apc_count
);
12746 CloseHandle(overlapped
.hEvent
);
12750 struct nonblocking_async_recv_params
12756 static DWORD CALLBACK
nonblocking_async_recv_thread(void *arg
)
12758 const struct nonblocking_async_recv_params
*params
= arg
;
12759 OVERLAPPED overlapped
= {0};
12760 DWORD flags
= 0, size
;
12765 overlapped
.hEvent
= params
->event
;
12766 wsabuf
.buf
= buffer
;
12767 wsabuf
.len
= sizeof(buffer
);
12768 memset(buffer
, 0, sizeof(buffer
));
12769 ret
= WSARecv(params
->client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
12770 ok(!ret
, "got %d\n", ret
);
12771 ret
= GetOverlappedResult((HANDLE
)params
->client
, &overlapped
, &size
, FALSE
);
12772 ok(ret
, "got error %lu\n", GetLastError());
12773 ok(size
== 4, "got size %lu\n", size
);
12774 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
12779 static void test_nonblocking_async_recv(void)
12781 struct nonblocking_async_recv_params params
;
12782 OVERLAPPED overlapped
= {0};
12783 SOCKET client
, server
;
12784 DWORD flags
= 0, size
;
12785 HANDLE thread
, event
;
12790 event
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
12791 wsabuf
.buf
= buffer
;
12792 wsabuf
.len
= sizeof(buffer
);
12794 tcp_socketpair(&client
, &server
);
12795 set_blocking(client
, FALSE
);
12796 set_blocking(server
, FALSE
);
12798 WSASetLastError(0xdeadbeef);
12799 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
12800 ok(ret
== -1, "got %d\n", ret
);
12801 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
12803 WSASetLastError(0xdeadbeef);
12804 overlapped
.Internal
= 0xdeadbeef;
12805 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
12806 ok(ret
== -1, "got %d\n", ret
);
12807 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
12808 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
12810 /* Overlapped, with a NULL event. */
12812 overlapped
.hEvent
= NULL
;
12814 memset(buffer
, 0, sizeof(buffer
));
12815 WSASetLastError(0xdeadbeef);
12816 overlapped
.Internal
= 0xdeadbeef;
12817 overlapped
.InternalHigh
= 0xdeadbeef;
12818 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
12819 ok(ret
== -1, "got %d\n", ret
);
12820 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
12821 ret
= WaitForSingleObject((HANDLE
)client
, 0);
12822 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
12823 ok(overlapped
.Internal
== STATUS_PENDING
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
12824 ok(overlapped
.InternalHigh
== 0xdeadbeef, "got size %Iu\n", overlapped
.InternalHigh
);
12826 ret
= send(server
, "data", 4, 0);
12827 ok(ret
== 4, "got %d\n", ret
);
12829 ret
= WaitForSingleObject((HANDLE
)client
, 1000);
12830 ok(!ret
, "wait timed out\n");
12831 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
12832 ok(ret
, "got error %lu\n", GetLastError());
12833 ok(size
== 4, "got size %lu\n", size
);
12834 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
12836 /* Overlapped, with a non-NULL event. */
12838 overlapped
.hEvent
= event
;
12840 memset(buffer
, 0, sizeof(buffer
));
12841 WSASetLastError(0xdeadbeef);
12842 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
12843 ok(ret
== -1, "got %d\n", ret
);
12844 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
12845 ret
= WaitForSingleObject(event
, 0);
12846 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
12848 ret
= send(server
, "data", 4, 0);
12849 ok(ret
== 4, "got %d\n", ret
);
12851 ret
= WaitForSingleObject(event
, 1000);
12852 ok(!ret
, "wait timed out\n");
12853 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
12854 ok(ret
, "got error %lu\n", GetLastError());
12855 ok(size
== 4, "got size %lu\n", size
);
12856 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
12858 /* With data already in the pipe; usually this does return 0 (but not
12861 ret
= send(server
, "data", 4, 0);
12862 ok(ret
== 4, "got %d\n", ret
);
12864 memset(buffer
, 0, sizeof(buffer
));
12865 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
12866 ok(!ret
|| WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
12867 ret
= WaitForSingleObject(event
, 1000);
12868 ok(!ret
, "wait timed out\n");
12869 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
12870 ok(ret
, "got error %lu\n", GetLastError());
12871 ok(size
== 4, "got size %lu\n", size
);
12872 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
12874 closesocket(client
);
12875 closesocket(server
);
12877 /* With a non-overlapped socket, WSARecv() always blocks when passed an
12878 * overlapped structure, but returns WSAEWOULDBLOCK otherwise. */
12880 tcp_socketpair_flags(&client
, &server
, 0);
12881 set_blocking(client
, FALSE
);
12882 set_blocking(server
, FALSE
);
12884 WSASetLastError(0xdeadbeef);
12885 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
12886 ok(ret
== -1, "got %d\n", ret
);
12887 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
12889 WSASetLastError(0xdeadbeef);
12890 overlapped
.Internal
= 0xdeadbeef;
12891 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
12892 ok(ret
== -1, "got %d\n", ret
);
12893 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "got error %u\n", WSAGetLastError());
12894 ok(overlapped
.Internal
== 0xdeadbeef, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
12896 /* Overlapped, with a NULL event. */
12898 params
.client
= client
;
12899 params
.event
= NULL
;
12900 thread
= CreateThread(NULL
, 0, nonblocking_async_recv_thread
, ¶ms
, 0, NULL
);
12902 ret
= WaitForSingleObject(thread
, 200);
12903 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
12905 ret
= send(server
, "data", 4, 0);
12906 ok(ret
== 4, "got %d\n", ret
);
12908 ret
= WaitForSingleObject(thread
, 200);
12909 ok(!ret
, "wait timed out\n");
12910 CloseHandle(thread
);
12912 /* Overlapped, with a non-NULL event. */
12914 params
.client
= client
;
12915 params
.event
= event
;
12916 thread
= CreateThread(NULL
, 0, nonblocking_async_recv_thread
, ¶ms
, 0, NULL
);
12918 ret
= WaitForSingleObject(thread
, 200);
12919 ok(ret
== WAIT_TIMEOUT
, "expected timeout\n");
12921 ret
= send(server
, "data", 4, 0);
12922 ok(ret
== 4, "got %d\n", ret
);
12924 ret
= WaitForSingleObject(thread
, 200);
12925 ok(!ret
, "wait timed out\n");
12926 CloseHandle(thread
);
12928 /* With data already in the pipe. */
12930 ret
= send(server
, "data", 4, 0);
12931 ok(ret
== 4, "got %d\n", ret
);
12933 memset(buffer
, 0, sizeof(buffer
));
12934 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
12935 ok(!ret
, "got %d\n", ret
);
12936 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
12937 ok(ret
, "got error %lu\n", GetLastError());
12938 ok(size
== 4, "got size %lu\n", size
);
12939 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, size
));
12941 closesocket(client
);
12942 closesocket(server
);
12944 CloseHandle(overlapped
.hEvent
);
12947 static void test_simultaneous_async_recv(void)
12949 SOCKET client
, server
;
12950 OVERLAPPED overlappeds
[2] = {{0}};
12953 DWORD flags
[2] = {0};
12954 size_t num_io
= 2, stride
= 16, i
;
12955 char resbuf
[32] = "";
12956 static const char msgstr
[32] = "-- Lorem ipsum dolor sit amet -";
12959 for (i
= 0; i
< num_io
; i
++) events
[i
] = CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
12961 tcp_socketpair(&client
, &server
);
12963 for (i
= 0; i
< num_io
; i
++)
12965 wsabufs
[i
].buf
= resbuf
+ i
* stride
;
12966 wsabufs
[i
].len
= stride
;
12967 overlappeds
[i
].hEvent
= events
[i
];
12968 ret
= WSARecv(client
, &wsabufs
[i
], 1, NULL
, &flags
[i
], &overlappeds
[i
], NULL
);
12969 ok(ret
== -1, "got %d\n", ret
);
12970 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
12973 ret
= send(server
, msgstr
, sizeof(msgstr
), 0);
12974 ok(ret
== sizeof(msgstr
), "got %d\n", ret
);
12976 for (i
= 0; i
< num_io
; i
++)
12978 const void *expect
= msgstr
+ i
* stride
;
12979 const void *actual
= resbuf
+ i
* stride
;
12982 ret
= WaitForSingleObject(events
[i
], 1000);
12983 ok(!ret
, "wait timed out\n");
12986 ret
= GetOverlappedResult((HANDLE
)client
, &overlappeds
[i
], &size
, FALSE
);
12987 ok(ret
, "got error %lu\n", GetLastError());
12988 ok(size
== stride
, "got size %lu\n", size
);
12989 ok(!memcmp(expect
, actual
, stride
), "expected %s, got %s\n", debugstr_an(expect
, stride
), debugstr_an(actual
, stride
));
12992 closesocket(client
);
12993 closesocket(server
);
12995 for (i
= 0; i
< num_io
; i
++) CloseHandle(events
[i
]);
12998 static void test_empty_recv(void)
13000 OVERLAPPED overlapped
= {0};
13001 SOCKET client
, server
;
13002 DWORD size
, flags
= 0;
13007 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
13008 tcp_socketpair(&client
, &server
);
13010 WSASetLastError(0xdeadbeef);
13011 ret
= WSARecv(client
, NULL
, 0, NULL
, &flags
, &overlapped
, NULL
);
13012 ok(ret
== -1, "expected failure\n");
13013 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
13015 wsabuf
.buf
= buffer
;
13017 WSASetLastError(0xdeadbeef);
13018 ret
= WSARecv(client
, &wsabuf
, 0, NULL
, &flags
, &overlapped
, NULL
);
13019 ok(ret
== -1, "expected failure\n");
13020 ok(WSAGetLastError() == WSAEINVAL
, "got error %u\n", WSAGetLastError());
13022 WSASetLastError(0xdeadbeef);
13023 ret
= WSARecv(client
, &wsabuf
, 1, NULL
, &flags
, &overlapped
, NULL
);
13024 ok(ret
== -1, "expected failure\n");
13025 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
13027 ret
= send(server
, "data", 5, 0);
13028 ok(ret
== 5, "got %d\n", ret
);
13030 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
13031 ok(!ret
, "wait failed\n");
13032 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
13033 ok(ret
, "got error %lu\n", GetLastError());
13034 ok(!size
, "got size %lu\n", size
);
13036 WSASetLastError(0xdeadbeef);
13037 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
13038 ok(!ret
, "got error %u\n", WSAGetLastError());
13039 ok(!size
, "got size %lu\n", size
);
13041 ret
= recv(client
, NULL
, 0, 0);
13042 ok(!ret
, "got %d\n", ret
);
13044 ret
= recv(client
, buffer
, sizeof(buffer
), 0);
13045 ok(ret
== 5, "got %d\n", ret
);
13046 ok(!strcmp(buffer
, "data"), "got %s\n", debugstr_an(buffer
, ret
));
13048 closesocket(client
);
13049 closesocket(server
);
13050 CloseHandle(overlapped
.hEvent
);
13053 static void test_timeout(void)
13055 DWORD timeout
, flags
= 0, size
;
13056 OVERLAPPED overlapped
= {0};
13057 SOCKET client
, server
;
13062 tcp_socketpair(&client
, &server
);
13063 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
13065 timeout
= 0xdeadbeef;
13066 len
= sizeof(timeout
);
13067 WSASetLastError(0xdeadbeef);
13068 ret
= getsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, &len
);
13069 ok(!ret
, "expected success\n");
13070 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13071 ok(len
== sizeof(timeout
), "got size %u\n", len
);
13072 ok(!timeout
, "got timeout %lu\n", timeout
);
13075 WSASetLastError(0xdeadbeef);
13076 ret
= setsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, sizeof(timeout
));
13077 ok(!ret
, "expected success\n");
13078 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13080 timeout
= 0xdeadbeef;
13081 len
= sizeof(timeout
);
13082 WSASetLastError(0xdeadbeef);
13083 ret
= getsockopt(client
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, &len
);
13084 ok(!ret
, "expected success\n");
13085 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13086 ok(timeout
== 100, "got timeout %lu\n", timeout
);
13088 WSASetLastError(0xdeadbeef);
13089 ret
= recv(client
, &buffer
, 1, 0);
13090 ok(ret
== -1, "got %d\n", ret
);
13091 ok(WSAGetLastError() == WSAETIMEDOUT
, "got error %u\n", WSAGetLastError());
13093 wsabuf
.buf
= &buffer
;
13095 WSASetLastError(0xdeadbeef);
13097 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, NULL
, NULL
);
13098 ok(ret
== -1, "got %d\n", ret
);
13099 ok(WSAGetLastError() == WSAETIMEDOUT
, "got error %u\n", WSAGetLastError());
13100 ok(size
== 0xdeadbeef, "got size %lu\n", size
);
13102 wsabuf
.buf
= &buffer
;
13104 WSASetLastError(0xdeadbeef);
13106 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
13107 ok(ret
== -1, "got %d\n", ret
);
13108 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
13110 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
13111 ok(ret
== WAIT_TIMEOUT
, "got %d\n", ret
);
13113 ret
= send(server
, "a", 1, 0);
13114 ok(ret
== 1, "got %d\n", ret
);
13116 ret
= WaitForSingleObject(overlapped
.hEvent
, 200);
13117 ok(!ret
, "got %d\n", ret
);
13118 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
13119 ok(ret
, "got error %lu\n", GetLastError());
13120 ok(size
== 1, "got size %lu\n", size
);
13122 closesocket(client
);
13123 closesocket(server
);
13124 CloseHandle(overlapped
.hEvent
);
13127 static void test_so_debug(void)
13133 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
13135 len
= sizeof(debug
);
13136 WSASetLastError(0xdeadbeef);
13137 debug
= 0xdeadbeef;
13138 ret
= getsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, &len
);
13139 ok(!ret
, "got %d\n", ret
);
13140 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13141 ok(len
== sizeof(debug
), "got len %u\n", len
);
13142 ok(!debug
, "got debug %lu\n", debug
);
13144 WSASetLastError(0xdeadbeef);
13146 ret
= setsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, sizeof(debug
));
13147 ok(!ret
, "got %d\n", ret
);
13148 todo_wine
ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13150 len
= sizeof(debug
);
13151 WSASetLastError(0xdeadbeef);
13152 debug
= 0xdeadbeef;
13153 ret
= getsockopt(s
, SOL_SOCKET
, SO_DEBUG
, (char *)&debug
, &len
);
13154 ok(!ret
, "got %d\n", ret
);
13155 ok(!WSAGetLastError(), "got error %u\n", WSAGetLastError());
13156 ok(len
== sizeof(debug
), "got len %u\n", len
);
13157 todo_wine
ok(debug
== 1, "got debug %lu\n", debug
);
13162 struct sockopt_validity_test
13170 static void do_sockopt_validity_tests(const char *type
, SOCKET sock
, int level
,
13171 const struct sockopt_validity_test
*tests
)
13174 int count
, rc
, expected_rc
, i
;
13176 for (i
= 0; tests
[i
].opt
; i
++)
13178 winetest_push_context("%s option %i", type
, tests
[i
].opt
);
13179 memset(value
, 0, sizeof(value
));
13180 count
= sizeof(value
);
13182 WSASetLastError(0);
13183 rc
= getsockopt(sock
, level
, tests
[i
].opt
, value
, &count
);
13184 expected_rc
= tests
[i
].get_error
? SOCKET_ERROR
: 0;
13185 todo_wine_if(!tests
[i
].get_error
&& tests
[i
].todo
)
13186 ok(rc
== expected_rc
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
13187 "expected getsockopt to return %i, got %i\n", expected_rc
, rc
);
13188 todo_wine_if(tests
[i
].todo
)
13189 ok(WSAGetLastError() == tests
[i
].get_error
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
13190 "expected getsockopt to set error %i, got %i\n", tests
[i
].get_error
, WSAGetLastError());
13192 if (tests
[i
].get_error
)
13194 winetest_pop_context();
13198 WSASetLastError(0);
13199 rc
= setsockopt(sock
, level
, tests
[i
].opt
, value
, count
);
13200 expected_rc
= tests
[i
].set_error
? SOCKET_ERROR
: 0;
13201 todo_wine_if(!tests
[i
].set_error
&& tests
[i
].todo
)
13202 ok(rc
== expected_rc
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
13203 "expected setsockopt to return %i, got %i\n", expected_rc
, rc
);
13204 todo_wine_if(tests
[i
].todo
)
13205 ok(WSAGetLastError() == tests
[i
].set_error
|| broken(rc
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOPROTOOPT
),
13206 "expected setsockopt to set error %i, got %i\n", tests
[i
].set_error
, WSAGetLastError());
13208 winetest_pop_context();
13212 static void test_sockopt_validity(void)
13214 static const struct sockopt_validity_test ipv4_tcp_tests
[] =
13216 { -1, WSAENOPROTOOPT
},
13218 { IP_HDRINCL
, WSAEINVAL
},
13221 { IP_MULTICAST_IF
, WSAEINVAL
},
13222 { IP_MULTICAST_TTL
, WSAEINVAL
},
13223 { IP_MULTICAST_LOOP
, WSAEINVAL
},
13224 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13225 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13226 { IP_DONTFRAGMENT
},
13227 { IP_PKTINFO
, WSAEINVAL
},
13228 { IP_RECVTTL
, WSAEINVAL
},
13229 { IP_RECEIVE_BROADCAST
, WSAEINVAL
, 0, TRUE
},
13230 { IP_RECVIF
, WSAEINVAL
, 0, TRUE
},
13231 { IP_RECVDSTADDR
, WSAEINVAL
, 0, TRUE
},
13232 { IP_IFLIST
, 0, 0, TRUE
},
13234 { IP_RTHDR
, 0, 0, TRUE
},
13235 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13236 { IP_RECVRTHDR
, WSAEINVAL
, 0, TRUE
},
13237 { IP_RECVTOS
, WSAEINVAL
},
13238 { IP_ORIGINAL_ARRIVAL_IF
, WSAEINVAL
, 0, TRUE
},
13239 { IP_ECN
, WSAEINVAL
, 0, TRUE
},
13240 { IP_PKTINFO_EX
, WSAEINVAL
, 0, TRUE
},
13241 { IP_WFP_REDIRECT_RECORDS
, WSAEINVAL
, 0, TRUE
},
13242 { IP_WFP_REDIRECT_CONTEXT
, WSAEINVAL
, 0, TRUE
},
13243 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13244 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
13245 { IP_RECVERR
, WSAEINVAL
, 0, TRUE
},
13246 { IP_USER_MTU
, 0, 0, TRUE
},
13249 static const struct sockopt_validity_test ipv4_udp_tests
[] =
13251 { -1, WSAENOPROTOOPT
},
13253 { IP_HDRINCL
, WSAEINVAL
},
13256 { IP_MULTICAST_IF
},
13257 { IP_MULTICAST_TTL
},
13258 { IP_MULTICAST_LOOP
},
13259 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13260 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13261 { IP_DONTFRAGMENT
},
13264 { IP_RECEIVE_BROADCAST
, 0, 0, TRUE
},
13265 { IP_RECVIF
, 0, 0, TRUE
},
13266 { IP_RECVDSTADDR
, 0, 0, TRUE
},
13267 { IP_IFLIST
, 0, 0, TRUE
},
13269 { IP_RTHDR
, 0, 0, TRUE
},
13270 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13271 { IP_RECVRTHDR
, 0, 0, TRUE
},
13273 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
13274 { IP_ECN
, 0, 0, TRUE
},
13275 { IP_PKTINFO_EX
, 0, 0, TRUE
},
13276 { IP_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
13277 { IP_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
13278 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13279 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
13280 { IP_RECVERR
, 0, 0, TRUE
},
13281 { IP_USER_MTU
, 0, 0, TRUE
},
13284 static const struct sockopt_validity_test ipv4_raw_tests
[] =
13286 { -1, WSAENOPROTOOPT
},
13291 { IP_MULTICAST_IF
},
13292 { IP_MULTICAST_TTL
},
13293 { IP_MULTICAST_LOOP
},
13294 { IP_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13295 { IP_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13296 { IP_DONTFRAGMENT
},
13299 { IP_RECEIVE_BROADCAST
, 0, 0, TRUE
},
13300 { IP_RECVIF
, 0, 0, TRUE
},
13301 { IP_RECVDSTADDR
, 0, 0, TRUE
},
13302 { IP_IFLIST
, 0, 0, TRUE
},
13304 { IP_RTHDR
, 0, 0, TRUE
},
13305 { IP_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13306 { IP_RECVRTHDR
, 0, 0, TRUE
},
13308 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
13309 { IP_ECN
, 0, 0, TRUE
},
13310 { IP_PKTINFO_EX
, 0, 0, TRUE
},
13311 { IP_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
13312 { IP_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
13313 { IP_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13314 { IP_MTU
, WSAENOTCONN
, 0, TRUE
},
13315 { IP_RECVERR
, WSAEINVAL
, 0, TRUE
},
13316 { IP_USER_MTU
, 0, 0, TRUE
},
13319 static const struct sockopt_validity_test ipv6_tcp_tests
[] =
13321 { -1, WSAENOPROTOOPT
},
13322 { IPV6_HOPOPTS
, 0, 0, TRUE
},
13323 { IPV6_HDRINCL
, WSAEINVAL
, 0, TRUE
},
13324 { IPV6_UNICAST_HOPS
},
13325 { IPV6_MULTICAST_IF
, WSAEINVAL
},
13326 { IPV6_MULTICAST_HOPS
, WSAEINVAL
},
13327 { IPV6_MULTICAST_LOOP
, WSAEINVAL
},
13328 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13329 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13331 { IPV6_PKTINFO
, WSAEINVAL
},
13332 { IPV6_HOPLIMIT
, WSAEINVAL
},
13333 { IPV6_PROTECTION_LEVEL
},
13334 { IPV6_RECVIF
, WSAEINVAL
, 0, TRUE
},
13335 { IPV6_RECVDSTADDR
, WSAEINVAL
, 0, TRUE
},
13337 { IPV6_IFLIST
, 0, 0, TRUE
},
13338 { IPV6_UNICAST_IF
},
13339 { IPV6_RTHDR
, 0, 0, TRUE
},
13340 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13341 { IPV6_RECVRTHDR
, WSAEINVAL
, 0, TRUE
},
13342 { IPV6_RECVTCLASS
, WSAEINVAL
},
13343 { IP_ORIGINAL_ARRIVAL_IF
, WSAEINVAL
, 0, TRUE
},
13344 { IPV6_ECN
, WSAEINVAL
, 0, TRUE
},
13345 { IPV6_PKTINFO_EX
, WSAEINVAL
, 0, TRUE
},
13346 { IPV6_WFP_REDIRECT_RECORDS
, WSAEINVAL
, 0, TRUE
},
13347 { IPV6_WFP_REDIRECT_CONTEXT
, WSAEINVAL
, 0, TRUE
},
13348 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13349 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
13350 { IPV6_RECVERR
, WSAEINVAL
, 0, TRUE
},
13351 { IPV6_USER_MTU
, 0, 0, TRUE
},
13354 static const struct sockopt_validity_test ipv6_udp_tests
[] =
13356 { -1, WSAENOPROTOOPT
},
13357 { IPV6_HOPOPTS
, 0, 0, TRUE
},
13358 { IPV6_HDRINCL
, WSAEINVAL
, 0, TRUE
},
13359 { IPV6_UNICAST_HOPS
},
13360 { IPV6_MULTICAST_IF
},
13361 { IPV6_MULTICAST_HOPS
},
13362 { IPV6_MULTICAST_LOOP
},
13363 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13364 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13368 { IPV6_PROTECTION_LEVEL
},
13369 { IPV6_RECVIF
, 0, 0, TRUE
},
13370 { IPV6_RECVDSTADDR
, 0, 0, TRUE
},
13372 { IPV6_IFLIST
, 0, 0, TRUE
},
13373 { IPV6_UNICAST_IF
},
13374 { IPV6_RTHDR
, 0, 0, TRUE
},
13375 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13376 { IPV6_RECVRTHDR
, 0, 0, TRUE
},
13377 { IPV6_RECVTCLASS
},
13378 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
13379 { IPV6_ECN
, 0, 0, TRUE
},
13380 { IPV6_PKTINFO_EX
, 0, 0, TRUE
},
13381 { IPV6_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
13382 { IPV6_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
13383 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13384 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
13385 { IPV6_RECVERR
, 0, 0, TRUE
},
13386 { IPV6_USER_MTU
, 0, 0, TRUE
},
13389 static const struct sockopt_validity_test ipv6_raw_tests
[] =
13391 { -1, WSAENOPROTOOPT
},
13392 { IPV6_HOPOPTS
, 0, 0, TRUE
},
13393 { IPV6_HDRINCL
, 0, 0, TRUE
},
13394 { IPV6_UNICAST_HOPS
},
13395 { IPV6_MULTICAST_IF
},
13396 { IPV6_MULTICAST_HOPS
},
13397 { IPV6_MULTICAST_LOOP
},
13398 { IPV6_ADD_MEMBERSHIP
, WSAENOPROTOOPT
},
13399 { IPV6_DROP_MEMBERSHIP
, WSAENOPROTOOPT
},
13403 { IPV6_PROTECTION_LEVEL
},
13404 { IPV6_RECVIF
, 0, 0, TRUE
},
13405 { IPV6_RECVDSTADDR
, 0, 0, TRUE
},
13407 { IPV6_IFLIST
, 0, 0, TRUE
},
13408 { IPV6_UNICAST_IF
},
13409 { IPV6_RTHDR
, 0, 0, TRUE
},
13410 { IPV6_GET_IFLIST
, WSAEINVAL
, 0, TRUE
},
13411 { IPV6_RECVRTHDR
, 0, 0, TRUE
},
13412 { IPV6_RECVTCLASS
},
13413 { IP_ORIGINAL_ARRIVAL_IF
, 0, 0, TRUE
},
13414 { IPV6_ECN
, 0, 0, TRUE
},
13415 { IPV6_PKTINFO_EX
, 0, 0, TRUE
},
13416 { IPV6_WFP_REDIRECT_RECORDS
, 0, 0, TRUE
},
13417 { IPV6_WFP_REDIRECT_CONTEXT
, 0, 0, TRUE
},
13418 { IPV6_MTU_DISCOVER
, 0, WSAEINVAL
, TRUE
},
13419 { IPV6_MTU
, WSAENOTCONN
, 0, TRUE
},
13420 { IPV6_RECVERR
, WSAEINVAL
, 0, TRUE
},
13421 { IPV6_USER_MTU
, 0, 0, TRUE
},
13424 static const struct sockopt_validity_test file_handle_tests
[] =
13426 { -1, WSAENOTSOCK
},
13427 { SO_TYPE
, WSAENOTSOCK
},
13431 char path
[MAX_PATH
];
13435 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
13436 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13437 do_sockopt_validity_tests("IPv4 TCP", sock
, IPPROTO_IP
, ipv4_tcp_tests
);
13440 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
13441 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13442 do_sockopt_validity_tests("IPv4 UDP", sock
, IPPROTO_IP
, ipv4_udp_tests
);
13445 sock
= socket(AF_INET
, SOCK_RAW
, IPPROTO_RAW
);
13446 if (sock
== INVALID_SOCKET
&& WSAGetLastError() == WSAEACCES
)
13448 skip("Raw IPv4 sockets are not available\n");
13452 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13453 do_sockopt_validity_tests("IPv4 raw", sock
, IPPROTO_IP
, ipv4_raw_tests
);
13457 sock
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
13458 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13459 do_sockopt_validity_tests("IPv6 TCP", sock
, IPPROTO_IPV6
, ipv6_tcp_tests
);
13462 sock
= socket(AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
);
13463 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13464 do_sockopt_validity_tests("IPv6 UDP", sock
, IPPROTO_IPV6
, ipv6_udp_tests
);
13467 sock
= socket(AF_INET6
, SOCK_RAW
, IPPROTO_RAW
);
13468 if (sock
== INVALID_SOCKET
&& WSAGetLastError() == WSAEACCES
)
13470 skip("Raw IPv6 sockets are not available\n");
13474 ok(sock
!= INVALID_SOCKET
, "failed to create socket, error %u\n", WSAGetLastError());
13475 do_sockopt_validity_tests("IPv6 raw", sock
, IPPROTO_IPV6
, ipv6_raw_tests
);
13479 GetSystemWindowsDirectoryA(path
, ARRAY_SIZE(path
));
13480 strcat(path
, "\\system.ini");
13481 file
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
13482 do_sockopt_validity_tests("file", (SOCKET
)file
, SOL_SOCKET
, file_handle_tests
);
13486 static void test_tcp_reset(void)
13488 static const struct timeval select_timeout
;
13489 fd_set readfds
, writefds
, exceptfds
;
13490 OVERLAPPED overlapped
= {0};
13491 SOCKET client
, server
;
13492 DWORD size
, flags
= 0;
13493 int ret
, len
, error
;
13497 overlapped
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
13499 tcp_socketpair(&client
, &server
);
13501 wsabuf
.buf
= buffer
;
13502 wsabuf
.len
= sizeof(buffer
);
13503 WSASetLastError(0xdeadbeef);
13505 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
13506 ok(ret
== -1, "got %d\n", ret
);
13507 ok(WSAGetLastError() == ERROR_IO_PENDING
, "got error %u\n", WSAGetLastError());
13509 close_with_rst(server
);
13511 ret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
13512 ok(!ret
, "wait failed\n");
13513 ret
= GetOverlappedResult((HANDLE
)client
, &overlapped
, &size
, FALSE
);
13514 ok(!ret
, "expected failure\n");
13515 ok(GetLastError() == ERROR_NETNAME_DELETED
, "got error %lu\n", GetLastError());
13516 ok(!size
, "got size %lu\n", size
);
13517 ok((NTSTATUS
)overlapped
.Internal
== STATUS_CONNECTION_RESET
, "got status %#lx\n", (NTSTATUS
)overlapped
.Internal
);
13519 len
= sizeof(error
);
13520 ret
= getsockopt(client
, SOL_SOCKET
, SO_ERROR
, (char *)&error
, &len
);
13521 ok(!ret
, "got error %u\n", WSAGetLastError());
13522 ok(!error
, "got error %u\n", error
);
13524 wsabuf
.buf
= buffer
;
13525 wsabuf
.len
= sizeof(buffer
);
13526 WSASetLastError(0xdeadbeef);
13528 ret
= WSARecv(client
, &wsabuf
, 1, &size
, &flags
, &overlapped
, NULL
);
13529 todo_wine
ok(ret
== -1, "got %d\n", ret
);
13530 todo_wine
ok(WSAGetLastError() == WSAECONNRESET
, "got error %u\n", WSAGetLastError());
13532 check_poll(client
, POLLERR
| POLLHUP
| POLLWRNORM
);
13535 FD_ZERO(&writefds
);
13536 FD_ZERO(&exceptfds
);
13537 FD_SET(client
, &readfds
);
13538 FD_SET(client
, &writefds
);
13539 FD_SET(client
, &exceptfds
);
13540 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
13541 ok(ret
== 2, "got %d\n", ret
);
13542 ok(FD_ISSET(client
, &readfds
), "FD should be set\n");
13543 ok(FD_ISSET(client
, &writefds
), "FD should be set\n");
13544 ok(!FD_ISSET(client
, &exceptfds
), "FD should be set\n");
13546 FD_ZERO(&exceptfds
);
13547 FD_SET(client
, &exceptfds
);
13548 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
13549 ok(!ret
, "got %d\n", ret
);
13550 ok(!FD_ISSET(client
, &exceptfds
), "FD should be set\n");
13552 closesocket(server
);
13553 CloseHandle(overlapped
.hEvent
);
13573 BYTE v_hl
; /* version << 4 | hdr_len */
13585 /* rfc 1071 checksum */
13586 static unsigned short chksum(BYTE
*data
, unsigned int count
)
13588 unsigned int sum
= 0, carry
= 0;
13589 unsigned short check
, s
;
13593 s
= *(unsigned short *)data
;
13600 sum
+= carry
; /* This won't produce another carry */
13601 sum
= (sum
& 0xffff) + (sum
>> 16);
13603 if (count
) sum
+= *data
; /* LE-only */
13605 sum
= (sum
& 0xffff) + (sum
>> 16);
13606 /* fold in any carry */
13607 sum
= (sum
& 0xffff) + (sum
>> 16);
13613 static void test_icmp(void)
13615 static const unsigned int ping_data
= 0xdeadbeef;
13616 struct icmp_hdr
*icmp_h
;
13617 BYTE send_buf
[sizeof(struct icmp_hdr
) + sizeof(ping_data
)];
13618 UINT16 recv_checksum
, checksum
;
13619 unsigned int reply_data
;
13620 struct sockaddr_in sa
;
13621 struct ip_hdr
*ip_h
;
13622 struct in_addr addr
;
13623 BYTE recv_buf
[256];
13627 s
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_ICMP
, NULL
, 0, 0);
13628 if (s
== INVALID_SOCKET
)
13630 ret
= WSAGetLastError();
13631 ok(ret
== WSAEACCES
, "Expected 10013, received %d\n", ret
);
13632 skip("SOCK_RAW is not supported\n");
13636 icmp_h
= (struct icmp_hdr
*)send_buf
;
13637 icmp_h
->type
= ICMP4_ECHO_REQUEST
;
13639 icmp_h
->checksum
= 0;
13640 icmp_h
->un
.echo
.id
= 0xbeaf; /* will be overwritten for linux ping socks */
13641 icmp_h
->un
.echo
.sequence
= 1;
13642 *(unsigned int *)(icmp_h
+ 1) = ping_data
;
13643 icmp_h
->checksum
= chksum(send_buf
, sizeof(send_buf
));
13645 memset(&sa
, 0, sizeof(sa
));
13646 sa
.sin_family
= AF_INET
;
13648 sa
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
13650 ret
= sendto(s
, (char *)send_buf
, sizeof(send_buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
13651 ok(ret
== sizeof(send_buf
), "got %d, error %d.\n", ret
, WSAGetLastError());
13653 ret
= recv(s
, (char *)recv_buf
, sizeof(struct ip_hdr
) + sizeof(send_buf
) - 1, 0);
13654 ok(ret
== -1, "got %d\n", ret
);
13655 ok(WSAGetLastError() == WSAEMSGSIZE
, "got %d\n", WSAGetLastError());
13657 icmp_h
->un
.echo
.sequence
= 2;
13658 icmp_h
->checksum
= 0;
13659 icmp_h
->checksum
= chksum(send_buf
, sizeof(send_buf
));
13661 ret
= sendto(s
, (char *)send_buf
, sizeof(send_buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
13662 ok(ret
!= SOCKET_ERROR
, "got error %d.\n", WSAGetLastError());
13664 memset(recv_buf
, 0xcc, sizeof(recv_buf
));
13665 ret
= recv(s
, (char *)recv_buf
, sizeof(recv_buf
), 0);
13666 ok(ret
== sizeof(struct ip_hdr
) + sizeof(send_buf
), "got %d\n", ret
);
13668 ip_h
= (struct ip_hdr
*)recv_buf
;
13669 icmp_h
= (struct icmp_hdr
*)(ip_h
+ 1);
13670 reply_data
= *(unsigned int *)(icmp_h
+ 1);
13672 ok(ip_h
->v_hl
== ((4 << 4) | (sizeof(*ip_h
) >> 2)), "got v_hl %#x.\n", ip_h
->v_hl
);
13673 ok(ntohs(ip_h
->tot_len
) == sizeof(struct ip_hdr
) + sizeof(send_buf
),
13674 "got tot_len %#x.\n", ntohs(ip_h
->tot_len
));
13676 recv_checksum
= ip_h
->checksum
;
13677 ip_h
->checksum
= 0;
13678 checksum
= chksum((BYTE
*)ip_h
, sizeof(*ip_h
));
13679 /* Checksum is 0 for localhost ping on Windows but not for remote host ping. */
13680 ok(recv_checksum
== checksum
|| !recv_checksum
, "got checksum %#x, expected %#x.\n", recv_checksum
, checksum
);
13682 ok(!ip_h
->frag_off
, "got id %#x.\n", ip_h
->frag_off
);
13683 addr
.s_addr
= ip_h
->saddr
;
13684 ok(ip_h
->saddr
== sa
.sin_addr
.s_addr
, "got saddr %s.\n", inet_ntoa(addr
));
13685 addr
.s_addr
= ip_h
->daddr
;
13686 ok(!!ip_h
->daddr
, "got daddr %s.\n", inet_ntoa(addr
));
13688 ok(ip_h
->protocol
== 1, "got protocol %#x.\n", ip_h
->protocol
);
13690 ok(icmp_h
->type
== ICMP4_ECHO_REPLY
, "got type %#x.\n", icmp_h
->type
);
13691 ok(!icmp_h
->code
, "got code %#x.\n", icmp_h
->code
);
13692 ok(icmp_h
->un
.echo
.id
== 0xbeaf, "got echo id %#x.\n", icmp_h
->un
.echo
.id
);
13693 ok(icmp_h
->un
.echo
.sequence
== 2, "got echo sequence %#x.\n", icmp_h
->un
.echo
.sequence
);
13695 recv_checksum
= icmp_h
->checksum
;
13696 icmp_h
->checksum
= 0;
13697 checksum
= chksum((BYTE
*)icmp_h
, sizeof(send_buf
));
13698 ok(recv_checksum
== checksum
, "got checksum %#x, expected %#x.\n", recv_checksum
, checksum
);
13700 ok(reply_data
== ping_data
, "got reply_data %#x.\n", reply_data
);
13705 static void test_connect_time(void)
13707 struct sockaddr_in addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
13708 SOCKET client
, server
;
13712 client
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
13714 len
= sizeof(time
);
13715 SetLastError(0xdeadbeef);
13716 ret
= getsockopt(client
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&time
, &len
);
13717 ok(!ret
, "got %d\n", ret
);
13718 ok(!GetLastError(), "got error %lu\n", GetLastError());
13719 ok(len
== sizeof(time
), "got len %d\n", len
);
13720 ok(time
== ~0u, "got time %u\n", time
);
13722 closesocket(client
);
13724 tcp_socketpair(&client
, &server
);
13726 len
= sizeof(time
);
13727 SetLastError(0xdeadbeef);
13728 ret
= getsockopt(client
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&time
, &len
);
13729 ok(!ret
, "got %d\n", ret
);
13730 ok(!GetLastError(), "got error %lu\n", GetLastError());
13731 ok(len
== sizeof(time
), "got len %d\n", len
);
13732 ok(time
== 0, "got time %u\n", time
);
13734 len
= sizeof(time
);
13735 SetLastError(0xdeadbeef);
13736 ret
= getsockopt(server
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&time
, &len
);
13737 ok(!ret
, "got %d\n", ret
);
13738 ok(!GetLastError(), "got error %lu\n", GetLastError());
13739 ok(len
== sizeof(time
), "got len %d\n", len
);
13740 ok(time
== 0, "got time %u\n", time
);
13742 closesocket(client
);
13743 closesocket(server
);
13745 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
13746 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
13748 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
13749 ok(!ret
, "got error %lu\n", GetLastError());
13750 len
= sizeof(addr
);
13751 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
13752 ok(!ret
, "got error %lu\n", GetLastError());
13753 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
13754 ok(!ret
, "got error %lu\n", GetLastError());
13756 len
= sizeof(time
);
13757 SetLastError(0xdeadbeef);
13758 ret
= getsockopt(client
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&time
, &len
);
13759 ok(!ret
, "got %d\n", ret
);
13760 ok(!GetLastError(), "got error %lu\n", GetLastError());
13761 ok(len
== sizeof(time
), "got len %d\n", len
);
13762 ok(time
== ~0u, "got time %u\n", time
);
13764 len
= sizeof(time
);
13765 SetLastError(0xdeadbeef);
13766 ret
= getsockopt(server
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&time
, &len
);
13767 ok(!ret
, "got %d\n", ret
);
13768 ok(!GetLastError(), "got error %lu\n", GetLastError());
13769 ok(len
== sizeof(time
), "got len %d\n", len
);
13770 ok(time
== ~0u, "got time %u\n", time
);
13772 closesocket(server
);
13773 closesocket(client
);
13776 static void test_connect_udp(void)
13778 const struct sockaddr_in bind_addr
= {.sin_family
= AF_INET
, .sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
)};
13779 struct sockaddr_in addr
, ret_addr
;
13780 SOCKET client
, server
;
13784 client
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
13785 server
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
13786 set_blocking(client
, FALSE
);
13787 set_blocking(server
, FALSE
);
13789 SetLastError(0xdeadbeef);
13790 ret
= send(client
, "data", 4, 0);
13791 ok(ret
== -1, "got %d\n", ret
);
13792 todo_wine
ok(GetLastError() == WSAENOTCONN
, "got error %lu\n", GetLastError());
13794 SetLastError(0xdeadbeef);
13795 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
13796 ok(ret
== -1, "got %d\n", ret
);
13797 todo_wine
ok(GetLastError() == WSAEINVAL
, "got error %lu\n", GetLastError());
13799 ret
= bind(server
, (const struct sockaddr
*)&bind_addr
, sizeof(bind_addr
));
13800 ok(!ret
, "got error %lu\n", GetLastError());
13801 len
= sizeof(addr
);
13802 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
13803 ok(!ret
, "got error %lu\n", GetLastError());
13805 SetLastError(0xdeadbeef);
13806 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
13807 ok(ret
== -1, "got %d\n", ret
);
13808 ok(GetLastError() == WSAEWOULDBLOCK
, "got error %lu\n", GetLastError());
13810 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
13811 ok(!ret
, "got error %lu\n", GetLastError());
13812 ret
= getpeername(client
, (struct sockaddr
*)&ret_addr
, &len
);
13813 ok(!ret
, "got error %lu\n", GetLastError());
13814 ok(!memcmp(&ret_addr
, &addr
, sizeof(addr
)), "addresses didn't match\n");
13816 ret
= getsockname(client
, (struct sockaddr
*)&ret_addr
, &len
);
13817 ok(!ret
, "got error %lu\n", GetLastError());
13819 SetLastError(0xdeadbeef);
13820 ret
= getpeername(server
, (struct sockaddr
*)&ret_addr
, &len
);
13821 ok(ret
== -1, "got %d\n", ret
);
13822 ok(GetLastError() == WSAENOTCONN
, "got error %lu\n", GetLastError());
13824 ret
= send(client
, "data", 4, 0);
13825 ok(ret
== 4, "got %d\n", ret
);
13827 memset(buffer
, 0xcc, sizeof(buffer
));
13828 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
13829 ok(ret
== 4, "got %d\n", ret
);
13830 ok(!memcmp(buffer
, "data", 4), "got %s\n", debugstr_an(buffer
, ret
));
13832 SetLastError(0xdeadbeef);
13833 ret
= recv(server
, buffer
, sizeof(buffer
), 0);
13834 ok(ret
== -1, "got %d\n", ret
);
13835 ok(GetLastError() == WSAEWOULDBLOCK
, "got error %lu\n", GetLastError());
13837 SetLastError(0xdeadbeef);
13838 ret
= send(server
, "data", 4, 0);
13839 ok(ret
== -1, "got %d\n", ret
);
13840 todo_wine
ok(GetLastError() == WSAENOTCONN
, "got error %lu\n", GetLastError());
13842 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
13843 ok(!ret
, "got error %lu\n", GetLastError());
13845 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
13846 ok(!ret
, "got error %lu\n", GetLastError());
13848 memset(&addr
, 0, sizeof(addr
));
13849 addr
.sin_family
= AF_UNSPEC
;
13850 ret
= connect(client
, (struct sockaddr
*)&addr
, sizeof(addr
));
13851 ok(!ret
, "got error %lu\n", GetLastError());
13853 ret
= getpeername(client
, (struct sockaddr
*)&ret_addr
, &len
);
13854 ok(ret
== -1, "got %d\n", ret
);
13855 ok(GetLastError() == WSAENOTCONN
, "got error %lu\n", GetLastError());
13857 closesocket(server
);
13858 closesocket(client
);
13861 static void test_tcp_sendto_recvfrom(void)
13863 SOCKET client
, server
= 0;
13864 SOCKADDR_IN addr
= { AF_INET
, SERVERPORT
};
13865 SOCKADDR_IN bad_addr
, bad_addr_copy
;
13866 const char serverMsg
[] = "ws2_32/TCP socket test";
13867 char clientBuf
[sizeof(serverMsg
)] = { 0 };
13868 int to_len
= 0xc0ffee11;
13871 inet_pton(AF_INET
, SERVERIP
, &addr
.sin_addr
);
13873 tcp_socketpair(&client
, &server
);
13875 memset(&bad_addr
, 0xfe, sizeof(bad_addr
));
13876 memcpy(&bad_addr_copy
, &bad_addr
, sizeof(bad_addr_copy
));
13878 ret
= sendto(server
, serverMsg
, sizeof(serverMsg
), 0, (SOCKADDR
*)&bad_addr
, sizeof(bad_addr
));
13879 ok(ret
== sizeof(serverMsg
), "Incorrect return value from sendto: %d (%d)\n", ret
, WSAGetLastError());
13880 ok(!memcmp(&bad_addr
, &bad_addr_copy
, sizeof(bad_addr
)), "Provided address modified by sendto\n");
13881 ok(to_len
== 0xc0ffee11, "Provided size modified by sendto\n");
13883 ret
= recvfrom(client
, clientBuf
, sizeof(clientBuf
), 0, (SOCKADDR
*)&bad_addr
, &to_len
);
13884 ok(ret
== sizeof(serverMsg
), "Incorrect return value from recvfrom: %d (%d)\n", ret
, WSAGetLastError());
13885 ok(!memcmp(&bad_addr
, &bad_addr_copy
, sizeof(bad_addr
)), "Provided address modified by recvfrom\n");
13886 ok(to_len
== 0xc0ffee11, "Provided size modified by recvfrom\n");
13888 ok(!memcmp(serverMsg
, clientBuf
, sizeof(serverMsg
)), "Data mismatch over TCP socket\n");
13890 closesocket(client
);
13891 closesocket(server
);
13898 /* Leave these tests at the beginning. They depend on WSAStartup not having been
13899 * called, which is done by Init() below. */
13900 test_WithoutWSAStartup();
13901 test_WithWSAStartup();
13905 test_set_getsockopt();
13910 test_extendedSocketOptions();
13912 test_sockopt_validity();
13913 test_connect_time();
13915 for (i
= 0; i
< ARRAY_SIZE(tests
); i
++)
13916 do_test(&tests
[i
]);
13921 test_WSADuplicateSocket();
13922 test_WSAConnectByName();
13923 test_WSAEnumNetworkEvents();
13929 test_accept_inheritance();
13930 test_getpeername();
13931 test_getsockname();
13933 test_address_list_query();
13935 test_fionread_siocatmark();
13936 test_get_extension_func();
13937 test_backlog_query();
13938 test_get_interface_list();
13939 test_keepalive_vals();
13940 test_sioRoutingInterfaceQuery();
13941 test_sioAddressListChange();
13942 test_base_handle();
13943 test_circular_queueing();
13944 test_unsupported_ioctls();
13950 test_write_watch();
13955 test_TransmitFile();
13959 test_DisconnectEx();
13961 test_completion_port();
13962 test_connect_completion_port();
13963 test_shutdown_completion_port();
13965 test_connecting_socket();
13966 test_WSAGetOverlappedResult();
13967 test_nonblocking_async_recv();
13968 test_simultaneous_async_recv();
13973 test_connect_udp();
13974 test_tcp_sendto_recvfrom();
13976 /* There is apparently an obscure interaction between this test and
13977 * test_WSAGetOverlappedResult().
13979 * One thing this test does is to close socket handles through CloseHandle()
13980 * and NtClose(), to prove that that is sufficient to cancel I/O on the
13981 * socket. This has the obscure side effect that ws2_32.dll's internal
13982 * per-process list of sockets never has that socket removed.
13984 * test_WSAGetOverlappedResult() effectively proves that the per-process
13985 * list of sockets exists, by calling DuplicateHandle() on a socket and then
13986 * passing it to a function which cares about socket handle validity, which
13987 * checks that handle against the internal list, finds it invalid, and
13988 * returns WSAENOTSOCK.
13990 * The problem is that if we close an NT handle without removing it from the
13991 * ws2_32 list, then duplicate another handle, it *may* end up allocated to
13992 * the same handle value, and thus re-validate that handle right under the
13993 * nose of ws2_32. This causes the test_WSAGetOverlappedResult() test to
13994 * sometimes succeed where it's expected to fail with ENOTSOCK.
13996 * In order to avoid this, make sure that this test—which is evidently
13997 * destructive to ws2_32 internal state in obscure ways—is executed last.
14001 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */