ws2_32/tests: Add some tests for sockets bound to a completion port.
[wine.git] / dlls / ws2_32 / tests / sock.c
blob179ace4c6aede0de4e4997833a1e24bd46ee0ad9
1 /*
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
24 #include <ntstatus.h>
25 #define WIN32_NO_STATUS
26 #include <winsock2.h>
27 #include <windows.h>
28 #include <winternl.h>
29 #include <ws2tcpip.h>
30 #include <wsipx.h>
31 #include <wsnwlink.h>
32 #include <mswsock.h>
33 #include <mstcpip.h>
34 #include <iphlpapi.h>
35 #include <stdio.h>
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 NUM_THREADS 3 /* Number of threads to run getservbyname */
48 #define NUM_QUERIES 250 /* Number of getservbyname queries per thread */
50 #define SERVERIP "127.0.0.1" /* IP to bind to */
51 #define SERVERPORT 9374 /* Port number to bind to */
53 #define wsa_ok(op, cond, msg) \
54 do { \
55 int tmp, err = 0; \
56 tmp = op; \
57 if ( !(cond tmp) ) err = WSAGetLastError(); \
58 ok ( cond tmp, msg, GetCurrentThreadId(), err); \
59 } while (0);
61 #define make_keepalive(k, enable, time, interval) \
62 k.onoff = enable; \
63 k.keepalivetime = time; \
64 k.keepaliveinterval = interval;
66 /* Function pointers */
67 static void (WINAPI *pfreeaddrinfo)(struct addrinfo *);
68 static int (WINAPI *pgetaddrinfo)(LPCSTR,LPCSTR,const struct addrinfo *,struct addrinfo **);
69 static void (WINAPI *pFreeAddrInfoW)(PADDRINFOW);
70 static void (WINAPI *pFreeAddrInfoExW)(ADDRINFOEXW *ai);
71 static int (WINAPI *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW *,PADDRINFOW *);
72 static int (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, DWORD namespace,
73 GUID *namespace_id, const ADDRINFOEXW *hints, ADDRINFOEXW **result,
74 struct timeval *timeout, OVERLAPPED *overlapped,
75 LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle);
76 static int (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped);
77 static PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG);
78 static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG);
79 static int (WINAPI *pInetPtonA)(INT,LPCSTR,LPVOID);
80 static int (WINAPI *pInetPtonW)(INT,LPWSTR,LPVOID);
81 static int (WINAPI *pWSALookupServiceBeginW)(LPWSAQUERYSETW,DWORD,LPHANDLE);
82 static int (WINAPI *pWSALookupServiceEnd)(HANDLE);
83 static int (WINAPI *pWSALookupServiceNextW)(HANDLE,DWORD,LPDWORD,LPWSAQUERYSETW);
84 static int (WINAPI *pWSAEnumNameSpaceProvidersA)(LPDWORD,LPWSANAMESPACE_INFOA);
85 static int (WINAPI *pWSAEnumNameSpaceProvidersW)(LPDWORD,LPWSANAMESPACE_INFOW);
86 static int (WINAPI *pWSAPoll)(WSAPOLLFD *,ULONG,INT);
88 /* Function pointers from iphlpapi */
89 static DWORD (WINAPI *pGetAdaptersInfo)(PIP_ADAPTER_INFO,PULONG);
90 static DWORD (WINAPI *pGetIpForwardTable)(PMIB_IPFORWARDTABLE,PULONG,BOOL);
92 /* Function pointers from ntdll */
93 static DWORD (WINAPI *pNtClose)(HANDLE);
95 /**************** Structs and typedefs ***************/
97 typedef struct thread_info
99 HANDLE thread;
100 DWORD id;
101 } thread_info;
103 /* Information in the server about open client connections */
104 typedef struct sock_info
106 SOCKET s;
107 struct sockaddr_in addr;
108 struct sockaddr_in peer;
109 char *buf;
110 int n_recvd;
111 int n_sent;
112 } sock_info;
114 /* Test parameters for both server & client */
115 typedef struct test_params
117 int sock_type;
118 int sock_prot;
119 const char *inet_addr;
120 short inet_port;
121 int chunk_size;
122 int n_chunks;
123 int n_clients;
124 } test_params;
126 /* server-specific test parameters */
127 typedef struct server_params
129 test_params *general;
130 DWORD sock_flags;
131 int buflen;
132 } server_params;
134 /* client-specific test parameters */
135 typedef struct client_params
137 test_params *general;
138 DWORD sock_flags;
139 int buflen;
140 } client_params;
142 /* This type combines all information for setting up a test scenario */
143 typedef struct test_setup
145 test_params general;
146 LPVOID srv;
147 server_params srv_params;
148 LPVOID clt;
149 client_params clt_params;
150 } test_setup;
152 /* Thread local storage for server */
153 typedef struct server_memory
155 SOCKET s;
156 struct sockaddr_in addr;
157 sock_info sock[MAX_CLIENTS];
158 } server_memory;
160 /* Thread local storage for client */
161 typedef struct client_memory
163 SOCKET s;
164 struct sockaddr_in addr;
165 char *send_buf;
166 char *recv_buf;
167 } client_memory;
169 /* SelectReadThread thread parameters */
170 typedef struct select_thread_params
172 SOCKET s;
173 BOOL ReadKilled;
174 } select_thread_params;
176 /* Tests used in both getaddrinfo and GetAddrInfoW */
177 static const struct addr_hint_tests
179 int family, socktype, protocol;
180 DWORD error;
181 } hinttests[] = {
182 {AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0 },
183 {AF_UNSPEC, SOCK_STREAM, IPPROTO_UDP, 0 },
184 {AF_UNSPEC, SOCK_STREAM, IPPROTO_IPV6,0 },
185 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_TCP, 0 },
186 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, 0 },
187 {AF_UNSPEC, SOCK_DGRAM, IPPROTO_IPV6,0 },
188 {AF_INET, SOCK_STREAM, IPPROTO_TCP, 0 },
189 {AF_INET, SOCK_STREAM, IPPROTO_UDP, 0 },
190 {AF_INET, SOCK_STREAM, IPPROTO_IPV6,0 },
191 {AF_INET, SOCK_DGRAM, IPPROTO_TCP, 0 },
192 {AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0 },
193 {AF_INET, SOCK_DGRAM, IPPROTO_IPV6,0 },
194 {AF_UNSPEC, 0, IPPROTO_TCP, 0 },
195 {AF_UNSPEC, 0, IPPROTO_UDP, 0 },
196 {AF_UNSPEC, 0, IPPROTO_IPV6,0 },
197 {AF_UNSPEC, SOCK_STREAM, 0, 0 },
198 {AF_UNSPEC, SOCK_DGRAM, 0, 0 },
199 {AF_INET, 0, IPPROTO_TCP, 0 },
200 {AF_INET, 0, IPPROTO_UDP, 0 },
201 {AF_INET, 0, IPPROTO_IPV6,0 },
202 {AF_INET, SOCK_STREAM, 0, 0 },
203 {AF_INET, SOCK_DGRAM, 0, 0 },
204 {AF_UNSPEC, 999, IPPROTO_TCP, WSAESOCKTNOSUPPORT },
205 {AF_UNSPEC, 999, IPPROTO_UDP, WSAESOCKTNOSUPPORT },
206 {AF_UNSPEC, 999, IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
207 {AF_INET, 999, IPPROTO_TCP, WSAESOCKTNOSUPPORT },
208 {AF_INET, 999, IPPROTO_UDP, WSAESOCKTNOSUPPORT },
209 {AF_INET, 999, IPPROTO_IPV6,WSAESOCKTNOSUPPORT },
210 {AF_UNSPEC, SOCK_STREAM, 999, 0 },
211 {AF_UNSPEC, SOCK_STREAM, 999, 0 },
212 {AF_INET, SOCK_DGRAM, 999, 0 },
213 {AF_INET, SOCK_DGRAM, 999, 0 },
216 /**************** Static variables ***************/
218 static DWORD tls; /* Thread local storage index */
219 static HANDLE thread[1+MAX_CLIENTS];
220 static DWORD thread_id[1+MAX_CLIENTS];
221 static HANDLE server_ready;
222 static HANDLE client_ready[MAX_CLIENTS];
223 static int client_id;
225 /**************** General utility functions ***************/
227 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len);
228 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock);
230 static int tcp_socketpair(SOCKET *src, SOCKET *dst)
232 SOCKET server = INVALID_SOCKET;
233 struct sockaddr_in addr;
234 int len;
235 int ret;
237 *src = INVALID_SOCKET;
238 *dst = INVALID_SOCKET;
240 *src = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
241 if (*src == INVALID_SOCKET)
242 goto end;
244 server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
245 if (server == INVALID_SOCKET)
246 goto end;
248 memset(&addr, 0, sizeof(addr));
249 addr.sin_family = AF_INET;
250 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
251 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
252 if (ret != 0)
253 goto end;
255 len = sizeof(addr);
256 ret = getsockname(server, (struct sockaddr*)&addr, &len);
257 if (ret != 0)
258 goto end;
260 ret = listen(server, 1);
261 if (ret != 0)
262 goto end;
264 ret = connect(*src, (struct sockaddr*)&addr, sizeof(addr));
265 if (ret != 0)
266 goto end;
268 len = sizeof(addr);
269 *dst = accept(server, (struct sockaddr*)&addr, &len);
271 end:
272 if (server != INVALID_SOCKET)
273 closesocket(server);
274 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
275 return 0;
276 closesocket(*src);
277 closesocket(*dst);
278 return -1;
281 static int tcp_socketpair_ovl(SOCKET *src, SOCKET *dst)
283 SOCKET server = INVALID_SOCKET;
284 struct sockaddr_in addr;
285 int len, ret;
287 *src = INVALID_SOCKET;
288 *dst = INVALID_SOCKET;
290 *src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
291 if (*src == INVALID_SOCKET)
292 goto end;
294 server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
295 if (server == INVALID_SOCKET)
296 goto end;
298 memset(&addr, 0, sizeof(addr));
299 addr.sin_family = AF_INET;
300 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
301 ret = bind(server, (struct sockaddr *)&addr, sizeof(addr));
302 if (ret != 0)
303 goto end;
305 len = sizeof(addr);
306 ret = getsockname(server, (struct sockaddr *)&addr, &len);
307 if (ret != 0)
308 goto end;
310 ret = listen(server, 1);
311 if (ret != 0)
312 goto end;
314 ret = connect(*src, (struct sockaddr *)&addr, sizeof(addr));
315 if (ret != 0)
316 goto end;
318 len = sizeof(addr);
319 *dst = accept(server, (struct sockaddr *)&addr, &len);
321 end:
322 if (server != INVALID_SOCKET)
323 closesocket(server);
324 if (*src != INVALID_SOCKET && *dst != INVALID_SOCKET)
325 return 0;
326 closesocket(*src);
327 closesocket(*dst);
328 return -1;
331 static void set_so_opentype ( BOOL overlapped )
333 int optval = !overlapped, newval, len = sizeof (int);
335 ok ( setsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
336 (LPVOID) &optval, sizeof (optval) ) == 0,
337 "setting SO_OPENTYPE failed\n" );
338 ok ( getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
339 (LPVOID) &newval, &len ) == 0,
340 "getting SO_OPENTYPE failed\n" );
341 ok ( optval == newval, "failed to set SO_OPENTYPE\n" );
344 static int set_blocking ( SOCKET s, BOOL blocking )
346 u_long val = !blocking;
347 return ioctlsocket ( s, FIONBIO, &val );
350 static void fill_buffer ( char *buf, int chunk_size, int n_chunks )
352 char c, *p;
353 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
354 memset ( p, c, chunk_size );
357 static int test_buffer ( char *buf, int chunk_size, int n_chunks )
359 char c, *p;
360 int i;
361 for ( c = FIRST_CHAR, p = buf; c < FIRST_CHAR + n_chunks; c++, p += chunk_size )
363 for ( i = 0; i < chunk_size; i++ )
364 if ( p[i] != c ) return i;
366 return -1;
370 * This routine is called when a client / server does not expect any more data,
371 * but needs to acknowledge the closing of the connection (by reading 0 bytes).
373 static void read_zero_bytes ( SOCKET s )
375 char buf[256];
376 int tmp, n = 0;
377 while ( ( tmp = recv ( s, buf, 256, 0 ) ) > 0 )
378 n += tmp;
379 ok ( n <= 0, "garbage data received: %d bytes\n", n );
382 static int do_synchronous_send ( SOCKET s, char *buf, int buflen, int flags, int sendlen )
384 char* last = buf + buflen, *p;
385 int n = 1;
386 for ( p = buf; n > 0 && p < last; )
388 n = send ( s, p, min ( sendlen, last - p ), flags );
389 if (n > 0) p += n;
391 wsa_ok ( n, 0 <=, "do_synchronous_send (%x): error %d\n" );
392 return p - buf;
395 static int do_synchronous_recv ( SOCKET s, char *buf, int buflen, int flags, int recvlen )
397 char* last = buf + buflen, *p;
398 int n = 1;
399 for ( p = buf; n > 0 && p < last; )
401 n = recv ( s, p, min ( recvlen, last - p ), flags );
402 if (n > 0) p += n;
404 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
405 return p - buf;
408 static int do_synchronous_recvfrom ( SOCKET s, char *buf, int buflen, int flags, struct sockaddr *from, int *fromlen, int recvlen )
410 char* last = buf + buflen, *p;
411 int n = 1;
412 for ( p = buf; n > 0 && p < last; )
414 n = recvfrom ( s, p, min ( recvlen, last - p ), flags, from, fromlen );
415 if (n > 0) p += n;
417 wsa_ok ( n, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
418 return p - buf;
422 * Call this routine right after thread startup.
423 * SO_OPENTYPE must by 0, regardless what the server did.
425 static void check_so_opentype (void)
427 int tmp = 1, len;
428 len = sizeof (tmp);
429 getsockopt ( INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (LPVOID) &tmp, &len );
430 ok ( tmp == 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp );
433 static void compare_addrinfo (ADDRINFO *a, ADDRINFO *b)
435 for (; a && b ; a = a->ai_next, b = b->ai_next)
437 ok(a->ai_flags == b->ai_flags,
438 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
439 ok(a->ai_family == b->ai_family,
440 "Wrong family %d != %d\n", a->ai_family, b->ai_family);
441 ok(a->ai_socktype == b->ai_socktype,
442 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
443 ok(a->ai_protocol == b->ai_protocol,
444 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
445 ok(a->ai_addrlen == b->ai_addrlen,
446 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
447 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
448 "Wrong address data\n");
449 if (a->ai_canonname && b->ai_canonname)
451 ok(!strcmp(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
452 a->ai_canonname, b->ai_canonname);
454 else
455 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
456 a->ai_canonname, b->ai_canonname);
458 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
461 static void compare_addrinfow (ADDRINFOW *a, ADDRINFOW *b)
463 for (; a && b ; a = a->ai_next, b = b->ai_next)
465 ok(a->ai_flags == b->ai_flags,
466 "Wrong flags %d != %d\n", a->ai_flags, b->ai_flags);
467 ok(a->ai_family == b->ai_family,
468 "Wrong family %d != %d\n", a->ai_family, b->ai_family);
469 ok(a->ai_socktype == b->ai_socktype,
470 "Wrong socktype %d != %d\n", a->ai_socktype, b->ai_socktype);
471 ok(a->ai_protocol == b->ai_protocol,
472 "Wrong protocol %d != %d\n", a->ai_protocol, b->ai_protocol);
473 ok(a->ai_addrlen == b->ai_addrlen,
474 "Wrong addrlen %lu != %lu\n", a->ai_addrlen, b->ai_addrlen);
475 ok(!memcmp(a->ai_addr, b->ai_addr, min(a->ai_addrlen, b->ai_addrlen)),
476 "Wrong address data\n");
477 if (a->ai_canonname && b->ai_canonname)
479 ok(!lstrcmpW(a->ai_canonname, b->ai_canonname), "Wrong canonical name '%s' != '%s'\n",
480 wine_dbgstr_w(a->ai_canonname), wine_dbgstr_w(b->ai_canonname));
482 else
483 ok(!a->ai_canonname && !b->ai_canonname, "Expected both names absent (%p != %p)\n",
484 a->ai_canonname, b->ai_canonname);
486 ok(!a && !b, "Expected both addresses null (%p != %p)\n", a, b);
489 /**************** Server utility functions ***************/
492 * Even if we have closed our server socket cleanly,
493 * the OS may mark the address "in use" for some time -
494 * this happens with native Linux apps, too.
496 static void do_bind ( SOCKET s, struct sockaddr* addr, int addrlen )
498 int err, wsaerr = 0, n_try = BIND_TRIES;
500 while ( ( err = bind ( s, addr, addrlen ) ) != 0 &&
501 ( wsaerr = WSAGetLastError () ) == WSAEADDRINUSE &&
502 n_try-- >= 0)
504 trace ( "address in use, waiting ...\n" );
505 Sleep ( 1000 * BIND_SLEEP );
507 ok ( err == 0, "failed to bind: %d\n", wsaerr );
510 static void server_start ( server_params *par )
512 int i;
513 test_params *gen = par->general;
514 server_memory *mem = LocalAlloc ( LPTR, sizeof ( server_memory ) );
516 TlsSetValue ( tls, mem );
517 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
518 NULL, 0, par->sock_flags );
519 ok ( mem->s != INVALID_SOCKET, "Server: WSASocket failed\n" );
521 mem->addr.sin_family = AF_INET;
522 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
523 mem->addr.sin_port = htons ( gen->inet_port );
525 for (i = 0; i < MAX_CLIENTS; i++)
527 mem->sock[i].s = INVALID_SOCKET;
528 mem->sock[i].buf = LocalAlloc ( LPTR, gen->n_chunks * gen->chunk_size );
529 mem->sock[i].n_recvd = 0;
530 mem->sock[i].n_sent = 0;
533 if ( gen->sock_type == SOCK_STREAM )
534 do_bind ( mem->s, (struct sockaddr*) &mem->addr, sizeof (mem->addr) );
537 static void server_stop (void)
539 int i;
540 server_memory *mem = TlsGetValue ( tls );
542 for (i = 0; i < MAX_CLIENTS; i++ )
544 LocalFree ( mem->sock[i].buf );
545 if ( mem->sock[i].s != INVALID_SOCKET )
546 closesocket ( mem->sock[i].s );
548 ok ( closesocket ( mem->s ) == 0, "closesocket failed\n" );
549 LocalFree ( mem );
550 ExitThread ( GetCurrentThreadId () );
553 /**************** Client utilitiy functions ***************/
555 static void client_start ( client_params *par )
557 test_params *gen = par->general;
558 client_memory *mem = LocalAlloc (LPTR, sizeof (client_memory));
560 TlsSetValue ( tls, mem );
562 WaitForSingleObject ( server_ready, INFINITE );
564 mem->s = WSASocketA ( AF_INET, gen->sock_type, gen->sock_prot,
565 NULL, 0, par->sock_flags );
567 mem->addr.sin_family = AF_INET;
568 mem->addr.sin_addr.s_addr = inet_addr ( gen->inet_addr );
569 mem->addr.sin_port = htons ( gen->inet_port );
571 ok ( mem->s != INVALID_SOCKET, "Client: WSASocket failed\n" );
573 mem->send_buf = LocalAlloc ( LPTR, 2 * gen->n_chunks * gen->chunk_size );
574 mem->recv_buf = mem->send_buf + gen->n_chunks * gen->chunk_size;
575 fill_buffer ( mem->send_buf, gen->chunk_size, gen->n_chunks );
577 SetEvent ( client_ready[client_id] );
578 /* Wait for the other clients to come up */
579 WaitForMultipleObjects ( min ( gen->n_clients, MAX_CLIENTS ), client_ready, TRUE, INFINITE );
582 static void client_stop (void)
584 client_memory *mem = TlsGetValue ( tls );
585 wsa_ok ( closesocket ( mem->s ), 0 ==, "closesocket error (%x): %d\n" );
586 LocalFree ( mem->send_buf );
587 LocalFree ( mem );
588 ExitThread(0);
591 /**************** Servers ***************/
594 * simple_server: A very basic server doing synchronous IO.
596 static VOID WINAPI simple_server ( server_params *par )
598 test_params *gen = par->general;
599 server_memory *mem;
600 int pos, n_recvd, n_sent, n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
601 id = GetCurrentThreadId();
603 trace ( "simple_server (%x) starting\n", id );
605 set_so_opentype ( FALSE ); /* non-overlapped */
606 server_start ( par );
607 mem = TlsGetValue ( tls );
609 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
610 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "simple_server (%x): listen failed: %d\n");
612 trace ( "simple_server (%x) ready\n", id );
613 SetEvent ( server_ready ); /* notify clients */
615 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
617 trace ( "simple_server (%x): waiting for client\n", id );
619 /* accept a single connection */
620 tmp = sizeof ( mem->sock[0].peer );
621 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp );
622 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "simple_server (%x): accept failed: %d\n" );
624 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
625 "simple_server (%x): strange peer address\n", id );
627 /* Receive data & check it */
628 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
629 ok ( n_recvd == n_expected,
630 "simple_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
631 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks );
632 ok ( pos == -1, "simple_server (%x): test pattern error: %d\n", id, pos);
634 /* Echo data back */
635 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
636 ok ( n_sent == n_expected,
637 "simple_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
639 /* cleanup */
640 read_zero_bytes ( mem->sock[0].s );
641 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "simple_server (%x): closesocket error: %d\n" );
642 mem->sock[0].s = INVALID_SOCKET;
645 trace ( "simple_server (%x) exiting\n", id );
646 server_stop ();
650 * oob_server: A very basic server receiving out-of-band data.
652 static VOID WINAPI oob_server ( server_params *par )
654 test_params *gen = par->general;
655 server_memory *mem;
656 u_long atmark = 0;
657 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, tmp,
658 id = GetCurrentThreadId();
660 trace ( "oob_server (%x) starting\n", id );
662 set_so_opentype ( FALSE ); /* non-overlapped */
663 server_start ( par );
664 mem = TlsGetValue ( tls );
666 wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n");
667 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "oob_server (%x): listen failed: %d\n");
669 trace ( "oob_server (%x) ready\n", id );
670 SetEvent ( server_ready ); /* notify clients */
672 trace ( "oob_server (%x): waiting for client\n", id );
674 /* accept a single connection */
675 tmp = sizeof ( mem->sock[0].peer );
676 mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp );
677 wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "oob_server (%x): accept failed: %d\n" );
679 ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
680 "oob_server (%x): strange peer address\n", id );
682 /* check initial atmark state */
683 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
684 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark );
686 /* Receive normal data */
687 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
688 ok ( n_recvd == n_expected,
689 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
690 pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks );
691 ok ( pos == -1, "oob_server (%x): test pattern error: %d\n", id, pos);
693 /* check atmark state */
694 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
695 ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark );
697 /* Echo data back */
698 n_sent = do_synchronous_send ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
699 ok ( n_sent == n_expected,
700 "oob_server (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
702 /* Receive a part of the out-of-band data and print atmark state */
703 n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, 8, 0, par->buflen );
704 ok ( n_recvd == 8,
705 "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, 8 );
706 n_expected -= 8;
708 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
709 trace( "oob_server (%x): %s the OOB mark: %i\n", id, atmark == 1 ? "not at" : "at", atmark );
711 /* Receive the rest of the out-of-band data and check atmark state */
712 do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, 0, par->buflen );
714 ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark );
715 todo_wine ok ( atmark == 0, "oob_server (%x): not at the OOB mark: %i\n", id, atmark );
717 /* cleanup */
718 wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "oob_server (%x): closesocket error: %d\n" );
719 mem->sock[0].s = INVALID_SOCKET;
721 trace ( "oob_server (%x) exiting\n", id );
722 server_stop ();
726 * select_server: A non-blocking server.
728 static VOID WINAPI select_server ( server_params *par )
730 test_params *gen = par->general;
731 server_memory *mem;
732 int n_expected = gen->n_chunks * gen->chunk_size, tmp, i,
733 id = GetCurrentThreadId(), n_connections = 0, n_sent, n_recvd,
734 n_set, delta, n_ready;
735 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
736 fd_set fds_recv, fds_send, fds_openrecv, fds_opensend;
738 trace ( "select_server (%x) starting\n", id );
740 set_so_opentype ( FALSE ); /* non-overlapped */
741 server_start ( par );
742 mem = TlsGetValue ( tls );
744 wsa_ok ( set_blocking ( mem->s, FALSE ), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
745 wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "select_server (%x): listen failed: %d\n");
747 trace ( "select_server (%x) ready\n", id );
748 SetEvent ( server_ready ); /* notify clients */
750 FD_ZERO ( &fds_openrecv );
751 FD_ZERO ( &fds_recv );
752 FD_ZERO ( &fds_send );
753 FD_ZERO ( &fds_opensend );
755 FD_SET ( mem->s, &fds_openrecv );
757 while(1)
759 fds_recv = fds_openrecv;
760 fds_send = fds_opensend;
762 n_set = 0;
764 wsa_ok ( ( n_ready = select ( 0, &fds_recv, &fds_send, NULL, &timeout ) ), SOCKET_ERROR !=,
765 "select_server (%x): select() failed: %d\n" );
767 /* check for incoming requests */
768 if ( FD_ISSET ( mem->s, &fds_recv ) ) {
769 n_set += 1;
771 trace ( "select_server (%x): accepting client connection\n", id );
773 /* accept a single connection */
774 tmp = sizeof ( mem->sock[n_connections].peer );
775 mem->sock[n_connections].s = accept ( mem->s, (struct sockaddr*) &mem->sock[n_connections].peer, &tmp );
776 wsa_ok ( mem->sock[n_connections].s, INVALID_SOCKET !=, "select_server (%x): accept() failed: %d\n" );
778 ok ( mem->sock[n_connections].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ),
779 "select_server (%x): strange peer address\n", id );
781 /* add to list of open connections */
782 FD_SET ( mem->sock[n_connections].s, &fds_openrecv );
783 FD_SET ( mem->sock[n_connections].s, &fds_opensend );
785 n_connections++;
788 /* handle open requests */
790 for ( i = 0; i < n_connections; i++ )
792 if ( FD_ISSET( mem->sock[i].s, &fds_recv ) ) {
793 n_set += 1;
795 if ( mem->sock[i].n_recvd < n_expected ) {
796 /* Receive data & check it */
797 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 );
798 ok ( n_recvd != SOCKET_ERROR, "select_server (%x): error in recv(): %d\n", id, WSAGetLastError() );
799 mem->sock[i].n_recvd += n_recvd;
801 if ( mem->sock[i].n_recvd == n_expected ) {
802 int pos = test_buffer ( mem->sock[i].buf, gen->chunk_size, gen->n_chunks );
803 ok ( pos == -1, "select_server (%x): test pattern error: %d\n", id, pos );
804 FD_CLR ( mem->sock[i].s, &fds_openrecv );
807 ok ( mem->sock[i].n_recvd <= n_expected, "select_server (%x): received too many bytes: %d\n", id, mem->sock[i].n_recvd );
811 /* only echo back what we've received */
812 delta = mem->sock[i].n_recvd - mem->sock[i].n_sent;
814 if ( FD_ISSET ( mem->sock[i].s, &fds_send ) ) {
815 n_set += 1;
817 if ( ( delta > 0 ) && ( mem->sock[i].n_sent < n_expected ) ) {
818 /* Echo data back */
819 n_sent = send ( mem->sock[i].s, mem->sock[i].buf + mem->sock[i].n_sent, min ( delta, par->buflen ), 0 );
820 ok ( n_sent != SOCKET_ERROR, "select_server (%x): error in send(): %d\n", id, WSAGetLastError() );
821 mem->sock[i].n_sent += n_sent;
823 if ( mem->sock[i].n_sent == n_expected ) {
824 FD_CLR ( mem->sock[i].s, &fds_opensend );
827 ok ( mem->sock[i].n_sent <= n_expected, "select_server (%x): sent too many bytes: %d\n", id, mem->sock[i].n_sent );
832 /* check that select returned the correct number of ready sockets */
833 ok ( ( n_set == n_ready ), "select_server (%x): select() returns wrong number of ready sockets\n", id );
835 /* check if all clients are done */
836 if ( ( fds_opensend.fd_count == 0 )
837 && ( fds_openrecv.fd_count == 1 ) /* initial socket that accepts clients */
838 && ( n_connections == min ( gen->n_clients, MAX_CLIENTS ) ) ) {
839 break;
843 for ( i = 0; i < min ( gen->n_clients, MAX_CLIENTS ); i++ )
845 /* cleanup */
846 read_zero_bytes ( mem->sock[i].s );
847 wsa_ok ( closesocket ( mem->sock[i].s ), 0 ==, "select_server (%x): closesocket error: %d\n" );
848 mem->sock[i].s = INVALID_SOCKET;
851 trace ( "select_server (%x) exiting\n", id );
852 server_stop ();
855 /**************** Clients ***************/
858 * simple_client: A very basic client doing synchronous IO.
860 static VOID WINAPI simple_client ( client_params *par )
862 test_params *gen = par->general;
863 client_memory *mem;
864 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
866 id = GetCurrentThreadId();
867 trace ( "simple_client (%x): starting\n", id );
868 /* wait here because we want to call set_so_opentype before creating a socket */
869 WaitForSingleObject ( server_ready, INFINITE );
870 trace ( "simple_client (%x): server ready\n", id );
872 check_so_opentype ();
873 set_so_opentype ( FALSE ); /* non-overlapped */
874 client_start ( par );
875 mem = TlsGetValue ( tls );
877 /* Connect */
878 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
879 0 ==, "simple_client (%x): connect error: %d\n" );
880 ok ( set_blocking ( mem->s, TRUE ) == 0,
881 "simple_client (%x): failed to set blocking mode\n", id );
882 trace ( "simple_client (%x) connected\n", id );
884 /* send data to server */
885 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
886 ok ( n_sent == n_expected,
887 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
889 /* shutdown send direction */
890 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
892 /* Receive data echoed back & check it */
893 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen );
894 ok ( n_recvd == n_expected,
895 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
897 /* check data */
898 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
899 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
901 /* cleanup */
902 read_zero_bytes ( mem->s );
903 trace ( "simple_client (%x) exiting\n", id );
904 client_stop ();
908 * oob_client: A very basic client sending out-of-band data.
910 static VOID WINAPI oob_client ( client_params *par )
912 test_params *gen = par->general;
913 client_memory *mem;
914 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
916 id = GetCurrentThreadId();
917 trace ( "oob_client (%x): starting\n", id );
918 /* wait here because we want to call set_so_opentype before creating a socket */
919 WaitForSingleObject ( server_ready, INFINITE );
920 trace ( "oob_client (%x): server ready\n", id );
922 check_so_opentype ();
923 set_so_opentype ( FALSE ); /* non-overlapped */
924 client_start ( par );
925 mem = TlsGetValue ( tls );
927 /* Connect */
928 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
929 0 ==, "oob_client (%x): connect error: %d\n" );
930 ok ( set_blocking ( mem->s, TRUE ) == 0,
931 "oob_client (%x): failed to set blocking mode\n", id );
932 trace ( "oob_client (%x) connected\n", id );
934 /* send data to server */
935 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
936 ok ( n_sent == n_expected,
937 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
939 /* Receive data echoed back & check it */
940 n_recvd = do_synchronous_recv ( mem->s, mem->recv_buf, n_expected, 0, par->buflen );
941 ok ( n_recvd == n_expected,
942 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
943 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
944 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
946 /* send out-of-band data to server */
947 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, MSG_OOB, par->buflen );
948 ok ( n_sent == n_expected,
949 "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
951 /* shutdown send direction */
952 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
954 /* cleanup */
955 read_zero_bytes ( mem->s );
956 trace ( "oob_client (%x) exiting\n", id );
957 client_stop ();
961 * simple_mixed_client: mixing send and recvfrom
963 static VOID WINAPI simple_mixed_client ( client_params *par )
965 test_params *gen = par->general;
966 client_memory *mem;
967 int pos, n_sent, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, id;
968 int fromLen = sizeof(mem->addr);
969 struct sockaddr test;
971 id = GetCurrentThreadId();
972 trace ( "simple_client (%x): starting\n", id );
973 /* wait here because we want to call set_so_opentype before creating a socket */
974 WaitForSingleObject ( server_ready, INFINITE );
975 trace ( "simple_client (%x): server ready\n", id );
977 check_so_opentype ();
978 set_so_opentype ( FALSE ); /* non-overlapped */
979 client_start ( par );
980 mem = TlsGetValue ( tls );
982 /* Connect */
983 wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ),
984 0 ==, "simple_client (%x): connect error: %d\n" );
985 ok ( set_blocking ( mem->s, TRUE ) == 0,
986 "simple_client (%x): failed to set blocking mode\n", id );
987 trace ( "simple_client (%x) connected\n", id );
989 /* send data to server */
990 n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, 0, par->buflen );
991 ok ( n_sent == n_expected,
992 "simple_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected );
994 /* shutdown send direction */
995 wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
997 /* this shouldn't change, since lpFrom, is not updated on
998 connection oriented sockets - exposed by bug 11640
1000 ((struct sockaddr_in*)&test)->sin_addr.s_addr = inet_addr("0.0.0.0");
1002 /* Receive data echoed back & check it */
1003 n_recvd = do_synchronous_recvfrom ( mem->s,
1004 mem->recv_buf,
1005 n_expected,
1007 (struct sockaddr *)&test,
1008 &fromLen,
1009 par->buflen );
1010 ok ( n_recvd == n_expected,
1011 "simple_client (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected );
1013 /* check that lpFrom was not updated */
1014 ok(0 ==
1015 strcmp(
1016 inet_ntoa(((struct sockaddr_in*)&test)->sin_addr),
1017 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
1019 /* check data */
1020 pos = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
1021 ok ( pos == -1, "simple_client (%x): test pattern error: %d\n", id, pos);
1023 /* cleanup */
1024 read_zero_bytes ( mem->s );
1025 trace ( "simple_client (%x) exiting\n", id );
1026 client_stop ();
1030 * event_client: An event-driven client
1032 static void WINAPI event_client ( client_params *par )
1034 test_params *gen = par->general;
1035 client_memory *mem;
1036 int id = GetCurrentThreadId(), n_expected = gen->n_chunks * gen->chunk_size,
1037 tmp, err, n;
1038 HANDLE event;
1039 WSANETWORKEVENTS wsa_events;
1040 char *send_last, *recv_last, *send_p, *recv_p;
1041 LONG mask = FD_READ | FD_WRITE | FD_CLOSE;
1043 trace ( "event_client (%x): starting\n", id );
1044 client_start ( par );
1045 trace ( "event_client (%x): server ready\n", id );
1047 mem = TlsGetValue ( tls );
1049 /* Prepare event notification for connect, makes socket nonblocking */
1050 event = WSACreateEvent ();
1051 WSAEventSelect ( mem->s, event, FD_CONNECT );
1052 tmp = connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) );
1053 if ( tmp != 0 ) {
1054 err = WSAGetLastError ();
1055 ok ( err == WSAEWOULDBLOCK, "event_client (%x): connect error: %d\n", id, err );
1056 tmp = WaitForSingleObject ( event, INFINITE );
1057 ok ( tmp == WAIT_OBJECT_0, "event_client (%x): wait for connect event failed: %d\n", id, tmp );
1058 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
1059 ok ( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err );
1060 err = wsa_events.iErrorCode[ FD_CONNECT_BIT ];
1061 ok ( err == 0, "event_client (%x): connect error: %d\n", id, err );
1062 if ( err ) goto out;
1065 trace ( "event_client (%x) connected\n", id );
1067 WSAEventSelect ( mem->s, event, mask );
1069 recv_p = mem->recv_buf;
1070 recv_last = mem->recv_buf + n_expected;
1071 send_p = mem->send_buf;
1072 send_last = mem->send_buf + n_expected;
1074 while ( TRUE )
1076 err = WaitForSingleObject ( event, INFINITE );
1077 ok ( err == WAIT_OBJECT_0, "event_client (%x): wait failed\n", id );
1079 err = WSAEnumNetworkEvents ( mem->s, event, &wsa_events );
1080 ok( err == 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id, err );
1082 if ( wsa_events.lNetworkEvents & FD_WRITE )
1084 err = wsa_events.iErrorCode[ FD_WRITE_BIT ];
1085 ok ( err == 0, "event_client (%x): FD_WRITE error code: %d\n", id, err );
1087 if ( err== 0 )
1090 n = send ( mem->s, send_p, min ( send_last - send_p, par->buflen ), 0 );
1091 if ( n < 0 )
1093 err = WSAGetLastError ();
1094 ok ( err == WSAEWOULDBLOCK, "event_client (%x): send error: %d\n", id, err );
1096 else
1097 send_p += n;
1099 while ( n >= 0 && send_p < send_last );
1101 if ( send_p == send_last )
1103 trace ( "event_client (%x): all data sent - shutdown\n", id );
1104 shutdown ( mem->s, SD_SEND );
1105 mask &= ~FD_WRITE;
1106 WSAEventSelect ( mem->s, event, mask );
1109 if ( wsa_events.lNetworkEvents & FD_READ )
1111 err = wsa_events.iErrorCode[ FD_READ_BIT ];
1112 ok ( err == 0, "event_client (%x): FD_READ error code: %d\n", id, err );
1113 if ( err != 0 ) break;
1115 /* First read must succeed */
1116 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
1117 wsa_ok ( n, 0 <=, "event_client (%x): recv error: %d\n" );
1119 while ( n >= 0 ) {
1120 recv_p += n;
1121 if ( recv_p == recv_last )
1123 mask &= ~FD_READ;
1124 trace ( "event_client (%x): all data received\n", id );
1125 WSAEventSelect ( mem->s, event, mask );
1126 break;
1128 n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
1129 if ( n < 0 && ( err = WSAGetLastError()) != WSAEWOULDBLOCK )
1130 ok ( 0, "event_client (%x): read error: %d\n", id, err );
1134 if ( wsa_events.lNetworkEvents & FD_CLOSE )
1136 trace ( "event_client (%x): close event\n", id );
1137 err = wsa_events.iErrorCode[ FD_CLOSE_BIT ];
1138 ok ( err == 0, "event_client (%x): FD_CLOSE error code: %d\n", id, err );
1139 break;
1143 n = send_p - mem->send_buf;
1144 ok ( send_p == send_last,
1145 "simple_client (%x): sent less data than expected: %d of %d\n", id, n, n_expected );
1146 n = recv_p - mem->recv_buf;
1147 ok ( recv_p == recv_last,
1148 "simple_client (%x): received less data than expected: %d of %d\n", id, n, n_expected );
1149 n = test_buffer ( mem->recv_buf, gen->chunk_size, gen->n_chunks );
1150 ok ( n == -1, "event_client (%x): test pattern error: %d\n", id, n);
1152 out:
1153 WSACloseEvent ( event );
1154 trace ( "event_client (%x) exiting\n", id );
1155 client_stop ();
1158 /* Tests for WSAStartup */
1159 static void test_WithoutWSAStartup(void)
1161 DWORD err;
1163 WSASetLastError(0xdeadbeef);
1164 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET, "WSASocketA should have failed\n");
1165 err = WSAGetLastError();
1166 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err);
1168 WSASetLastError(0xdeadbeef);
1169 ok(gethostbyname("localhost") == NULL, "gethostbyname() succeeded unexpectedly\n");
1170 err = WSAGetLastError();
1171 ok(err == WSANOTINITIALISED, "Expected 10093, received %d\n", err);
1174 static void test_WithWSAStartup(void)
1176 WSADATA data;
1177 WORD version = MAKEWORD( 2, 2 );
1178 INT res, socks, i, j;
1179 SOCKET sock;
1180 LPVOID ptr;
1181 struct
1183 SOCKET src, dst, dup_src, dup_dst;
1184 } pairs[128];
1185 DWORD error;
1187 res = WSAStartup( version, &data );
1188 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res);
1190 ptr = gethostbyname("localhost");
1191 ok(ptr != NULL, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
1193 /* Alloc some sockets to check if they are destroyed on WSACleanup */
1194 for (socks = 0; socks < sizeof(pairs) / sizeof(pairs[0]); socks++)
1196 WSAPROTOCOL_INFOA info;
1197 if (tcp_socketpair(&pairs[socks].src, &pairs[socks].dst)) break;
1199 memset(&info, 0, sizeof(info));
1200 ok(!WSADuplicateSocketA(pairs[socks].src, GetCurrentProcessId(), &info),
1201 "WSADuplicateSocketA should have worked\n");
1202 pairs[socks].dup_src = WSASocketA(0, 0, 0, &info, 0, 0);
1203 ok(pairs[socks].dup_src != SOCKET_ERROR, "expected != -1\n");
1205 memset(&info, 0, sizeof(info));
1206 ok(!WSADuplicateSocketA(pairs[socks].dst, GetCurrentProcessId(), &info),
1207 "WSADuplicateSocketA should have worked\n");
1208 pairs[socks].dup_dst = WSASocketA(0, 0, 0, &info, 0, 0);
1209 ok(pairs[socks].dup_dst != SOCKET_ERROR, "expected != -1\n");
1212 res = send(pairs[0].src, "TEST", 4, 0);
1213 ok(res == 4, "send failed with error %d\n", WSAGetLastError());
1215 WSACleanup();
1217 res = WSAStartup( version, &data );
1218 ok(res == 0, "WSAStartup() failed unexpectedly: %d\n", res);
1220 /* show that sockets are destroyed automatically after WSACleanup */
1221 todo_wine {
1222 SetLastError(0xdeadbeef);
1223 res = send(pairs[0].src, "TEST", 4, 0);
1224 error = WSAGetLastError();
1225 ok(res == SOCKET_ERROR, "send should have failed\n");
1226 ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error);
1228 SetLastError(0xdeadbeef);
1229 res = send(pairs[0].dst, "TEST", 4, 0);
1230 error = WSAGetLastError();
1231 ok(res == SOCKET_ERROR, "send should have failed\n");
1232 ok(error == WSAENOTSOCK, "expected 10038, got %d\n", error);
1234 /* Check that all sockets were destroyed */
1235 for (i = 0; i < socks; i++)
1237 for (j = 0; j < 4; j++)
1239 struct sockaddr_in saddr;
1240 int size = sizeof(saddr);
1241 switch(j)
1243 case 0: sock = pairs[i].src; break;
1244 case 1: sock = pairs[i].dup_src; break;
1245 case 2: sock = pairs[i].dst; break;
1246 case 3: sock = pairs[i].dup_dst; break;
1249 SetLastError(0xdeadbeef);
1250 res = getsockname(sock, (struct sockaddr *)&saddr, &size);
1251 error = WSAGetLastError();
1252 ok(res == SOCKET_ERROR, "Test[%d]: getsockname should have failed\n", i);
1253 ok(error == WSAENOTSOCK, "Test[%d]: expected 10038, got %d\n", i, error);
1259 /* While wine is not fixed, close all sockets manually */
1260 for (i = 0; i < socks; i++)
1262 closesocket(pairs[i].src);
1263 closesocket(pairs[i].dst);
1264 closesocket(pairs[i].dup_src);
1265 closesocket(pairs[i].dup_dst);
1268 res = WSACleanup();
1269 ok(res == 0, "expected 0, got %d\n", res);
1270 WSASetLastError(0xdeadbeef);
1271 res = WSACleanup();
1272 error = WSAGetLastError();
1273 ok ( (res == SOCKET_ERROR && error == WSANOTINITIALISED) ||
1274 broken(res == 0), /* WinME */
1275 "WSACleanup returned %d WSAGetLastError is %d\n", res, error);
1278 /**************** Main program utility functions ***************/
1280 static void Init (void)
1282 WORD ver = MAKEWORD (2, 2);
1283 WSADATA data;
1284 HMODULE hws2_32 = GetModuleHandleA("ws2_32.dll"), hiphlpapi, ntdll;
1286 pfreeaddrinfo = (void *)GetProcAddress(hws2_32, "freeaddrinfo");
1287 pgetaddrinfo = (void *)GetProcAddress(hws2_32, "getaddrinfo");
1288 pFreeAddrInfoW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoW");
1289 pFreeAddrInfoExW = (void *)GetProcAddress(hws2_32, "FreeAddrInfoExW");
1290 pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW");
1291 pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW");
1292 pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, "GetAddrInfoExOverlappedResult");
1293 pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop");
1294 pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW");
1295 pInetPtonA = (void *)GetProcAddress(hws2_32, "inet_pton");
1296 pInetPtonW = (void *)GetProcAddress(hws2_32, "InetPtonW");
1297 pWSALookupServiceBeginW = (void *)GetProcAddress(hws2_32, "WSALookupServiceBeginW");
1298 pWSALookupServiceEnd = (void *)GetProcAddress(hws2_32, "WSALookupServiceEnd");
1299 pWSALookupServiceNextW = (void *)GetProcAddress(hws2_32, "WSALookupServiceNextW");
1300 pWSAEnumNameSpaceProvidersA = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersA");
1301 pWSAEnumNameSpaceProvidersW = (void *)GetProcAddress(hws2_32, "WSAEnumNameSpaceProvidersW");
1302 pWSAPoll = (void *)GetProcAddress(hws2_32, "WSAPoll");
1304 hiphlpapi = LoadLibraryA("iphlpapi.dll");
1305 if (hiphlpapi)
1307 pGetIpForwardTable = (void *)GetProcAddress(hiphlpapi, "GetIpForwardTable");
1308 pGetAdaptersInfo = (void *)GetProcAddress(hiphlpapi, "GetAdaptersInfo");
1311 ntdll = LoadLibraryA("ntdll.dll");
1312 if (ntdll)
1313 pNtClose = (void *)GetProcAddress(ntdll, "NtClose");
1315 ok ( WSAStartup ( ver, &data ) == 0, "WSAStartup failed\n" );
1316 tls = TlsAlloc();
1319 static void Exit (void)
1321 INT ret, err;
1322 TlsFree ( tls );
1323 ret = WSACleanup();
1324 err = WSAGetLastError();
1325 ok ( ret == 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret, err);
1328 static void StartServer (LPTHREAD_START_ROUTINE routine,
1329 test_params *general, server_params *par)
1331 par->general = general;
1332 thread[0] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[0] );
1333 ok ( thread[0] != NULL, "Failed to create server thread\n" );
1336 static void StartClients (LPTHREAD_START_ROUTINE routine,
1337 test_params *general, client_params *par)
1339 int i;
1340 par->general = general;
1341 for ( i = 1; i <= min ( general->n_clients, MAX_CLIENTS ); i++ )
1343 client_id = i - 1;
1344 thread[i] = CreateThread ( NULL, 0, routine, par, 0, &thread_id[i] );
1345 ok ( thread[i] != NULL, "Failed to create client thread\n" );
1346 /* Make sure the client is up and running */
1347 WaitForSingleObject ( client_ready[client_id], INFINITE );
1351 static void do_test( test_setup *test )
1353 DWORD i, n = min (test->general.n_clients, MAX_CLIENTS);
1354 DWORD wait;
1356 server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL );
1357 for (i = 0; i <= n; i++)
1358 client_ready[i] = CreateEventA ( NULL, TRUE, FALSE, NULL );
1360 StartServer ( test->srv, &test->general, &test->srv_params );
1361 StartClients ( test->clt, &test->general, &test->clt_params );
1362 WaitForSingleObject ( server_ready, INFINITE );
1364 wait = WaitForMultipleObjects ( 1 + n, thread, TRUE, 1000 * TEST_TIMEOUT );
1365 ok ( wait <= WAIT_OBJECT_0 + n ,
1366 "some threads have not completed: %x\n", wait );
1368 if ( ! ( wait <= WAIT_OBJECT_0 + n ) )
1370 for (i = 0; i <= n; i++)
1372 if ( WaitForSingleObject ( thread[i], 0 ) != WAIT_OBJECT_0 )
1374 trace ("terminating thread %08x\n", thread_id[i]);
1375 TerminateThread ( thread [i], 0 );
1379 CloseHandle ( server_ready );
1380 for (i = 0; i <= n; i++)
1381 CloseHandle ( client_ready[i] );
1384 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1385 /* optname = SO_LINGER */
1386 static const LINGER linger_testvals[] = {
1387 {0,0},
1388 {0,73},
1389 {1,0},
1390 {5,189}
1393 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1394 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1395 bug in the linux kernel (fixed in 2.6.8) */
1396 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1398 static void test_set_getsockopt(void)
1400 SOCKET s, s2;
1401 int i, err, lasterr;
1402 int timeout;
1403 LINGER lingval;
1404 int size;
1405 WSAPROTOCOL_INFOA infoA;
1406 WSAPROTOCOL_INFOW infoW;
1407 char providername[WSAPROTOCOL_LEN + 1];
1408 DWORD value;
1409 struct _prottest
1411 int family, type, proto;
1412 } prottest[] = {
1413 {AF_INET, SOCK_STREAM, IPPROTO_TCP},
1414 {AF_INET, SOCK_DGRAM, IPPROTO_UDP},
1415 {AF_INET6, SOCK_STREAM, IPPROTO_TCP},
1416 {AF_INET6, SOCK_DGRAM, IPPROTO_UDP}
1418 union _csspace
1420 CSADDR_INFO cs;
1421 char space[128];
1422 } csinfoA, csinfoB;
1424 s = socket(AF_INET, SOCK_STREAM, 0);
1425 ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1426 if( s == INVALID_SOCKET) return;
1427 /* SO_RCVTIMEO */
1428 timeout = SOCKTIMEOUT1;
1429 size = sizeof(timeout);
1430 err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size);
1431 if( !err)
1432 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size);
1433 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1434 ok( timeout == SOCKTIMEOUT1, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout);
1436 timeout = 0;
1437 size = sizeof(timeout);
1438 err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, size);
1439 if( !err)
1440 err = getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, &size);
1441 ok( !err, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1442 ok( timeout == 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout);
1444 /* SO_SNDTIMEO */
1445 timeout = SOCKTIMEOUT2; /* 997 seconds. See remark above */
1446 size = sizeof(timeout);
1447 err = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, size);
1448 if( !err)
1449 err = getsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, &size);
1450 ok( !err, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1451 ok( timeout == SOCKTIMEOUT2, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout);
1453 /* SO_SNDBUF */
1454 value = 4096;
1455 size = sizeof(value);
1456 err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, size);
1457 ok( !err, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1458 value = 0xdeadbeef;
1459 err = getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&value, &size);
1460 ok( !err, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1461 todo_wine ok( value == 4096, "expected 4096, got %u\n", value );
1463 /* SO_RCVBUF */
1464 value = 4096;
1465 size = sizeof(value);
1466 err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, size);
1467 ok( !err, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1468 value = 0xdeadbeef;
1469 err = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&value, &size);
1470 ok( !err, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1471 todo_wine ok( value == 4096, "expected 4096, got %u\n", value );
1473 /* SO_LINGER */
1474 for( i = 0; i < sizeof(linger_testvals)/sizeof(LINGER);i++) {
1475 size = sizeof(lingval);
1476 lingval = linger_testvals[i];
1477 err = setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, size);
1478 if( !err)
1479 err = getsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &lingval, &size);
1480 ok( !err, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError());
1481 ok( !lingval.l_onoff == !linger_testvals[i].l_onoff &&
1482 (lingval.l_linger == linger_testvals[i].l_linger ||
1483 (!lingval.l_linger && !linger_testvals[i].l_onoff))
1484 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i,
1485 lingval.l_onoff, lingval.l_linger,
1486 linger_testvals[i].l_onoff, linger_testvals[i].l_linger);
1489 size = sizeof(lingval);
1490 err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, size);
1491 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1492 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1493 err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, 0);
1494 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1495 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1497 size = sizeof(BOOL);
1498 err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, size);
1499 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1500 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1501 err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, 0);
1502 ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
1503 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
1505 /* Test for erroneously passing a value instead of a pointer as optval */
1506 size = sizeof(char);
1507 err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size);
1508 ok(err == SOCKET_ERROR, "setsockopt with optval being a value passed "
1509 "instead of failing.\n");
1510 lasterr = WSAGetLastError();
1511 ok(lasterr == WSAEFAULT, "setsockopt with optval being a value "
1512 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1513 lasterr, WSAEFAULT);
1515 /* SO_RCVTIMEO with invalid values for level */
1516 size = sizeof(timeout);
1517 timeout = SOCKTIMEOUT1;
1518 SetLastError(0xdeadbeef);
1519 err = setsockopt(s, 0xffffffff, SO_RCVTIMEO, (char *) &timeout, size);
1520 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
1521 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1522 err, WSAGetLastError());
1524 timeout = SOCKTIMEOUT1;
1525 SetLastError(0xdeadbeef);
1526 err = setsockopt(s, 0x00008000, SO_RCVTIMEO, (char *) &timeout, size);
1527 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
1528 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1529 err, WSAGetLastError());
1531 /* Test SO_ERROR set/get */
1532 SetLastError(0xdeadbeef);
1533 i = 1234;
1534 err = setsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, size);
1535 todo_wine
1536 ok( !err && !WSAGetLastError(),
1537 "got %d with %d (expected 0 with 0)\n",
1538 err, WSAGetLastError());
1540 SetLastError(0xdeadbeef);
1541 i = 4321;
1542 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1543 todo_wine
1544 ok( !err && !WSAGetLastError(),
1545 "got %d with %d (expected 0 with 0)\n",
1546 err, WSAGetLastError());
1547 todo_wine
1548 ok (i == 1234, "got %d (expected 1234)\n", i);
1550 /* Test invalid optlen */
1551 SetLastError(0xdeadbeef);
1552 size = 1;
1553 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1554 todo_wine
1555 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAEFAULT),
1556 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1557 err, WSAGetLastError());
1559 closesocket(s);
1560 /* Test with the closed socket */
1561 SetLastError(0xdeadbeef);
1562 size = sizeof(i);
1563 i = 1234;
1564 err = getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &i, &size);
1565 todo_wine
1566 ok( (err == SOCKET_ERROR) && (WSAGetLastError() == WSAENOTSOCK),
1567 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1568 err, WSAGetLastError());
1569 ok (i == 1234, "expected 1234, got %d\n", i);
1571 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1572 s = socket(AF_INET, SOCK_DGRAM, 0);
1573 ok(s != INVALID_SOCKET, "Failed to create socket\n");
1574 size = sizeof(i);
1575 i = 0x0000000a;
1576 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &i, size);
1577 if (!err)
1579 for (i = 0; i < 4; i++)
1581 int k, j;
1582 const int tests[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1583 err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &tests[i], i + 1);
1584 ok(!err, "Test [%d] Expected 0, got %d\n", i, err);
1585 err = getsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &k, &size);
1586 ok(!err, "Test [%d] Expected 0, got %d\n", i, err);
1587 j = i != 3 ? tests[i] & ((1 << (i + 1) * 8) - 1) : tests[i];
1588 ok(k == j, "Test [%d] Expected 0x%x, got 0x%x\n", i, j, k);
1591 else
1592 win_skip("IP_MULTICAST_TTL is unsupported\n");
1593 closesocket(s);
1595 /* test SO_PROTOCOL_INFOA invalid parameters */
1596 ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL),
1597 "getsockopt should have failed\n");
1598 err = WSAGetLastError();
1599 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
1600 size = sizeof(WSAPROTOCOL_INFOA);
1601 ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size),
1602 "getsockopt should have failed\n");
1603 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1604 err = WSAGetLastError();
1605 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
1606 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1607 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL),
1608 "getsockopt should have failed\n");
1609 err = WSAGetLastError();
1610 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1611 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, NULL),
1612 "getsockopt should have failed\n");
1613 err = WSAGetLastError();
1614 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1615 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, &size),
1616 "getsockopt should have failed\n");
1617 err = WSAGetLastError();
1618 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1619 size = sizeof(WSAPROTOCOL_INFOA) / 2;
1620 ok(getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size),
1621 "getsockopt should have failed\n");
1622 err = WSAGetLastError();
1623 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
1624 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1625 size = sizeof(WSAPROTOCOL_INFOA) * 2;
1626 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size);
1627 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1628 ok(size == sizeof(WSAPROTOCOL_INFOA) * 2, "got size %d\n", size);
1630 closesocket(s);
1632 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1633 for (i = 0; i < sizeof(prottest) / sizeof(prottest[0]); i++)
1635 int k;
1637 s = socket(prottest[i].family, prottest[i].type, prottest[i].proto);
1638 if (s == INVALID_SOCKET && prottest[i].family == AF_INET6) continue;
1640 ok(s != INVALID_SOCKET, "Failed to create socket: %d\n",
1641 WSAGetLastError());
1643 /* compare both A and W version */
1644 infoA.szProtocol[0] = 0;
1645 size = sizeof(WSAPROTOCOL_INFOA);
1646 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &infoA, &size);
1647 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1648 ok(size == sizeof(WSAPROTOCOL_INFOA), "got size %d\n", size);
1650 infoW.szProtocol[0] = 0;
1651 size = sizeof(WSAPROTOCOL_INFOW);
1652 err = getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFOW, (char *) &infoW, &size);
1653 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
1654 ok(size == sizeof(WSAPROTOCOL_INFOW), "got size %d\n", size);
1656 trace("provider name '%s', family %d, type %d, proto %d\n",
1657 infoA.szProtocol, prottest[i].family, prottest[i].type, prottest[i].proto);
1659 ok(infoA.szProtocol[0] || broken(!infoA.szProtocol[0]) /* NT4 */,
1660 "WSAPROTOCOL_INFOA was not filled\n");
1661 ok(infoW.szProtocol[0] || broken(!infoA.szProtocol[0]) /* NT4 */,
1662 "WSAPROTOCOL_INFOW was not filled\n");
1664 WideCharToMultiByte(CP_ACP, 0, infoW.szProtocol, -1,
1665 providername, sizeof(providername), NULL, NULL);
1666 ok(!strcmp(infoA.szProtocol,providername),
1667 "different provider names '%s' != '%s'\n", infoA.szProtocol, providername);
1669 ok(!memcmp(&infoA, &infoW, FIELD_OFFSET(WSAPROTOCOL_INFOA, szProtocol)),
1670 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1672 /* Remove IF when WSAEnumProtocols support IPV6 data */
1673 todo_wine_if (prottest[i].family == AF_INET6)
1674 ok(infoA.iAddressFamily == prottest[i].family, "socket family invalid, expected %d received %d\n",
1675 prottest[i].family, infoA.iAddressFamily);
1676 ok(infoA.iSocketType == prottest[i].type, "socket type invalid, expected %d received %d\n",
1677 prottest[i].type, infoA.iSocketType);
1678 ok(infoA.iProtocol == prottest[i].proto, "socket protocol invalid, expected %d received %d\n",
1679 prottest[i].proto, infoA.iProtocol);
1681 /* IP_HDRINCL is supported only on SOCK_RAW but passed to SOCK_DGRAM by Impossible Creatures */
1682 size = sizeof(i);
1683 k = 1;
1684 SetLastError(0xdeadbeef);
1685 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1686 if (err == -1) /* >= Vista */
1688 todo_wine {
1689 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1690 k = 99;
1691 SetLastError(0xdeadbeef);
1692 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1693 ok(err == -1, "Expected -1, got %d\n", err);
1694 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1695 ok(k == 99, "Expected 99, got %d\n", k);
1697 size = sizeof(k);
1698 k = 0;
1699 SetLastError(0xdeadbeef);
1700 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1702 ok(err == -1, "Expected -1, got %d\n", err);
1703 todo_wine {
1704 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1705 k = 99;
1706 SetLastError(0xdeadbeef);
1707 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1708 ok(err == -1, "Expected -1, got %d\n", err);
1709 ok(GetLastError() == WSAEINVAL, "Expected 10022, got %d\n", GetLastError());
1710 ok(k == 99, "Expected 99, got %d\n", k);
1713 else /* <= 2003 the tests differ between TCP and UDP, UDP silently accepts */
1715 SetLastError(0xdeadbeef);
1716 k = 99;
1717 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1718 if (prottest[i].type == SOCK_DGRAM)
1720 ok(err == 0, "Expected 0, got %d\n", err);
1721 ok(k == 1, "Expected 1, got %d\n", k);
1723 else
1725 /* contratry to what we could expect the function returns error but k is changed */
1726 ok(err == -1, "Expected -1, got %d\n", err);
1727 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1728 ok(k == 0, "Expected 0, got %d\n", k);
1731 k = 0;
1732 err = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, size);
1733 ok(err == 0, "Expected 0, got %d\n", err);
1735 k = 99;
1736 err = getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &k, &size);
1737 if (prottest[i].type == SOCK_DGRAM)
1739 ok(err == 0, "Expected 0, got %d\n", err);
1740 ok(k == 0, "Expected 0, got %d\n", k);
1742 else
1744 /* contratry to what we could expect the function returns error but k is changed */
1745 ok(err == -1, "Expected -1, got %d\n", err);
1746 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1747 ok(k == 0, "Expected 0, got %d\n", k);
1751 closesocket(s);
1754 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1755 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1756 ok(s != INVALID_SOCKET, "Failed to create socket\n");
1757 s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1758 ok(s2 != INVALID_SOCKET, "Failed to create socket\n");
1760 SetLastError(0xdeadbeef);
1761 size = sizeof(csinfoA);
1762 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1763 if (!err)
1765 struct sockaddr_in saddr;
1766 memset(&saddr, 0, sizeof(saddr));
1767 saddr.sin_family = AF_INET;
1768 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
1770 /* Socket is not bound, no information provided */
1771 ok(!csinfoA.cs.LocalAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength);
1772 ok(csinfoA.cs.LocalAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr);
1773 /* Socket is not connected, no information provided */
1774 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength);
1775 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr);
1777 err = bind(s, (struct sockaddr*)&saddr, sizeof(saddr));
1778 ok(!err, "Expected 0, got %d\n", err);
1779 size = sizeof(csinfoA);
1780 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1781 ok(!err, "Expected 0, got %d\n", err);
1783 /* Socket is bound */
1784 ok(csinfoA.cs.LocalAddr.iSockaddrLength, "Expected non-zero\n");
1785 ok(csinfoA.cs.LocalAddr.lpSockaddr != NULL, "Expected non-null\n");
1786 /* Socket is not connected, no information provided */
1787 ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength);
1788 ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr);
1790 err = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1791 ok(!err, "Expected 0, got %d\n", err);
1792 err = getsockname(s2, (struct sockaddr *)&saddr, &size);
1793 ok(!err, "Expected 0, got %d\n", err);
1794 err = listen(s2, 1);
1795 ok(!err, "Expected 0, got %d\n", err);
1796 err = connect(s, (struct sockaddr*)&saddr, sizeof(saddr));
1797 ok(!err, "Expected 0, got %d\n", err);
1798 size = sizeof(saddr);
1799 err = accept(s2, (struct sockaddr*)&saddr, &size);
1800 ok(err != INVALID_SOCKET, "Failed to accept socket\n");
1801 closesocket(s2);
1802 s2 = err;
1804 size = sizeof(csinfoA);
1805 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1806 ok(!err, "Expected 0, got %d\n", err);
1807 err = getsockopt(s2, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoB, &size);
1808 ok(!err, "Expected 0, got %d\n", err);
1809 ok(size == sizeof(csinfoA), "Got %d\n", size);
1810 size = sizeof(saddr);
1811 ok(size == csinfoA.cs.LocalAddr.iSockaddrLength, "Expected %d, got %d\n", size,
1812 csinfoA.cs.LocalAddr.iSockaddrLength);
1813 ok(size == csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected %d, got %d\n", size,
1814 csinfoA.cs.RemoteAddr.iSockaddrLength);
1815 ok(!memcmp(csinfoA.cs.LocalAddr.lpSockaddr, csinfoB.cs.RemoteAddr.lpSockaddr, size),
1816 "Expected matching addresses\n");
1817 ok(!memcmp(csinfoB.cs.LocalAddr.lpSockaddr, csinfoA.cs.RemoteAddr.lpSockaddr, size),
1818 "Expected matching addresses\n");
1819 ok(csinfoA.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n");
1820 ok(csinfoB.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n");
1821 ok(csinfoA.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n");
1822 ok(csinfoB.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n");
1824 err = getpeername(s, (struct sockaddr *)&saddr, &size);
1825 ok(!err, "Expected 0, got %d\n", err);
1826 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1827 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1828 err = getpeername(s2, (struct sockaddr *)&saddr, &size);
1829 ok(!err, "Expected 0, got %d\n", err);
1830 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1831 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1832 err = getsockname(s, (struct sockaddr *)&saddr, &size);
1833 ok(!err, "Expected 0, got %d\n", err);
1834 ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1835 ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1836 err = getsockname(s2, (struct sockaddr *)&saddr, &size);
1837 ok(!err, "Expected 0, got %d\n", err);
1838 ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n");
1839 ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n");
1841 SetLastError(0xdeadbeef);
1842 size = sizeof(CSADDR_INFO);
1843 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1844 ok(err, "Expected non-zero\n");
1845 ok(size == sizeof(CSADDR_INFO), "Got %d\n", size);
1846 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError());
1848 /* At least for IPv4 the size is exactly 56 bytes */
1849 size = sizeof(*csinfoA.cs.LocalAddr.lpSockaddr) * 2 + sizeof(csinfoA.cs);
1850 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1851 ok(!err, "Expected 0, got %d\n", err);
1852 size--;
1853 SetLastError(0xdeadbeef);
1854 err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size);
1855 ok(err, "Expected non-zero\n");
1856 ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError());
1858 else
1859 ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError());
1861 closesocket(s);
1862 closesocket(s2);
1864 for (i = 0; i < 2; i++)
1866 int family, level;
1868 if (i)
1870 family = AF_INET6;
1871 level = IPPROTO_IPV6;
1873 else
1875 family = AF_INET;
1876 level = IPPROTO_IP;
1879 s = socket(family, SOCK_DGRAM, 0);
1880 if (s == INVALID_SOCKET && i)
1882 skip("IPv6 is not supported\n");
1883 break;
1885 ok(s != INVALID_SOCKET, "socket failed with error %d\n", GetLastError());
1887 size = sizeof(value);
1888 value = 0xdead;
1889 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1890 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1891 ok(value == 0, "Expected 0, got %d\n", value);
1893 size = sizeof(value);
1894 value = 1;
1895 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
1896 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1898 value = 0xdead;
1899 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1900 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1901 ok(value == 1, "Expected 1, got %d\n", value);
1903 size = sizeof(value);
1904 value = 0xdead;
1905 err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
1906 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1908 err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
1909 ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
1910 ok(value == 1, "Expected 1, got %d\n", value);
1912 closesocket(s);
1916 static void test_so_reuseaddr(void)
1918 struct sockaddr_in saddr;
1919 SOCKET s1,s2;
1920 unsigned int rc,reuse;
1921 int size;
1922 DWORD err;
1924 saddr.sin_family = AF_INET;
1925 saddr.sin_port = htons(SERVERPORT+1);
1926 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
1928 s1=socket(AF_INET, SOCK_STREAM, 0);
1929 ok(s1!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1930 rc = bind(s1, (struct sockaddr*)&saddr, sizeof(saddr));
1931 ok(rc!=SOCKET_ERROR, "bind(s1) failed error: %d\n", WSAGetLastError());
1933 s2=socket(AF_INET, SOCK_STREAM, 0);
1934 ok(s2!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
1936 reuse=0x1234;
1937 size=sizeof(reuse);
1938 rc=getsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, &size );
1939 ok(rc==0 && reuse==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc,reuse);
1941 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1942 ok(rc==SOCKET_ERROR, "bind() succeeded\n");
1944 reuse = 1;
1945 rc = setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
1946 ok(rc==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1948 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1949 * a port immediately after closing another socket on that port, so
1950 * basically following the BSD socket semantics here. */
1951 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1952 if(rc==0)
1954 int s3=socket(AF_INET, SOCK_STREAM, 0), s4;
1955 trace("<= Win XP behavior of SO_REUSEADDR\n");
1957 /* If we could bind again in the same port this is Windows version <= XP.
1958 * Lets test if we can really connect to one of them. */
1959 set_blocking(s1, FALSE);
1960 set_blocking(s2, FALSE);
1961 rc = listen(s1, 1);
1962 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError());
1963 rc = listen(s2, 1);
1964 ok(!rc, "listen() failed with error: %d\n", WSAGetLastError());
1965 rc = connect(s3, (struct sockaddr*)&saddr, sizeof(saddr));
1966 ok(!rc, "connecting to accepting socket failed %d\n", WSAGetLastError());
1968 /* the delivery of the connection is random so we need to try on both sockets */
1969 size = sizeof(saddr);
1970 s4 = accept(s1, (struct sockaddr*)&saddr, &size);
1971 if(s4 == INVALID_SOCKET)
1972 s4 = accept(s2, (struct sockaddr*)&saddr, &size);
1973 ok(s4 != INVALID_SOCKET, "none of the listening sockets could get the connection\n");
1975 closesocket(s1);
1976 closesocket(s3);
1977 closesocket(s4);
1979 else
1981 trace(">= Win 2003 behavior of SO_REUSEADDR\n");
1982 err = WSAGetLastError();
1983 ok(err==WSAEACCES, "expected 10013, got %d\n", err);
1985 closesocket(s1);
1986 rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
1987 ok(rc==0, "bind() failed error: %d\n", WSAGetLastError());
1990 closesocket(s2);
1993 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
1995 static void test_ip_pktinfo(void)
1997 ULONG addresses[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY)};
1998 char recvbuf[10], pktbuf[512], msg[] = "HELLO";
1999 struct sockaddr_in s1addr, s2addr, s3addr;
2000 GUID WSARecvMsg_GUID = WSAID_WSARECVMSG;
2001 LPFN_WSARECVMSG pWSARecvMsg = NULL;
2002 unsigned int rc, yes = 1;
2003 BOOL foundhdr;
2004 DWORD dwBytes, dwSize, dwFlags;
2005 socklen_t addrlen;
2006 WSACMSGHDR *cmsg;
2007 WSAOVERLAPPED ov;
2008 WSABUF iovec[1];
2009 SOCKET s1, s2;
2010 WSAMSG hdr;
2011 int i, err;
2013 memset(&ov, 0, sizeof(ov));
2014 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
2015 if (ov.hEvent == INVALID_HANDLE_VALUE)
2017 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
2018 return;
2021 memset(&hdr, 0x00, sizeof(hdr));
2022 s1addr.sin_family = AF_INET;
2023 s1addr.sin_port = htons(0);
2024 /* Note: s1addr.sin_addr is set below */
2025 iovec[0].buf = recvbuf;
2026 iovec[0].len = sizeof(recvbuf);
2027 hdr.name = (struct sockaddr*)&s3addr;
2028 hdr.namelen = sizeof(s3addr);
2029 hdr.lpBuffers = &iovec[0];
2030 hdr.dwBufferCount = 1;
2031 hdr.Control.buf = pktbuf;
2032 /* Note: hdr.Control.len is set below */
2033 hdr.dwFlags = 0;
2035 for (i=0;i<sizeof(addresses)/sizeof(UINT32);i++)
2037 s1addr.sin_addr.s_addr = addresses[i];
2039 /* Build "server" side socket */
2040 s1=socket(AF_INET, SOCK_DGRAM, 0);
2041 if (s1 == INVALID_SOCKET)
2043 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
2044 goto cleanup;
2047 /* Obtain the WSARecvMsg function */
2048 WSAIoctl(s1, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSARecvMsg_GUID, sizeof(WSARecvMsg_GUID),
2049 &pWSARecvMsg, sizeof(pWSARecvMsg), &dwBytes, NULL, NULL);
2050 if (!pWSARecvMsg)
2052 win_skip("WSARecvMsg is unsupported, some tests will be skipped.\n");
2053 closesocket(s1);
2054 goto cleanup;
2057 /* Setup the server side socket */
2058 rc=bind(s1, (struct sockaddr*)&s1addr, sizeof(s1addr));
2059 ok(rc != SOCKET_ERROR, "bind() failed error: %d\n", WSAGetLastError());
2060 rc=setsockopt(s1, IPPROTO_IP, IP_PKTINFO, (const char*)&yes, sizeof(yes));
2061 ok(rc == 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
2063 /* Build "client" side socket */
2064 addrlen = sizeof(s2addr);
2065 if (getsockname(s1, (struct sockaddr *) &s2addr, &addrlen) != 0)
2067 skip("Failed to call getsockname, some tests skipped: %d\n", WSAGetLastError());
2068 closesocket(s1);
2069 goto cleanup;
2071 s2addr.sin_addr.s_addr = addresses[0]; /* Always target the local adapter address */
2072 s2=socket(AF_INET, SOCK_DGRAM, 0);
2073 if (s2 == INVALID_SOCKET)
2075 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
2076 closesocket(s1);
2077 goto cleanup;
2080 /* Test an empty message header */
2081 rc=pWSARecvMsg(s1, NULL, NULL, NULL, NULL);
2082 err=WSAGetLastError();
2083 ok(rc == SOCKET_ERROR && err == WSAEFAULT, "WSARecvMsg() failed error: %d (ret = %d)\n", err, rc);
2086 * Send a packet from the client to the server and test for specifying
2087 * a short control header.
2089 SetLastError(0xdeadbeef);
2090 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2091 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2092 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
2093 hdr.Control.len = 1;
2094 rc=pWSARecvMsg(s1, &hdr, &dwSize, NULL, NULL);
2095 err=WSAGetLastError();
2096 ok(rc == SOCKET_ERROR && err == WSAEMSGSIZE && (hdr.dwFlags & MSG_CTRUNC),
2097 "WSARecvMsg() failed error: %d (ret: %d, flags: %d)\n", err, rc, hdr.dwFlags);
2098 hdr.dwFlags = 0; /* Reset flags */
2100 /* Perform another short control header test, this time with an overlapped receive */
2101 hdr.Control.len = 1;
2102 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL);
2103 err=WSAGetLastError();
2104 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err);
2105 SetLastError(0xdeadbeef);
2106 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2107 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2108 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
2109 if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0)
2111 skip("Server side did not receive packet, some tests skipped.\n");
2112 closesocket(s2);
2113 closesocket(s1);
2114 continue;
2116 dwFlags = 0;
2117 WSAGetOverlappedResult(s1, &ov, NULL, FALSE, &dwFlags);
2118 ok(dwFlags == 0,
2119 "WSAGetOverlappedResult() returned unexpected flags %d!\n", dwFlags);
2120 ok(hdr.dwFlags == MSG_CTRUNC,
2121 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr.dwFlags);
2122 hdr.dwFlags = 0; /* Reset flags */
2125 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
2126 * on the server end and check that the returned packet matches what was sent.
2128 hdr.Control.len = sizeof(pktbuf);
2129 rc=pWSARecvMsg(s1, &hdr, NULL, &ov, NULL);
2130 err=WSAGetLastError();
2131 ok(rc != 0 && err == WSA_IO_PENDING, "WSARecvMsg() failed error: %d\n", err);
2132 ok(hdr.Control.len == sizeof(pktbuf),
2133 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr.Control.len);
2134 rc=sendto(s2, msg, sizeof(msg), 0, (struct sockaddr*)&s2addr, sizeof(s2addr));
2135 ok(rc == sizeof(msg), "sendto() failed error: %d\n", WSAGetLastError());
2136 if (WaitForSingleObject(ov.hEvent, 100) != WAIT_OBJECT_0)
2138 skip("Server side did not receive packet, some tests skipped.\n");
2139 closesocket(s2);
2140 closesocket(s1);
2141 continue;
2143 dwSize = 0;
2144 WSAGetOverlappedResult(s1, &ov, &dwSize, FALSE, NULL);
2145 ok(dwSize == sizeof(msg),
2146 "WSARecvMsg() buffer length does not match transmitted data!\n");
2147 ok(strncmp(iovec[0].buf, msg, sizeof(msg)) == 0,
2148 "WSARecvMsg() buffer does not match transmitted data!\n");
2149 ok(hdr.Control.len == IP_PKTINFO_LEN,
2150 "WSARecvMsg() control length mismatch (%d).\n", hdr.Control.len);
2152 /* Test for the expected IP_PKTINFO return information. */
2153 foundhdr = FALSE;
2154 for (cmsg = WSA_CMSG_FIRSTHDR(&hdr); cmsg != NULL; cmsg = WSA_CMSG_NXTHDR(&hdr, cmsg))
2156 if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO)
2158 struct in_pktinfo *pi = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
2160 ok(pi->ipi_addr.s_addr == s2addr.sin_addr.s_addr, "destination ip mismatch!\n");
2161 foundhdr = TRUE;
2164 ok(foundhdr, "IP_PKTINFO header information was not returned!\n");
2166 closesocket(s2);
2167 closesocket(s1);
2170 cleanup:
2171 CloseHandle(ov.hEvent);
2174 /************* Array containing the tests to run **********/
2176 #define STD_STREAM_SOCKET \
2177 SOCK_STREAM, \
2178 0, \
2179 SERVERIP, \
2180 SERVERPORT
2182 static test_setup tests [] =
2184 /* Test 0: synchronous client and server */
2187 STD_STREAM_SOCKET,
2188 2048,
2192 simple_server,
2194 NULL,
2198 simple_client,
2200 NULL,
2205 /* Test 1: event-driven client, synchronous server */
2208 STD_STREAM_SOCKET,
2209 2048,
2213 simple_server,
2215 NULL,
2219 event_client,
2221 NULL,
2222 WSA_FLAG_OVERLAPPED,
2226 /* Test 2: synchronous client, non-blocking server via select() */
2229 STD_STREAM_SOCKET,
2230 2048,
2234 select_server,
2236 NULL,
2240 simple_client,
2242 NULL,
2247 /* Test 3: OOB client, OOB server */
2250 STD_STREAM_SOCKET,
2251 128,
2255 oob_server,
2257 NULL,
2261 oob_client,
2263 NULL,
2268 /* Test 4: synchronous mixed client and server */
2271 STD_STREAM_SOCKET,
2272 2048,
2276 simple_server,
2278 NULL,
2282 simple_mixed_client,
2284 NULL,
2291 static void test_UDP(void)
2293 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
2294 possible that this test fails due to dropped packets. */
2296 /* peer 0 receives data from all other peers */
2297 struct sock_info peer[NUM_UDP_PEERS];
2298 char buf[16];
2299 int ss, i, n_recv, n_sent;
2301 memset (buf,0,sizeof(buf));
2302 for ( i = NUM_UDP_PEERS - 1; i >= 0; i-- ) {
2303 ok ( ( peer[i].s = socket ( AF_INET, SOCK_DGRAM, 0 ) ) != INVALID_SOCKET, "UDP: socket failed\n" );
2305 peer[i].addr.sin_family = AF_INET;
2306 peer[i].addr.sin_addr.s_addr = inet_addr ( SERVERIP );
2308 if ( i == 0 ) {
2309 peer[i].addr.sin_port = htons ( SERVERPORT );
2310 } else {
2311 peer[i].addr.sin_port = htons ( 0 );
2314 do_bind ( peer[i].s, (struct sockaddr *) &peer[i].addr, sizeof( peer[i].addr ) );
2316 /* test getsockname() to get peer's port */
2317 ss = sizeof ( peer[i].addr );
2318 ok ( getsockname ( peer[i].s, (struct sockaddr *) &peer[i].addr, &ss ) != SOCKET_ERROR, "UDP: could not getsockname()\n" );
2319 ok ( peer[i].addr.sin_port != htons ( 0 ), "UDP: bind() did not associate port\n" );
2322 /* test getsockname() */
2323 ok ( peer[0].addr.sin_port == htons ( SERVERPORT ), "UDP: getsockname returned incorrect peer port\n" );
2325 for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
2326 /* send client's ip */
2327 memcpy( buf, &peer[i].addr.sin_port, sizeof(peer[i].addr.sin_port) );
2328 n_sent = sendto ( peer[i].s, buf, sizeof(buf), 0, (struct sockaddr*) &peer[0].addr, sizeof(peer[0].addr) );
2329 ok ( n_sent == sizeof(buf), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent );
2332 for ( i = 1; i < NUM_UDP_PEERS; i++ ) {
2333 n_recv = recvfrom ( peer[0].s, buf, sizeof(buf), 0,(struct sockaddr *) &peer[0].peer, &ss );
2334 ok ( n_recv == sizeof(buf), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv );
2335 ok ( memcmp ( &peer[0].peer.sin_port, buf, sizeof(peer[0].addr.sin_port) ) == 0, "UDP: port numbers do not match\n" );
2339 static DWORD WINAPI do_getservbyname( void *param )
2341 struct {
2342 const char *name;
2343 const char *proto;
2344 int port;
2345 } serv[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} };
2347 HANDLE *starttest = param;
2348 int i, j;
2349 struct servent *pserv[2];
2351 ok ( WaitForSingleObject ( *starttest, TEST_TIMEOUT * 1000 ) != WAIT_TIMEOUT,
2352 "test_getservbyname: timeout waiting for start signal\n" );
2354 /* ensure that necessary buffer resizes are completed */
2355 for ( j = 0; j < 2; j++) {
2356 pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
2359 for ( i = 0; i < NUM_QUERIES / 2; i++ ) {
2360 for ( j = 0; j < 2; j++ ) {
2361 pserv[j] = getservbyname ( serv[j].name, serv[j].proto );
2362 ok ( pserv[j] != NULL || broken(pserv[j] == NULL) /* win8, fixed in win81 */,
2363 "getservbyname could not retrieve information for %s: %d\n", serv[j].name, WSAGetLastError() );
2364 if ( !pserv[j] ) continue;
2365 ok ( pserv[j]->s_port == htons(serv[j].port),
2366 "getservbyname returned the wrong port for %s: %d\n", serv[j].name, ntohs(pserv[j]->s_port) );
2367 ok ( !strcmp ( pserv[j]->s_proto, serv[j].proto ),
2368 "getservbyname returned the wrong protocol for %s: %s\n", serv[j].name, pserv[j]->s_proto );
2369 ok ( !strcmp ( pserv[j]->s_name, serv[j].name ),
2370 "getservbyname returned the wrong name for %s: %s\n", serv[j].name, pserv[j]->s_name );
2373 ok ( pserv[0] == pserv[1] || broken(pserv[0] != pserv[1]) /* win8, fixed in win81 */,
2374 "getservbyname: winsock resized servent buffer when not necessary\n" );
2377 return 0;
2380 static void test_getservbyname(void)
2382 int i;
2383 HANDLE starttest, thread[NUM_THREADS];
2384 DWORD thread_id[NUM_THREADS];
2386 starttest = CreateEventA ( NULL, 1, 0, "test_getservbyname_starttest" );
2388 /* create threads */
2389 for ( i = 0; i < NUM_THREADS; i++ ) {
2390 thread[i] = CreateThread ( NULL, 0, do_getservbyname, &starttest, 0, &thread_id[i] );
2393 /* signal threads to start */
2394 SetEvent ( starttest );
2396 for ( i = 0; i < NUM_THREADS; i++) {
2397 WaitForSingleObject ( thread[i], TEST_TIMEOUT * 1000 );
2401 static void test_WSASocket(void)
2403 SOCKET sock = INVALID_SOCKET;
2404 WSAPROTOCOL_INFOA *pi;
2405 int wsaproviders[] = {IPPROTO_TCP, IPPROTO_IP};
2406 int autoprotocols[] = {IPPROTO_TCP, IPPROTO_UDP};
2407 int items, err, size, socktype, i, j;
2408 UINT pi_size;
2410 SetLastError(0xdeadbeef);
2411 ok(WSASocketA(0, 0, 0, NULL, 0, 0) == INVALID_SOCKET,
2412 "WSASocketA should have failed\n");
2413 err = WSAGetLastError();
2414 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2416 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0);
2417 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2418 closesocket(sock);
2420 sock = WSASocketA(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
2421 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2422 closesocket(sock);
2424 SetLastError(0xdeadbeef);
2425 ok(WSASocketA(0, SOCK_STREAM, -1, NULL, 0, 0) == INVALID_SOCKET,
2426 "WSASocketA should have failed\n");
2427 err = WSAGetLastError();
2428 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2430 SetLastError(0xdeadbeef);
2431 ok(WSASocketA(0, -1, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
2432 "WSASocketA should have failed\n");
2433 err = WSAGetLastError();
2434 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2436 SetLastError(0xdeadbeef);
2437 ok(WSASocketA(0, -1, 0, NULL, 0, 0) == INVALID_SOCKET,
2438 "WSASocketA should have failed\n");
2439 err = WSAGetLastError();
2440 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2442 SetLastError(0xdeadbeef);
2443 ok(WSASocketA(AF_INET, -1, 0, NULL, 0, 0) == INVALID_SOCKET,
2444 "WSASocketA should have failed\n");
2445 err = WSAGetLastError();
2446 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2448 SetLastError(0xdeadbeef);
2449 ok(WSASocketA(AF_INET, 0, -1, NULL, 0, 0) == INVALID_SOCKET,
2450 "WSASocketA should have failed\n");
2451 err = WSAGetLastError();
2452 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2454 SetLastError(0xdeadbeef);
2455 ok(WSASocketA(0, -1, -1, NULL, 0, 0) == INVALID_SOCKET,
2456 "WSASocketA should have failed\n");
2457 err = WSAGetLastError();
2458 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2460 SetLastError(0xdeadbeef);
2461 ok(WSASocketA(-1, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
2462 "WSASocketA should have failed\n");
2463 err = WSAGetLastError();
2464 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2466 sock = WSASocketA(AF_INET, 0, IPPROTO_TCP, NULL, 0, 0);
2467 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2468 closesocket(sock);
2470 SetLastError(0xdeadbeef);
2471 ok(WSASocketA(0, SOCK_STREAM, 0, NULL, 0, 0) == INVALID_SOCKET,
2472 "WSASocketA should have failed\n");
2473 err = WSAGetLastError();
2474 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2476 SetLastError(0xdeadbeef);
2477 ok(WSASocketA(0, 0, 0xdead, NULL, 0, 0) == INVALID_SOCKET,
2478 "WSASocketA should have failed\n");
2479 err = WSAGetLastError();
2480 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2482 SetLastError(0xdeadbeef);
2483 ok(WSASocketA(AF_INET, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET,
2484 "WSASocketA should have failed\n");
2485 err = WSAGetLastError();
2486 ok(err == WSAESOCKTNOSUPPORT, "Expected 10044, received %d\n", err);
2488 SetLastError(0xdeadbeef);
2489 ok(WSASocketA(0, 0xdead, 0, NULL, 0, 0) == INVALID_SOCKET,
2490 "WSASocketA should have failed\n");
2491 err = WSAGetLastError();
2492 ok(err == WSAEINVAL, "Expected 10022, received %d\n", err);
2494 sock = WSASocketA(0, 0, IPPROTO_TCP, NULL, 0, 0);
2495 ok(sock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2496 closesocket(sock);
2498 /* SOCK_STREAM does not support IPPROTO_UDP */
2499 SetLastError(0xdeadbeef);
2500 ok(WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_UDP, NULL, 0, 0) == INVALID_SOCKET,
2501 "WSASocketA should have failed\n");
2502 err = WSAGetLastError();
2503 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2505 /* SOCK_DGRAM does not support IPPROTO_TCP */
2506 SetLastError(0xdeadbeef);
2507 ok(WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_TCP, NULL, 0, 0) == INVALID_SOCKET,
2508 "WSASocketA should have failed\n");
2509 err = WSAGetLastError();
2510 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2512 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
2513 * to avoid a crash on win98.
2515 pi_size = 0;
2516 items = WSAEnumProtocolsA(wsaproviders, NULL, &pi_size);
2517 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
2518 items);
2519 err = WSAGetLastError();
2520 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2521 err, WSAENOBUFS);
2523 pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
2524 ok(pi != NULL, "Failed to allocate memory\n");
2525 if (pi == NULL) {
2526 skip("Can't continue without memory.\n");
2527 return;
2530 items = WSAEnumProtocolsA(wsaproviders, pi, &pi_size);
2531 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
2532 WSAGetLastError());
2534 if (items == 0) {
2535 skip("No protocols enumerated.\n");
2536 HeapFree(GetProcessHeap(), 0, pi);
2537 return;
2540 sock = WSASocketA(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
2541 FROM_PROTOCOL_INFO, &pi[0], 0, 0);
2542 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2543 WSAGetLastError());
2544 closesocket(sock);
2546 /* find what parameters are used first: plain parameters or protocol info struct */
2547 pi[0].iProtocol = -1;
2548 pi[0].iSocketType = -1;
2549 pi[0].iAddressFamily = -1;
2550 ok(WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0) == INVALID_SOCKET,
2551 "WSASocketA should have failed\n");
2552 err = WSAGetLastError();
2553 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2555 pi[0].iProtocol = 0;
2556 pi[0].iSocketType = 0;
2557 pi[0].iAddressFamily = 0;
2558 sock = WSASocketA(0, 0, IPPROTO_UDP, &pi[0], 0, 0);
2559 if(sock != INVALID_SOCKET)
2561 win_skip("must work only in OS <= 2003\n");
2562 closesocket(sock);
2564 else
2566 err = WSAGetLastError();
2567 ok(err == WSAEAFNOSUPPORT, "Expected 10047, received %d\n", err);
2570 pi[0].iProtocol = IPPROTO_UDP;
2571 pi[0].iSocketType = SOCK_DGRAM;
2572 pi[0].iAddressFamily = AF_INET;
2573 sock = WSASocketA(0, 0, 0, &pi[0], 0, 0);
2574 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2575 WSAGetLastError());
2576 size = sizeof(socktype);
2577 socktype = 0xdead;
2578 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2579 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2580 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2581 SOCK_DGRAM, socktype);
2582 closesocket(sock);
2584 sock = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi[0], 0, 0);
2585 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2586 WSAGetLastError());
2587 size = sizeof(socktype);
2588 socktype = 0xdead;
2589 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2590 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2591 ok(socktype == SOCK_STREAM, "Wrong socket type, expected %d received %d\n",
2592 SOCK_STREAM, socktype);
2593 closesocket(sock);
2595 HeapFree(GetProcessHeap(), 0, pi);
2597 pi_size = 0;
2598 items = WSAEnumProtocolsA(NULL, NULL, &pi_size);
2599 ok(items == SOCKET_ERROR, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
2600 items);
2601 err = WSAGetLastError();
2602 ok(err == WSAENOBUFS, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2603 err, WSAENOBUFS);
2605 pi = HeapAlloc(GetProcessHeap(), 0, pi_size);
2606 ok(pi != NULL, "Failed to allocate memory\n");
2607 if (pi == NULL) {
2608 skip("Can't continue without memory.\n");
2609 return;
2612 items = WSAEnumProtocolsA(NULL, pi, &pi_size);
2613 ok(items != SOCKET_ERROR, "WSAEnumProtocolsA failed, last error is %d\n",
2614 WSAGetLastError());
2616 /* when no protocol and socket type are specified the first entry
2617 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
2618 * is returned */
2619 sock = WSASocketA(AF_INET, 0, 0, NULL, 0, 0);
2620 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2621 WSAGetLastError());
2623 size = sizeof(socktype);
2624 socktype = 0xdead;
2625 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2626 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2627 for(i = 0; i < items; i++)
2629 if(pi[i].dwProviderFlags & PFL_MATCHES_PROTOCOL_ZERO)
2631 ok(socktype == pi[i].iSocketType, "Wrong socket type, expected %d received %d\n",
2632 pi[i].iSocketType, socktype);
2633 break;
2636 ok(i != items, "Creating a socket without protocol and socket type didn't work\n");
2637 closesocket(sock);
2639 /* when no socket type is specified the first entry from WSAEnumProtocols
2640 * that matches the protocol is returned */
2641 for (i = 0; i < sizeof(autoprotocols) / sizeof(autoprotocols[0]); i++)
2643 sock = WSASocketA(0, 0, autoprotocols[i], NULL, 0, 0);
2644 ok(sock != INVALID_SOCKET, "Failed to create socket for protocol %d, received %d\n",
2645 autoprotocols[i], WSAGetLastError());
2647 size = sizeof(socktype);
2648 socktype = 0xdead;
2649 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2650 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2652 for (err = 1, j = 0; j < items; j++)
2654 if (pi[j].iProtocol == autoprotocols[i])
2656 if (socktype == pi[j].iSocketType)
2657 err = 0;
2658 else
2659 ok(0, "Wrong socket type, expected %d received %d\n",
2660 pi[j].iSocketType, socktype);
2661 break;
2664 ok(!err, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols[i]);
2666 closesocket(sock);
2669 HeapFree(GetProcessHeap(), 0, pi);
2671 SetLastError(0xdeadbeef);
2672 /* starting on vista the socket function returns error during the socket
2673 creation and no longer in the socket operations (sendto, readfrom) */
2674 sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
2675 if (sock == INVALID_SOCKET)
2677 err = WSAGetLastError();
2678 ok(err == WSAEACCES, "Expected 10013, received %d\n", err);
2679 skip("SOCK_RAW is not supported\n");
2681 else
2683 trace("SOCK_RAW is supported\n");
2685 size = sizeof(socktype);
2686 socktype = 0xdead;
2687 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2688 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2689 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2690 SOCK_RAW, socktype);
2691 closesocket(sock);
2693 todo_wine {
2694 sock = WSASocketA(0, 0, IPPROTO_RAW, NULL, 0, 0);
2695 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2696 WSAGetLastError());
2697 size = sizeof(socktype);
2698 socktype = 0xdead;
2699 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2700 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2701 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2702 SOCK_RAW, socktype);
2703 closesocket(sock);
2706 sock = WSASocketA(AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0, 0);
2707 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2708 WSAGetLastError());
2709 size = sizeof(socktype);
2710 socktype = 0xdead;
2711 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2712 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2713 ok(socktype == SOCK_RAW, "Wrong socket type, expected %d received %d\n",
2714 SOCK_RAW, socktype);
2715 closesocket(sock);
2718 /* IPX socket tests */
2720 SetLastError(0xdeadbeef);
2721 sock = WSASocketA(AF_IPX, SOCK_DGRAM, NSPROTO_IPX, NULL, 0, 0);
2722 if (sock == INVALID_SOCKET)
2724 err = WSAGetLastError();
2725 ok(err == WSAEAFNOSUPPORT || broken(err == WSAEPROTONOSUPPORT), "Expected 10047, received %d\n", err);
2726 skip("IPX is not supported\n");
2728 else
2730 WSAPROTOCOL_INFOA info;
2731 closesocket(sock);
2733 trace("IPX is supported\n");
2735 sock = WSASocketA(0, 0, NSPROTO_IPX, NULL, 0, 0);
2736 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2737 WSAGetLastError());
2739 size = sizeof(socktype);
2740 socktype = 0xdead;
2741 err = getsockopt(sock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2742 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2743 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2744 SOCK_DGRAM, socktype);
2746 /* check socket family, type and protocol */
2747 size = sizeof(WSAPROTOCOL_INFOA);
2748 err = getsockopt(sock, SOL_SOCKET, SO_PROTOCOL_INFOA, (char *) &info, &size);
2749 ok(!err,"getsockopt failed with %d\n", WSAGetLastError());
2750 ok(info.iProtocol == NSPROTO_IPX, "expected protocol %d, received %d\n",
2751 NSPROTO_IPX, info.iProtocol);
2752 ok(info.iAddressFamily == AF_IPX, "expected family %d, received %d\n",
2753 AF_IPX, info.iProtocol);
2754 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n",
2755 SOCK_DGRAM, info.iSocketType);
2756 closesocket(sock);
2758 /* SOCK_STREAM does not support NSPROTO_IPX */
2759 SetLastError(0xdeadbeef);
2760 ok(WSASocketA(AF_IPX, SOCK_STREAM, NSPROTO_IPX, NULL, 0, 0) == INVALID_SOCKET,
2761 "WSASocketA should have failed\n");
2762 err = WSAGetLastError();
2763 ok(err == WSAEPROTONOSUPPORT, "Expected 10043, received %d\n", err);
2765 /* test extended IPX support - that is adding any number between 0 and 255
2766 * to the IPX protocol value will make it be used as IPX packet type */
2767 for(i = 0;i <= 255;i += 17)
2769 SetLastError(0xdeadbeef);
2770 sock = WSASocketA(0, 0, NSPROTO_IPX + i, NULL, 0, 0);
2771 ok(sock != INVALID_SOCKET, "Failed to create socket: %d\n",
2772 WSAGetLastError());
2774 size = sizeof(int);
2775 socktype = -1;
2776 err = getsockopt(sock, NSPROTO_IPX, IPX_PTYPE, (char *) &socktype, &size);
2777 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
2778 ok(socktype == i, "Wrong IPX packet type, expected %d received %d\n",
2779 i, socktype);
2781 closesocket(sock);
2786 static void test_WSADuplicateSocket(void)
2788 SOCKET source, dupsock;
2789 WSAPROTOCOL_INFOA info;
2790 DWORD err;
2791 struct sockaddr_in addr;
2792 int socktype, size, addrsize, ret;
2793 char teststr[] = "TEST", buffer[16];
2795 source = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
2796 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2798 /* test invalid parameters */
2799 SetLastError(0xdeadbeef);
2800 ok(WSADuplicateSocketA(0, 0, NULL), "WSADuplicateSocketA should have failed\n");
2801 err = WSAGetLastError();
2802 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err);
2804 SetLastError(0xdeadbeef);
2805 ok(WSADuplicateSocketA(source, 0, NULL),
2806 "WSADuplicateSocketA should have failed\n");
2807 err = WSAGetLastError();
2808 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2810 SetLastError(0xdeadbeef);
2811 ok(WSADuplicateSocketA(source, ~0, &info),
2812 "WSADuplicateSocketA should have failed\n");
2813 err = WSAGetLastError();
2814 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2816 SetLastError(0xdeadbeef);
2817 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info),
2818 "WSADuplicateSocketA should have failed\n");
2819 err = WSAGetLastError();
2820 ok(err == WSAENOTSOCK, "expected 10038, received %d\n", err);
2822 SetLastError(0xdeadbeef);
2823 ok(WSADuplicateSocketA(source, GetCurrentProcessId(), NULL),
2824 "WSADuplicateSocketA should have failed\n");
2825 err = WSAGetLastError();
2826 ok(err == WSAEFAULT, "expected 10014, received %d\n", err);
2828 /* test returned structure */
2829 memset(&info, 0, sizeof(info));
2830 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info),
2831 "WSADuplicateSocketA should have worked\n");
2833 ok(info.iProtocol == IPPROTO_TCP, "expected protocol %d, received %d\n",
2834 IPPROTO_TCP, info.iProtocol);
2835 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n",
2836 AF_INET, info.iProtocol);
2837 ok(info.iSocketType == SOCK_STREAM, "expected type %d, received %d\n",
2838 SOCK_STREAM, info.iSocketType);
2840 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2841 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2843 closesocket(dupsock);
2844 closesocket(source);
2846 /* create a socket, bind it, duplicate it then send data on source and
2847 * receive in the duplicated socket */
2848 source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
2849 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2851 memset(&info, 0, sizeof(info));
2852 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info),
2853 "WSADuplicateSocketA should have worked\n");
2855 ok(info.iProtocol == IPPROTO_UDP, "expected protocol %d, received %d\n",
2856 IPPROTO_UDP, info.iProtocol);
2857 ok(info.iAddressFamily == AF_INET, "expected family %d, received %d\n",
2858 AF_INET, info.iProtocol);
2859 ok(info.iSocketType == SOCK_DGRAM, "expected type %d, received %d\n",
2860 SOCK_DGRAM, info.iSocketType);
2862 memset(&addr, 0, sizeof(addr));
2863 addr.sin_family = AF_INET;
2864 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2865 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)),
2866 "bind should have worked\n");
2868 /* read address to find out the port number to be used in sendto */
2869 memset(&addr, 0, sizeof(addr));
2870 addrsize = sizeof(addr);
2871 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize),
2872 "getsockname should have worked\n");
2873 ok(addr.sin_port, "socket port should be != 0\n");
2875 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2876 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2878 size = sizeof(int);
2879 ret = getsockopt(dupsock, SOL_SOCKET, SO_TYPE, (char *) &socktype, &size);
2880 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
2881 ok(socktype == SOCK_DGRAM, "Wrong socket type, expected %d received %d\n",
2882 SOCK_DGRAM, socktype);
2884 set_blocking(source, TRUE);
2886 /* send data on source socket */
2887 addrsize = sizeof(addr);
2888 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize);
2889 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2891 /* receive on duplicated socket */
2892 addrsize = sizeof(addr);
2893 memset(buffer, 0, sizeof(buffer));
2894 size = recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize);
2895 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2896 buffer[sizeof(teststr) - 1] = 0;
2897 ok(!strcmp(buffer, teststr), "expected '%s', received '%s'\n", teststr, buffer);
2899 closesocket(dupsock);
2900 closesocket(source);
2902 /* show that the source socket need to be bound before the duplicated
2903 * socket is created */
2904 source = WSASocketA(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
2905 ok(source != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2907 memset(&info, 0, sizeof(info));
2908 ok(!WSADuplicateSocketA(source, GetCurrentProcessId(), &info),
2909 "WSADuplicateSocketA should have worked\n");
2911 dupsock = WSASocketA(0, 0, 0, &info, 0, 0);
2912 ok(dupsock != INVALID_SOCKET, "WSASocketA should have succeeded\n");
2914 memset(&addr, 0, sizeof(addr));
2915 addr.sin_family = AF_INET;
2916 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2917 ok(!bind(source, (struct sockaddr*)&addr, sizeof(addr)),
2918 "bind should have worked\n");
2920 /* read address to find out the port number to be used in sendto */
2921 memset(&addr, 0, sizeof(addr));
2922 addrsize = sizeof(addr);
2923 ok(!getsockname(source, (struct sockaddr *) &addr, &addrsize),
2924 "getsockname should have worked\n");
2925 ok(addr.sin_port, "socket port should be != 0\n");
2927 set_blocking(source, TRUE);
2929 addrsize = sizeof(addr);
2930 size = sendto(source, teststr, sizeof(teststr), 0, (struct sockaddr *) &addr, addrsize);
2931 ok(size == sizeof(teststr), "got %d (err %d)\n", size, WSAGetLastError());
2933 SetLastError(0xdeadbeef);
2934 addrsize = sizeof(addr);
2935 memset(buffer, 0, sizeof(buffer));
2936 todo_wine {
2937 ok(recvfrom(dupsock, buffer, sizeof(teststr), 0, (struct sockaddr *) &addr, &addrsize) == -1,
2938 "recvfrom should have failed\n");
2939 err = WSAGetLastError();
2940 ok(err == WSAEINVAL, "expected 10022, received %d\n", err);
2943 closesocket(dupsock);
2944 closesocket(source);
2947 static void test_WSAEnumNetworkEvents(void)
2949 SOCKET s, s2;
2950 int sock_type[] = {SOCK_STREAM, SOCK_DGRAM, SOCK_STREAM}, i, j, k, l;
2951 struct sockaddr_in address;
2952 HANDLE event;
2953 WSANETWORKEVENTS net_events;
2954 /* Windows 2000 Pro without SP installed (testbot) will crash if
2955 * WSAEnumNetworkEvents have a NULL event, so skip this test in <= 2000 */
2956 DWORD ver = GetVersion() & 0xFFFF;
2957 BOOL supports_null = ((ver & 0xFF) << 8 | (ver >> 8)) > 0x0500;
2959 memset(&address, 0, sizeof(address));
2960 address.sin_addr.s_addr = htonl(INADDR_ANY);
2961 address.sin_family = AF_INET;
2963 /* This test follows the steps from bugs 10204 and 24946 */
2964 for (l = 0; l < 2; l++)
2966 if (l == 1 && !supports_null && broken(1)) continue;
2968 for (i = 0; i < sizeof(sock_type) / sizeof(sock_type[0]); i++)
2970 if (i == 2)
2971 ok(!tcp_socketpair(&s, &s2), "Test[%d]: creating socket pair failed\n", i);
2972 else
2974 s = socket(AF_INET, sock_type[i], 0);
2975 ok (s != SOCKET_ERROR, "Test[%d]: failed to create socket\n", i);
2976 ok (!bind(s, (struct sockaddr*) &address, sizeof(address)), "Test[%d]: bind failed\n", i);
2978 event = WSACreateEvent();
2979 ok (event != NULL, "Test[%d]: failed to create event\n", i);
2980 for (j = 0; j < 5; j++) /* Repeat sometimes and the result must be the same */
2982 /* When the TCP socket is not connected NO events will be returned.
2983 * When connected and no data pending it will get the write event.
2984 * UDP sockets don't have connections so as soon as they are bound
2985 * they can read/write data. Since nobody is sendind us data only
2986 * the write event will be returned and ONLY once.
2988 ok (!WSAEventSelect(s, event, FD_READ | FD_WRITE), "Test[%d]: WSAEventSelect failed\n", i);
2989 memset(&net_events, 0xAB, sizeof(net_events));
2990 ok (!WSAEnumNetworkEvents(s, l == 0 ? event : NULL, &net_events),
2991 "Test[%d]: WSAEnumNetworkEvents failed\n", i);
2992 if (i >= 1 && j == 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
2994 todo_wine_if (i == 0) /* Remove when fixed */
2995 ok (net_events.lNetworkEvents == FD_WRITE, "Test[%d]: expected 2, got %d\n",
2996 i, net_events.lNetworkEvents);
2998 else
3000 todo_wine_if (i != 0) /* Remove when fixed */
3001 ok (net_events.lNetworkEvents == 0, "Test[%d]: expected 0, got %d\n",
3002 i, net_events.lNetworkEvents);
3004 for (k = 0; k < FD_MAX_EVENTS; k++)
3006 if (i >= 1 && j == 0 && k == 1) /* first UDP and connected TCP test, FD_WRITE bit no error*/
3008 ok (net_events.iErrorCode[k] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
3009 i, k, net_events.iErrorCode[k]);
3011 else
3013 /* Bits that are not set in lNetworkEvents MUST not be changed */
3014 todo_wine
3015 ok (net_events.iErrorCode[k] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
3016 i, k, net_events.iErrorCode[k]);
3020 closesocket(s);
3021 WSACloseEvent(event);
3022 if (i == 2) closesocket(s2);
3027 static void test_WSAAddressToStringA(void)
3029 SOCKET v6 = INVALID_SOCKET;
3030 INT ret;
3031 DWORD len;
3032 int GLE;
3033 SOCKADDR_IN sockaddr;
3034 CHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3036 CHAR expect1[] = "0.0.0.0";
3037 CHAR expect2[] = "255.255.255.255";
3038 CHAR expect3[] = "0.0.0.0:65535";
3039 CHAR expect4[] = "255.255.255.255:65535";
3041 SOCKADDR_IN6 sockaddr6;
3042 CHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3044 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3045 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3046 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3048 CHAR expect6_1[] = "::1";
3049 CHAR expect6_2[] = "20ab::1";
3050 CHAR expect6_3[] = "[20ab::2001]:33274";
3051 CHAR expect6_3_nt[] = "20ab::2001@33274";
3052 CHAR expect6_3_w2k[] = "20ab::2001";
3053 CHAR expect6_3_2[] = "[20ab::2001%4660]:33274";
3054 CHAR expect6_3_2_nt[] = "4660/20ab::2001@33274";
3055 CHAR expect6_3_2_w2k[] = "20ab::2001%4660";
3056 CHAR expect6_3_3[] = "20ab::2001%4660";
3057 CHAR expect6_3_3_nt[] = "4660/20ab::2001";
3059 len = 0;
3061 sockaddr.sin_family = AF_INET;
3062 sockaddr.sin_port = 0;
3063 sockaddr.sin_addr.s_addr = 0;
3065 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3066 GLE = WSAGetLastError();
3067 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0),
3068 "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3069 GLE, ret );
3071 len = sizeof(address);
3073 sockaddr.sin_family = AF_INET;
3074 sockaddr.sin_port = 0;
3075 sockaddr.sin_addr.s_addr = 0;
3077 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3078 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3080 ok( !strcmp( address, expect1 ), "Expected: %s, got: %s\n", expect1, address );
3081 ok( len == sizeof( expect1 ), "Got size %d\n", len);
3083 len = sizeof(address);
3085 sockaddr.sin_family = AF_INET;
3086 sockaddr.sin_port = 0;
3087 sockaddr.sin_addr.s_addr = 0xffffffff;
3089 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3090 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3092 ok( !strcmp( address, expect2 ), "Expected: %s, got: %s\n", expect2, address );
3094 len = sizeof(address);
3096 sockaddr.sin_family = AF_INET;
3097 sockaddr.sin_port = 0xffff;
3098 sockaddr.sin_addr.s_addr = 0;
3100 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3101 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3103 ok( !strcmp( address, expect3 ), "Expected: %s, got: %s\n", expect3, address );
3105 len = sizeof(address);
3107 sockaddr.sin_family = AF_INET;
3108 sockaddr.sin_port = 0xffff;
3109 sockaddr.sin_addr.s_addr = 0xffffffff;
3111 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3112 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3114 ok( !strcmp( address, expect4 ), "Expected: %s, got: %s\n", expect4, address );
3115 ok( len == sizeof( expect4 ), "Got size %d\n", len);
3117 /*check to see it IPv6 is available */
3118 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
3119 if (v6 == INVALID_SOCKET) {
3120 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3121 WSAGetLastError(), WSAEAFNOSUPPORT);
3122 goto end;
3124 /* Test a short IPv6 address */
3125 len = sizeof(address6);
3127 sockaddr6.sin6_family = AF_INET6;
3128 sockaddr6.sin6_port = 0x0000;
3129 sockaddr6.sin6_scope_id = 0;
3130 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
3132 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3133 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3134 ok( !strcmp( address6, expect6_1 ), "Expected: %s, got: %s\n", expect6_1, address6 );
3135 ok( len == sizeof(expect6_1), "Got size %d\n", len);
3137 /* Test a longer IPv6 address */
3138 len = sizeof(address6);
3140 sockaddr6.sin6_family = AF_INET6;
3141 sockaddr6.sin6_port = 0x0000;
3142 sockaddr6.sin6_scope_id = 0;
3143 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
3145 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3146 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3147 ok( !strcmp( address6, expect6_2 ), "Expected: %s, got: %s\n", expect6_2, address6 );
3148 ok( len == sizeof(expect6_2), "Got size %d\n", len);
3150 /* Test IPv6 address and port number */
3151 len = sizeof(address6);
3153 sockaddr6.sin6_family = AF_INET6;
3154 sockaddr6.sin6_port = 0xfa81;
3155 sockaddr6.sin6_scope_id = 0;
3156 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3158 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3159 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3160 ok( !strcmp( address6, expect6_3 ) ||
3161 broken( !strcmp( address6, expect6_3_nt ) ) || /* NT4 */
3162 broken( !strcmp( address6, expect6_3_w2k ) ), /* Win2000 */
3163 "Expected: %s, got: %s\n", expect6_3, address6 );
3164 ok( len == sizeof(expect6_3) ||
3165 broken( len == sizeof(expect6_3_nt) ) || /* NT4 */
3166 broken( len == sizeof(expect6_3_w2k) ), /* Win2000 */
3167 "Got size %d\n", len);
3169 /* Test IPv6 address, port number and scope_id */
3170 len = sizeof(address6);
3172 sockaddr6.sin6_family = AF_INET6;
3173 sockaddr6.sin6_port = 0xfa81;
3174 sockaddr6.sin6_scope_id = 0x1234;
3175 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3177 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3178 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3179 ok( !strcmp( address6, expect6_3_2 ) ||
3180 broken( !strcmp( address6, expect6_3_2_nt ) ) || /* NT4 */
3181 broken( !strcmp( address6, expect6_3_2_w2k ) ), /* Win2000 */
3182 "Expected: %s, got: %s\n", expect6_3_2, address6 );
3183 ok( len == sizeof(expect6_3_2) ||
3184 broken( len == sizeof(expect6_3_2_nt) ) || /* NT4 */
3185 broken( len == sizeof(expect6_3_2_w2k) ), /* Win2000 */
3186 "Got size %d\n", len);
3188 /* Test IPv6 address and scope_id */
3189 len = sizeof(address6);
3191 sockaddr6.sin6_family = AF_INET6;
3192 sockaddr6.sin6_port = 0x0000;
3193 sockaddr6.sin6_scope_id = 0x1234;
3194 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3196 ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3197 ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3198 ok( !strcmp( address6, expect6_3_3 ) ||
3199 broken( !strcmp( address6, expect6_3_3_nt ) ), /* NT4 */
3200 "Expected: %s, got: %s\n", expect6_3_3, address6 );
3201 ok( len == sizeof(expect6_3_3) ||
3202 broken( len == sizeof(expect6_3_3_nt) ), /* NT4 */
3203 "Got size %d\n", len);
3205 end:
3206 if (v6 != INVALID_SOCKET)
3207 closesocket(v6);
3210 static void test_WSAAddressToStringW(void)
3212 SOCKET v6 = INVALID_SOCKET;
3213 INT ret;
3214 DWORD len;
3215 int GLE;
3216 SOCKADDR_IN sockaddr;
3217 WCHAR address[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3219 WCHAR expect1[] = { '0','.','0','.','0','.','0', 0 };
3220 WCHAR expect2[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3221 WCHAR expect3[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
3222 WCHAR expect4[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3223 '6', '5', '5', '3', '5', 0 };
3225 SOCKADDR_IN6 sockaddr6;
3226 WCHAR address6[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3228 CHAR addr6_1[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3229 CHAR addr6_2[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3230 CHAR addr6_3[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3232 WCHAR expect6_1[] = {':',':','1',0};
3233 WCHAR expect6_2[] = {'2','0','a','b',':',':','1',0};
3234 WCHAR expect6_3[] = {'[','2','0','a','b',':',':','2','0','0','1',']',':','3','3','2','7','4',0};
3235 WCHAR expect6_3_nt[] = {'2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3236 WCHAR expect6_3_w2k[] = {'2','0','a','b',':',':','2','0','0','1',0};
3237 WCHAR expect6_3_2[] = {'[','2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',']',':','3','3','2','7','4',0};
3238 WCHAR expect6_3_2_nt[] = {'4','6','6','0','/','2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3239 WCHAR expect6_3_2_w2k[] = {'2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',0};
3240 WCHAR expect6_3_3[] = {'2','0','a','b',':',':','2','0','0','1','%','6','5','5','3','4',0};
3241 WCHAR expect6_3_3_nt[] = {'6','5','5','3','4','/','2','0','a','b',':',':','2','0','0','1',0};
3243 len = 0;
3245 sockaddr.sin_family = AF_INET;
3246 sockaddr.sin_port = 0;
3247 sockaddr.sin_addr.s_addr = 0;
3249 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3250 GLE = WSAGetLastError();
3251 ok( (ret == SOCKET_ERROR && GLE == WSAEFAULT) || (ret == 0),
3252 "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3253 GLE, ret );
3255 len = sizeof(address);
3257 sockaddr.sin_family = AF_INET;
3258 sockaddr.sin_port = 0;
3259 sockaddr.sin_addr.s_addr = 0;
3261 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3262 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3264 ok( !lstrcmpW( address, expect1 ), "Expected different address string\n" );
3265 ok( len == sizeof( expect1 )/sizeof( WCHAR ), "Got size %d\n", len);
3267 len = sizeof(address);
3269 sockaddr.sin_family = AF_INET;
3270 sockaddr.sin_port = 0;
3271 sockaddr.sin_addr.s_addr = 0xffffffff;
3273 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3274 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3276 ok( !lstrcmpW( address, expect2 ), "Expected different address string\n" );
3278 len = sizeof(address);
3280 sockaddr.sin_family = AF_INET;
3281 sockaddr.sin_port = 0xffff;
3282 sockaddr.sin_addr.s_addr = 0;
3284 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3285 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3287 ok( !lstrcmpW( address, expect3 ), "Expected different address string\n" );
3289 len = sizeof(address);
3291 sockaddr.sin_family = AF_INET;
3292 sockaddr.sin_port = 0xffff;
3293 sockaddr.sin_addr.s_addr = 0xffffffff;
3295 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, address, &len );
3296 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3298 ok( !lstrcmpW( address, expect4 ), "Expected different address string\n" );
3299 ok( len == sizeof( expect4 )/sizeof( WCHAR ), "Got %d\n", len);
3301 /*check to see it IPv6 is available */
3302 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
3303 if (v6 == INVALID_SOCKET) {
3304 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3305 WSAGetLastError(), WSAEAFNOSUPPORT);
3306 goto end;
3309 /* Test a short IPv6 address */
3310 len = sizeof(address6)/sizeof(WCHAR);
3312 sockaddr6.sin6_family = AF_INET6;
3313 sockaddr6.sin6_port = 0x0000;
3314 sockaddr6.sin6_scope_id = 0;
3315 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
3317 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3318 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3319 ok( !lstrcmpW( address6, expect6_1 ), "Wrong string returned\n" );
3320 ok( len == sizeof(expect6_1)/sizeof(WCHAR), "Got %d\n", len);
3322 /* Test a longer IPv6 address */
3323 len = sizeof(address6)/sizeof(WCHAR);
3325 sockaddr6.sin6_family = AF_INET6;
3326 sockaddr6.sin6_port = 0x0000;
3327 sockaddr6.sin6_scope_id = 0;
3328 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
3330 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3331 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3333 ok( !lstrcmpW( address6, expect6_2 ), "Wrong string returned\n" );
3334 ok( len == sizeof(expect6_2)/sizeof(WCHAR), "Got %d\n", len);
3336 /* Test IPv6 address and port number */
3337 len = sizeof(address6)/sizeof(WCHAR);
3339 sockaddr6.sin6_family = AF_INET6;
3340 sockaddr6.sin6_port = 0xfa81;
3341 sockaddr6.sin6_scope_id = 0;
3342 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3344 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3345 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3346 ok( !lstrcmpW( address6, expect6_3 ) ||
3347 broken( !lstrcmpW( address6, expect6_3_nt ) ) || /* NT4 */
3348 broken( !lstrcmpW( address6, expect6_3_w2k ) ), /* Win2000 */
3349 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3),
3350 wine_dbgstr_w(address6) );
3351 ok( len == sizeof(expect6_3)/sizeof(WCHAR) ||
3352 broken(len == sizeof(expect6_3_nt)/sizeof(WCHAR) ) || /* NT4 */
3353 broken(len == sizeof(expect6_3_w2k)/sizeof(WCHAR) ), /* Win2000 */
3354 "Got %d\n", len);
3356 /* Test IPv6 address, port number and scope_id */
3357 len = sizeof(address6)/sizeof(WCHAR);
3359 sockaddr6.sin6_family = AF_INET6;
3360 sockaddr6.sin6_port = 0xfa81;
3361 sockaddr6.sin6_scope_id = 0x1234;
3362 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3364 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3365 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3366 ok( !lstrcmpW( address6, expect6_3_2 ) ||
3367 broken( !lstrcmpW( address6, expect6_3_2_nt ) ) || /* NT4 */
3368 broken( !lstrcmpW( address6, expect6_3_2_w2k ) ), /* Win2000 */
3369 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_2),
3370 wine_dbgstr_w(address6) );
3371 ok( len == sizeof(expect6_3_2)/sizeof(WCHAR) ||
3372 broken( len == sizeof(expect6_3_2_nt)/sizeof(WCHAR) ) || /* NT4 */
3373 broken( len == sizeof(expect6_3_2_w2k)/sizeof(WCHAR) ), /* Win2000 */
3374 "Got %d\n", len);
3376 /* Test IPv6 address and scope_id */
3377 len = sizeof(address6)/sizeof(WCHAR);
3379 sockaddr6.sin6_family = AF_INET6;
3380 sockaddr6.sin6_port = 0x0000;
3381 sockaddr6.sin6_scope_id = 0xfffe;
3382 memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
3384 ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
3385 ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3386 ok( !lstrcmpW( address6, expect6_3_3 ) ||
3387 broken( !lstrcmpW( address6, expect6_3_3_nt ) ), /* NT4 */
3388 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_3),
3389 wine_dbgstr_w(address6) );
3390 ok( len == sizeof(expect6_3_3)/sizeof(WCHAR) ||
3391 broken( len == sizeof(expect6_3_3_nt)/sizeof(WCHAR) ), /* NT4 */
3392 "Got %d\n", len);
3394 end:
3395 if (v6 != INVALID_SOCKET)
3396 closesocket(v6);
3399 static void test_WSAStringToAddressA(void)
3401 INT ret, len;
3402 SOCKADDR_IN sockaddr;
3403 SOCKADDR_IN6 sockaddr6;
3404 int GLE;
3406 CHAR address1[] = "0.0.0.0";
3407 CHAR address2[] = "127.127.127.127";
3408 CHAR address3[] = "255.255.255.255";
3409 CHAR address4[] = "127.127.127.127:65535";
3410 CHAR address5[] = "255.255.255.255:65535";
3411 CHAR address6[] = "::1";
3412 CHAR address7[] = "[::1]";
3413 CHAR address8[] = "[::1]:65535";
3414 CHAR address9[] = "2001::1";
3416 len = 0;
3417 sockaddr.sin_family = AF_INET;
3419 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3420 ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
3421 WSAGetLastError() );
3423 len = sizeof(sockaddr);
3424 sockaddr.sin_port = 0;
3425 sockaddr.sin_addr.s_addr = 0;
3427 ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3428 ok( !ret && sockaddr.sin_addr.s_addr == 0,
3429 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3431 len = sizeof(sockaddr);
3432 sockaddr.sin_port = 0;
3433 sockaddr.sin_addr.s_addr = 0;
3435 ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3436 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
3437 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3439 len = sizeof(sockaddr);
3440 sockaddr.sin_port = 0;
3441 sockaddr.sin_addr.s_addr = 0;
3443 ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3444 GLE = WSAGetLastError();
3445 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
3446 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3447 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
3449 len = sizeof(sockaddr);
3450 sockaddr.sin_port = 0;
3451 sockaddr.sin_addr.s_addr = 0;
3453 ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3454 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
3455 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3457 len = sizeof(sockaddr);
3458 sockaddr.sin_port = 0;
3459 sockaddr.sin_addr.s_addr = 0;
3461 ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3462 GLE = WSAGetLastError();
3463 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
3464 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3465 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
3467 len = sizeof(sockaddr);
3469 ret = WSAStringToAddressA( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3470 GLE = WSAGetLastError();
3471 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3472 "WSAStringToAddressA() should have failed with %d\n", GLE );
3474 len = sizeof(sockaddr6);
3475 memset(&sockaddr6, 0, len);
3476 sockaddr6.sin6_family = AF_INET6;
3478 ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3479 &len );
3480 if (ret == SOCKET_ERROR)
3482 win_skip("IPv6 not supported\n");
3483 return;
3486 GLE = WSAGetLastError();
3487 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3489 len = sizeof(sockaddr6);
3490 memset(&sockaddr6, 0, len);
3491 sockaddr6.sin6_family = AF_INET6;
3493 ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3494 &len );
3495 GLE = WSAGetLastError();
3496 ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3498 len = sizeof(sockaddr6);
3499 memset(&sockaddr6, 0, len);
3500 sockaddr6.sin6_family = AF_INET6;
3502 ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3503 &len );
3504 GLE = WSAGetLastError();
3505 ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
3506 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
3508 len = sizeof(sockaddr6);
3510 ret = WSAStringToAddressA( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3511 GLE = WSAGetLastError();
3512 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3513 "WSAStringToAddressW() should have failed with %d\n", GLE );
3515 len = sizeof(sockaddr6);
3517 ret = WSAStringToAddressA( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3518 GLE = WSAGetLastError();
3519 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3520 "WSAStringToAddressW() should have failed with %d\n", GLE );
3523 static void test_WSAStringToAddressW(void)
3525 INT ret, len;
3526 SOCKADDR_IN sockaddr, *sin;
3527 SOCKADDR_IN6 sockaddr6;
3528 SOCKADDR_STORAGE sockaddr_storage;
3529 int GLE;
3531 WCHAR address1[] = { '0','.','0','.','0','.','0', 0 };
3532 WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
3533 WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3534 WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
3535 ':', '6', '5', '5', '3', '5', 0 };
3536 WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3537 '6', '5', '5', '3', '5', 0 };
3538 WCHAR address6[] = {':',':','1','\0'};
3539 WCHAR address7[] = {'[',':',':','1',']','\0'};
3540 WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
3541 WCHAR address9[] = {'2','0','0','1',':',':','1','\0'};
3543 len = 0;
3544 sockaddr.sin_family = AF_INET;
3546 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3547 ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n",
3548 WSAGetLastError() );
3550 len = sizeof(sockaddr);
3551 sockaddr.sin_port = 0;
3552 sockaddr.sin_addr.s_addr = 0;
3554 ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3555 ok( !ret && sockaddr.sin_addr.s_addr == 0,
3556 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3558 len = sizeof(sockaddr);
3559 sockaddr.sin_port = 0;
3560 sockaddr.sin_addr.s_addr = 0;
3562 ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3563 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
3564 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3566 len = sizeof(sockaddr);
3567 sockaddr.sin_port = 0;
3568 sockaddr.sin_addr.s_addr = 0;
3570 ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3571 GLE = WSAGetLastError();
3572 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
3573 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3574 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3576 len = sizeof(sockaddr);
3577 sockaddr.sin_port = 0;
3578 sockaddr.sin_addr.s_addr = 0;
3580 ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3581 ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
3582 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3584 len = sizeof(sockaddr);
3585 sockaddr.sin_port = 0;
3586 sockaddr.sin_addr.s_addr = 0;
3588 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3589 ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
3590 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3591 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3593 /* Test with a larger buffer than necessary */
3594 len = sizeof(sockaddr_storage);
3595 sin = (SOCKADDR_IN *)&sockaddr_storage;
3596 sin->sin_port = 0;
3597 sin->sin_addr.s_addr = 0;
3599 ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len );
3600 ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) ||
3601 (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
3602 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
3603 ok( len == sizeof(SOCKADDR_IN) ||
3604 broken(len == sizeof(SOCKADDR_STORAGE)) /* NT4/2k */,
3605 "unexpected length %d\n", len );
3607 len = sizeof(sockaddr);
3609 ret = WSAStringToAddressW( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
3610 GLE = WSAGetLastError();
3611 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3612 "WSAStringToAddressW() should have failed with %d\n", GLE );
3614 len = sizeof(sockaddr6);
3615 memset(&sockaddr6, 0, len);
3616 sockaddr6.sin6_family = AF_INET6;
3618 ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3619 &len );
3620 if (ret == SOCKET_ERROR)
3622 win_skip("IPv6 not supported\n");
3623 return;
3626 GLE = WSAGetLastError();
3627 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3629 len = sizeof(sockaddr6);
3630 memset(&sockaddr6, 0, len);
3631 sockaddr6.sin6_family = AF_INET6;
3633 ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3634 &len );
3635 GLE = WSAGetLastError();
3636 ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3638 len = sizeof(sockaddr6);
3639 memset(&sockaddr6, 0, len);
3640 sockaddr6.sin6_family = AF_INET6;
3642 ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
3643 &len );
3644 GLE = WSAGetLastError();
3645 ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
3646 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
3648 len = sizeof(sockaddr6);
3650 ret = WSAStringToAddressW( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3651 GLE = WSAGetLastError();
3652 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3653 "WSAStringToAddressW() should have failed with %d\n", GLE );
3655 len = sizeof(sockaddr6);
3657 ret = WSAStringToAddressW( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
3658 GLE = WSAGetLastError();
3659 ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
3660 "WSAStringToAddressW() should have failed with %d\n", GLE );
3663 static DWORD WINAPI SelectReadThread(void *param)
3665 select_thread_params *par = param;
3666 fd_set readfds;
3667 int ret;
3668 struct sockaddr_in addr;
3669 struct timeval select_timeout;
3671 FD_ZERO(&readfds);
3672 FD_SET(par->s, &readfds);
3673 select_timeout.tv_sec=5;
3674 select_timeout.tv_usec=0;
3675 addr.sin_family = AF_INET;
3676 addr.sin_addr.s_addr = inet_addr(SERVERIP);
3677 addr.sin_port = htons(SERVERPORT);
3679 do_bind(par->s, (struct sockaddr *)&addr, sizeof(addr));
3680 wsa_ok(listen(par->s, SOMAXCONN ), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
3682 SetEvent(server_ready);
3683 ret = select(par->s+1, &readfds, NULL, NULL, &select_timeout);
3684 par->ReadKilled = (ret == 1);
3686 return 0;
3689 static DWORD WINAPI SelectCloseThread(void *param)
3691 SOCKET s = *(SOCKET*)param;
3692 Sleep(500);
3693 closesocket(s);
3694 return 0;
3697 static void test_errors(void)
3699 SOCKET sock;
3700 SOCKADDR_IN SockAddr;
3701 int ret, err;
3703 WSASetLastError(NO_ERROR);
3704 sock = socket(PF_INET, SOCK_STREAM, 0);
3705 ok( (sock != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3706 memset(&SockAddr, 0, sizeof(SockAddr));
3707 SockAddr.sin_family = AF_INET;
3708 SockAddr.sin_port = htons(6924);
3709 SockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
3711 ret = connect(sock, (PSOCKADDR)&SockAddr, sizeof(SockAddr));
3712 ok( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got: %d\n", ret );
3713 if (ret == SOCKET_ERROR)
3715 err = WSAGetLastError();
3716 ok( (err == WSAECONNREFUSED), "expected WSAECONNREFUSED, got: %d\n", err );
3720 TIMEVAL timeval;
3721 fd_set set = {1, {sock}};
3723 timeval.tv_sec = 0;
3724 timeval.tv_usec = 50000;
3726 ret = select(1, NULL, &set, NULL, &timeval);
3727 ok( (ret == 0), "expected 0 (timeout), got: %d\n", ret );
3730 ret = closesocket(sock);
3731 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
3734 static void test_listen(void)
3736 SOCKET fdA, fdB;
3737 int ret, acceptc, olen = sizeof(acceptc);
3738 struct sockaddr_in address;
3740 memset(&address, 0, sizeof(address));
3741 address.sin_addr.s_addr = inet_addr("127.0.0.1");
3742 address.sin_family = AF_INET;
3743 address.sin_port = htons(SERVERPORT);
3745 /* invalid socket tests */
3746 SetLastError(0xdeadbeef);
3747 ok ((listen(0, 0) == SOCKET_ERROR), "listen did not fail\n");
3748 ret = WSAGetLastError();
3749 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret);
3751 SetLastError(0xdeadbeef);
3752 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR), "listen did not fail\n");
3753 ret = WSAGetLastError();
3754 ok (ret == WSAENOTSOCK, "expected 10038, received %d\n", ret);
3756 /* tcp tests */
3757 fdA = socket(AF_INET, SOCK_STREAM, 0);
3758 ok ((fdA != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3760 fdB = socket(AF_INET, SOCK_STREAM, 0);
3761 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3763 SetLastError(0xdeadbeef);
3764 ok ((listen(fdA, -2) == SOCKET_ERROR), "listen did not fail\n");
3765 ret = WSAGetLastError();
3766 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3768 SetLastError(0xdeadbeef);
3769 ok ((listen(fdA, 1) == SOCKET_ERROR), "listen did not fail\n");
3770 ret = WSAGetLastError();
3771 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3773 SetLastError(0xdeadbeef);
3774 ok ((listen(fdA, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3775 ret = WSAGetLastError();
3776 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3778 ok (!bind(fdA, (struct sockaddr*) &address, sizeof(address)), "bind failed\n");
3780 SetLastError(0xdeadbeef);
3781 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n");
3782 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3784 acceptc = 0xdead;
3785 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen);
3786 ok (!ret, "getsockopt failed\n");
3787 ok (acceptc == 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc);
3789 ok (!listen(fdA, 0), "listen failed\n");
3790 ok (!listen(fdA, SOMAXCONN), "double listen failed\n");
3792 acceptc = 0xdead;
3793 ret = getsockopt(fdA, SOL_SOCKET, SO_ACCEPTCONN, (char*)&acceptc, &olen);
3794 ok (!ret, "getsockopt failed\n");
3795 ok (acceptc == 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc);
3797 SetLastError(0xdeadbeef);
3798 ok ((listen(fdB, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3799 ret = WSAGetLastError();
3800 ok (ret == WSAEINVAL, "expected 10022, received %d\n", ret);
3802 ret = closesocket(fdB);
3803 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3805 fdB = socket(AF_INET, SOCK_STREAM, 0);
3806 ok ((fdB != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3808 SetLastError(0xdeadbeef);
3809 ok (bind(fdB, (struct sockaddr*) &address, sizeof(address)), "bind should have failed\n");
3810 ret = WSAGetLastError();
3811 ok (ret == WSAEADDRINUSE, "expected 10048, received %d\n", ret);
3813 ret = closesocket(fdA);
3814 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3815 ret = closesocket(fdB);
3816 ok (ret == 0, "closesocket failed unexpectedly: %d\n", ret);
3819 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
3820 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
3821 static void test_select(void)
3823 static char tmp_buf[1024];
3825 SOCKET fdListen, fdRead, fdWrite;
3826 fd_set readfds, writefds, exceptfds;
3827 unsigned int maxfd;
3828 int ret, len;
3829 char buffer;
3830 struct timeval select_timeout;
3831 struct sockaddr_in address;
3832 select_thread_params thread_params;
3833 HANDLE thread_handle;
3834 DWORD ticks, id;
3836 fdRead = socket(AF_INET, SOCK_STREAM, 0);
3837 ok( (fdRead != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3838 fdWrite = socket(AF_INET, SOCK_STREAM, 0);
3839 ok( (fdWrite != INVALID_SOCKET), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3841 maxfd = fdRead;
3842 if (fdWrite > maxfd)
3843 maxfd = fdWrite;
3845 FD_ZERO_ALL();
3846 FD_SET_ALL(fdRead);
3847 FD_SET_ALL(fdWrite);
3848 select_timeout.tv_sec=0;
3849 select_timeout.tv_usec=0;
3851 ticks = GetTickCount();
3852 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3853 ticks = GetTickCount() - ticks;
3854 ok(ret == 0, "select should not return any socket handles\n");
3855 ok(ticks < 10, "select was blocking for %u ms, expected < 10 ms\n", ticks);
3856 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3857 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
3858 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3859 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
3861 FD_ZERO_ALL();
3862 FD_SET_ALL(fdRead);
3863 FD_SET_ALL(fdWrite);
3864 select_timeout.tv_sec=0;
3865 select_timeout.tv_usec=500;
3867 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3868 ok(ret == 0, "select should not return any socket handles\n");
3869 ok(!FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3870 ok(!FD_ISSET(fdWrite, &writefds), "FD should not be set\n");
3871 ok(!FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3872 ok(!FD_ISSET(fdWrite, &exceptfds), "FD should not be set\n");
3874 ok ((listen(fdWrite, SOMAXCONN) == SOCKET_ERROR), "listen did not fail\n");
3875 ret = closesocket(fdWrite);
3876 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
3878 thread_params.s = fdRead;
3879 thread_params.ReadKilled = FALSE;
3880 server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
3881 thread_handle = CreateThread (NULL, 0, SelectReadThread, &thread_params, 0, &id );
3882 ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError());
3884 WaitForSingleObject (server_ready, INFINITE);
3885 Sleep(200);
3886 ret = closesocket(fdRead);
3887 ok ( (ret == 0), "closesocket failed unexpectedly: %d\n", ret);
3889 WaitForSingleObject (thread_handle, 1000);
3890 ok ( (thread_params.ReadKilled) ||
3891 broken(thread_params.ReadKilled == 0), /*Win98*/
3892 "closesocket did not wakeup select\n");
3893 ret = recv(fdRead, &buffer, 1, MSG_PEEK);
3894 ok( (ret == -1), "peek at closed socket expected -1 got %d\n", ret);
3896 /* Test selecting invalid handles */
3897 FD_ZERO_ALL();
3899 SetLastError(0);
3900 ret = select(maxfd+1, 0, 0, 0, &select_timeout);
3901 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3902 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3904 SetLastError(0);
3905 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3906 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3907 ok ( WSAGetLastError() == WSAEINVAL, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3909 FD_SET(INVALID_SOCKET, &readfds);
3910 SetLastError(0);
3911 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3912 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3913 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3914 ok ( !FD_ISSET(fdRead, &readfds), "FD should not be set\n");
3916 FD_ZERO(&readfds);
3917 FD_SET(INVALID_SOCKET, &writefds);
3918 SetLastError(0);
3919 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3920 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3921 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3922 ok ( !FD_ISSET(fdRead, &writefds), "FD should not be set\n");
3924 FD_ZERO(&writefds);
3925 FD_SET(INVALID_SOCKET, &exceptfds);
3926 SetLastError(0);
3927 ret = select(maxfd+1, &readfds, &writefds, &exceptfds, &select_timeout);
3928 ok ( (ret == SOCKET_ERROR), "expected SOCKET_ERROR, got %i\n", ret);
3929 ok ( WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3930 ok ( !FD_ISSET(fdRead, &exceptfds), "FD should not be set\n");
3932 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
3933 maxfd = fdRead;
3934 if(fdWrite > maxfd) maxfd = fdWrite;
3936 FD_ZERO(&readfds);
3937 FD_SET(fdRead, &readfds);
3938 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
3939 ok(!ret, "select returned %d\n", ret);
3941 FD_ZERO(&writefds);
3942 FD_SET(fdWrite, &writefds);
3943 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
3944 ok(ret == 1, "select returned %d\n", ret);
3945 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
3947 /* tests for overlapping fd_set pointers */
3948 FD_ZERO(&readfds);
3949 FD_SET(fdWrite, &readfds);
3950 ret = select(fdWrite+1, &readfds, &readfds, NULL, &select_timeout);
3951 ok(ret == 1, "select returned %d\n", ret);
3952 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3954 FD_ZERO(&readfds);
3955 FD_SET(fdWrite, &readfds);
3956 FD_SET(fdRead, &readfds);
3957 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3958 ok(ret == 2, "select returned %d\n", ret);
3959 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3960 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3962 ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n");
3963 FD_ZERO(&readfds);
3964 FD_SET(fdRead, &readfds);
3965 ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout);
3966 ok(ret == 1, "select returned %d\n", ret);
3967 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3969 FD_ZERO(&readfds);
3970 FD_SET(fdWrite, &readfds);
3971 FD_SET(fdRead, &readfds);
3972 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3973 ok(ret == 2, "select returned %d\n", ret);
3974 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
3975 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3977 while(1) {
3978 FD_ZERO(&writefds);
3979 FD_SET(fdWrite, &writefds);
3980 ret = select(fdWrite+1, NULL, &writefds, NULL, &select_timeout);
3981 if(!ret) break;
3982 ok(send(fdWrite, tmp_buf, sizeof(tmp_buf), 0) > 0, "failed to send data\n");
3984 FD_ZERO(&readfds);
3985 FD_SET(fdWrite, &readfds);
3986 FD_SET(fdRead, &readfds);
3987 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3988 ok(ret == 1, "select returned %d\n", ret);
3989 ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n");
3990 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
3992 ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n");
3993 Sleep(100);
3994 FD_ZERO(&readfds);
3995 FD_SET(fdWrite, &readfds);
3996 FD_SET(fdRead, &readfds);
3997 ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout);
3998 ok(ret == 2, "select returned %d\n", ret);
3999 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
4000 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
4002 closesocket(fdRead);
4003 closesocket(fdWrite);
4005 /* select() works in 3 distinct states:
4006 * - to check if a connection attempt ended with success or error;
4007 * - to check if a pending connection is waiting for acceptance;
4008 * - to check for data to read, availability for write and OOB data
4010 * The tests below ensure that all conditions are tested.
4012 memset(&address, 0, sizeof(address));
4013 address.sin_addr.s_addr = inet_addr("127.0.0.1");
4014 address.sin_family = AF_INET;
4015 len = sizeof(address);
4016 fdListen = setup_server_socket(&address, &len);
4017 select_timeout.tv_sec = 1;
4018 select_timeout.tv_usec = 250000;
4020 /* When no events are pending select returns 0 with no error */
4021 FD_ZERO_ALL();
4022 FD_SET_ALL(fdListen);
4023 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4024 ok(ret == 0, "expected 0, got %d\n", ret);
4026 /* When a socket is attempting to connect the listening socket receives the read descriptor */
4027 fdWrite = setup_connector_socket(&address, len, TRUE);
4028 FD_ZERO_ALL();
4029 FD_SET_ALL(fdListen);
4030 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4031 ok(ret == 1, "expected 1, got %d\n", ret);
4032 ok(FD_ISSET(fdListen, &readfds), "fdListen socket is not in the set\n");
4033 len = sizeof(address);
4034 fdRead = accept(fdListen, (struct sockaddr*) &address, &len);
4035 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n");
4037 /* The connector is signaled through the write descriptor */
4038 FD_ZERO_ALL();
4039 FD_SET_ALL(fdListen);
4040 FD_SET_ALL(fdRead);
4041 FD_SET_ALL(fdWrite);
4042 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4043 ok(ret == 2, "expected 2, got %d\n", ret);
4044 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
4045 ok(FD_ISSET(fdRead, &writefds), "fdRead socket is not in the set\n");
4046 len = sizeof(id);
4047 id = 0xdeadbeef;
4048 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
4049 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
4050 ok(id == 0, "expected 0, got %d\n", id);
4052 /* When data is received the receiver gets the read descriptor */
4053 ret = send(fdWrite, "1234", 4, 0);
4054 ok(ret == 4, "expected 4, got %d\n", ret);
4055 FD_ZERO_ALL();
4056 FD_SET_ALL(fdListen);
4057 FD_SET(fdRead, &readfds);
4058 FD_SET(fdRead, &exceptfds);
4059 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4060 ok(ret == 1, "expected 1, got %d\n", ret);
4061 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
4062 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
4063 ok(ret == 4, "expected 4, got %d\n", ret);
4064 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n");
4066 /* When OOB data is received the socket is set in the except descriptor */
4067 ret = send(fdWrite, "A", 1, MSG_OOB);
4068 ok(ret == 1, "expected 1, got %d\n", ret);
4069 FD_ZERO_ALL();
4070 FD_SET_ALL(fdListen);
4071 FD_SET(fdRead, &readfds);
4072 FD_SET(fdRead, &exceptfds);
4073 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4074 ok(ret == 1, "expected 1, got %d\n", ret);
4075 ok(FD_ISSET(fdRead, &exceptfds), "fdRead socket is not in the set\n");
4076 tmp_buf[0] = 0xAF;
4077 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
4078 ok(ret == 1, "expected 1, got %d\n", ret);
4079 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
4081 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
4082 ret = 1;
4083 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret));
4084 ok(ret == 0, "expected 0, got %d\n", ret);
4085 ret = send(fdWrite, "A", 1, MSG_OOB);
4086 ok(ret == 1, "expected 1, got %d\n", ret);
4087 FD_ZERO_ALL();
4088 FD_SET_ALL(fdListen);
4089 FD_SET(fdRead, &readfds);
4090 FD_SET(fdRead, &exceptfds);
4091 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4092 ok(ret == 1, "expected 1, got %d\n", ret);
4093 ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n");
4094 tmp_buf[0] = 0xAF;
4095 SetLastError(0xdeadbeef);
4096 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
4097 if (ret == SOCKET_ERROR) /* can't recv with MSG_OOB if OOBINLINED */
4099 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError());
4100 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
4101 ok(ret == 1, "expected 1, got %d\n", ret);
4102 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
4104 else ok(broken(ret == 1) /* <= NT4 */, "expected error, got 1\n");
4106 /* When the connection is closed the socket is set in the read descriptor */
4107 ret = closesocket(fdRead);
4108 ok(ret == 0, "expected 0, got %d\n", ret);
4109 FD_ZERO_ALL();
4110 FD_SET_ALL(fdListen);
4111 FD_SET(fdWrite, &readfds);
4112 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4113 ok(ret == 1, "expected 1, got %d\n", ret);
4114 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
4115 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0);
4116 ok(ret == 0, "expected 0, got %d\n", ret);
4118 /* When a connection is attempted to a non-listening socket it will get to the except descriptor */
4119 ret = closesocket(fdWrite);
4120 ok(ret == 0, "expected 0, got %d\n", ret);
4121 ret = closesocket(fdListen);
4122 ok(ret == 0, "expected 0, got %d\n", ret);
4123 len = sizeof(address);
4124 fdWrite = setup_connector_socket(&address, len, TRUE);
4125 FD_ZERO_ALL();
4126 FD_SET(fdWrite, &writefds);
4127 FD_SET(fdWrite, &exceptfds);
4128 select_timeout.tv_sec = 2; /* requires more time to realize it will not connect */
4129 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4130 ok(ret == 1, "expected 1, got %d\n", ret);
4131 len = sizeof(id);
4132 id = 0xdeadbeef;
4133 ret = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
4134 ok(!ret, "getsockopt failed with %d\n", WSAGetLastError());
4135 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id);
4136 ok(FD_ISSET(fdWrite, &exceptfds), "fdWrite socket is not in the set\n");
4137 ok(select_timeout.tv_usec == 250000, "select timeout should not have changed\n");
4138 closesocket(fdWrite);
4140 /* Try select() on a closed socket after connection */
4141 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4142 closesocket(fdRead);
4143 FD_ZERO_ALL();
4144 FD_SET_ALL(fdWrite);
4145 FD_SET_ALL(fdRead);
4146 SetLastError(0xdeadbeef);
4147 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout);
4148 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
4149 todo_wine
4150 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError());
4151 /* descriptor sets are unchanged */
4152 ok(readfds.fd_count == 2, "expected 2, got %d\n", readfds.fd_count);
4153 ok(exceptfds.fd_count == 2, "expected 2, got %d\n", exceptfds.fd_count);
4154 closesocket(fdWrite);
4156 /* Close the socket currently being selected in a thread - bug 38399 */
4157 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4158 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
4159 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
4160 FD_ZERO_ALL();
4161 FD_SET_ALL(fdWrite);
4162 ret = select(0, &readfds, NULL, &exceptfds, &select_timeout);
4163 ok(ret == 1, "expected 1, got %d\n", ret);
4164 ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
4165 WaitForSingleObject (thread_handle, 1000);
4166 closesocket(fdRead);
4167 /* test again with only the except descriptor */
4168 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
4169 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
4170 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
4171 FD_ZERO_ALL();
4172 FD_SET(fdWrite, &exceptfds);
4173 SetLastError(0xdeadbeef);
4174 ret = select(0, NULL, NULL, &exceptfds, &select_timeout);
4175 todo_wine
4176 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
4177 todo_wine
4178 ok(GetLastError() == WSAENOTSOCK, "expected 10038, got %d\n", GetLastError());
4179 WaitForSingleObject (thread_handle, 1000);
4180 closesocket(fdRead);
4182 /* test UDP behavior of unbound sockets */
4183 select_timeout.tv_sec = 0;
4184 select_timeout.tv_usec = 250000;
4185 fdWrite = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
4186 ok(fdWrite != INVALID_SOCKET, "socket call failed\n");
4187 FD_ZERO_ALL();
4188 FD_SET_ALL(fdWrite);
4189 ret = select(0, &readfds, &writefds, &exceptfds, &select_timeout);
4190 ok(ret == 1, "expected 1, got %d\n", ret);
4191 ok(FD_ISSET(fdWrite, &writefds), "fdWrite socket is not in the set\n");
4192 closesocket(fdWrite);
4194 #undef FD_SET_ALL
4195 #undef FD_ZERO_ALL
4197 static DWORD WINAPI AcceptKillThread(void *param)
4199 select_thread_params *par = param;
4200 struct sockaddr_in address;
4201 int len = sizeof(address);
4202 SOCKET client_socket;
4204 SetEvent(server_ready);
4205 client_socket = accept(par->s, (struct sockaddr*) &address, &len);
4206 if (client_socket != INVALID_SOCKET)
4207 closesocket(client_socket);
4208 par->ReadKilled = (client_socket == INVALID_SOCKET);
4209 return 0;
4213 static int CALLBACK AlwaysDeferConditionFunc(LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos,
4214 LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData,
4215 GROUP *g, DWORD_PTR dwCallbackData)
4217 return CF_DEFER;
4220 static SOCKET setup_server_socket(struct sockaddr_in *addr, int *len)
4222 int ret, val;
4223 SOCKET server_socket;
4225 server_socket = socket(AF_INET, SOCK_STREAM, 0);
4226 if (server_socket == INVALID_SOCKET)
4228 trace("error creating server socket: %d\n", WSAGetLastError());
4229 return INVALID_SOCKET;
4232 val = 1;
4233 ret = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
4234 if (ret)
4236 trace("error setting SO_REUSEADDR: %d\n", WSAGetLastError());
4237 closesocket(server_socket);
4238 return INVALID_SOCKET;
4241 ret = bind(server_socket, (struct sockaddr *)addr, *len);
4242 if (ret)
4244 trace("error binding server socket: %d\n", WSAGetLastError());
4247 ret = getsockname(server_socket, (struct sockaddr *)addr, len);
4248 if (ret)
4250 skip("failed to lookup bind address: %d\n", WSAGetLastError());
4251 closesocket(server_socket);
4252 return INVALID_SOCKET;
4255 ret = listen(server_socket, 5);
4256 if (ret)
4258 trace("error making server socket listen: %d\n", WSAGetLastError());
4259 closesocket(server_socket);
4260 return INVALID_SOCKET;
4263 return server_socket;
4266 static SOCKET setup_connector_socket(struct sockaddr_in *addr, int len, BOOL nonblock)
4268 int ret;
4269 SOCKET connector;
4271 connector = socket(AF_INET, SOCK_STREAM, 0);
4272 ok(connector != INVALID_SOCKET, "failed to create connector socket %d\n", WSAGetLastError());
4274 if (nonblock)
4275 set_blocking(connector, !nonblock);
4277 ret = connect(connector, (struct sockaddr *)addr, len);
4278 if (!nonblock)
4279 ok(!ret, "connecting to accepting socket failed %d\n", WSAGetLastError());
4280 else if (ret == SOCKET_ERROR)
4282 DWORD error = WSAGetLastError();
4283 ok(error == WSAEWOULDBLOCK || error == WSAEINPROGRESS,
4284 "expected 10035 or 10036, got %d\n", error);
4287 return connector;
4290 static void test_accept(void)
4292 int ret;
4293 SOCKET server_socket, accepted = INVALID_SOCKET, connector;
4294 struct sockaddr_in address;
4295 SOCKADDR_STORAGE ss, ss_empty;
4296 int socklen;
4297 select_thread_params thread_params;
4298 HANDLE thread_handle = NULL;
4299 DWORD id;
4301 memset(&address, 0, sizeof(address));
4302 address.sin_addr.s_addr = inet_addr("127.0.0.1");
4303 address.sin_family = AF_INET;
4305 socklen = sizeof(address);
4306 server_socket = setup_server_socket(&address, &socklen);
4307 if (server_socket == INVALID_SOCKET)
4309 trace("error creating server socket: %d\n", WSAGetLastError());
4310 return;
4313 connector = setup_connector_socket(&address, socklen, FALSE);
4314 if (connector == INVALID_SOCKET) goto done;
4316 trace("Blocking accept next\n");
4318 accepted = WSAAccept(server_socket, NULL, NULL, AlwaysDeferConditionFunc, 0);
4319 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
4321 accepted = accept(server_socket, NULL, 0);
4322 ok(accepted != INVALID_SOCKET, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4324 server_ready = CreateEventA(NULL, TRUE, FALSE, NULL);
4325 if (server_ready == INVALID_HANDLE_VALUE)
4327 trace("error creating event: %d\n", GetLastError());
4328 goto done;
4331 thread_params.s = server_socket;
4332 thread_params.ReadKilled = FALSE;
4333 thread_handle = CreateThread(NULL, 0, AcceptKillThread, &thread_params, 0, &id);
4334 if (thread_handle == NULL)
4336 trace("error creating thread: %d\n", GetLastError());
4337 goto done;
4340 WaitForSingleObject(server_ready, INFINITE);
4341 Sleep(200);
4342 ret = closesocket(server_socket);
4343 if (ret != 0)
4345 trace("closesocket failed: %d\n", WSAGetLastError());
4346 goto done;
4349 WaitForSingleObject(thread_handle, 1000);
4350 ok(thread_params.ReadKilled || broken(!thread_params.ReadKilled) /* Win98/ME, after accept */,
4351 "closesocket did not wakeup accept\n");
4353 closesocket(accepted);
4354 closesocket(connector);
4355 accepted = connector = INVALID_SOCKET;
4357 socklen = sizeof(address);
4358 server_socket = setup_server_socket(&address, &socklen);
4359 if (server_socket == INVALID_SOCKET) goto done;
4361 connector = setup_connector_socket(&address, socklen, FALSE);
4362 if (connector == INVALID_SOCKET) goto done;
4364 socklen = 0;
4365 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
4366 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
4367 ok(!socklen, "got %d\n", socklen);
4368 closesocket(connector);
4369 connector = INVALID_SOCKET;
4371 socklen = sizeof(address);
4372 connector = setup_connector_socket(&address, socklen, FALSE);
4373 if (connector == INVALID_SOCKET) goto done;
4375 accepted = WSAAccept(server_socket, NULL, NULL, NULL, 0);
4376 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4377 closesocket(accepted);
4378 closesocket(connector);
4379 accepted = connector = INVALID_SOCKET;
4381 socklen = sizeof(address);
4382 connector = setup_connector_socket(&address, socklen, FALSE);
4383 if (connector == INVALID_SOCKET) goto done;
4385 socklen = sizeof(ss);
4386 memset(&ss, 0, sizeof(ss));
4387 accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
4388 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4389 ok(socklen != sizeof(ss), "unexpected length\n");
4390 ok(ss.ss_family, "family not set\n");
4391 closesocket(accepted);
4392 closesocket(connector);
4393 accepted = connector = INVALID_SOCKET;
4395 socklen = sizeof(address);
4396 connector = setup_connector_socket(&address, socklen, FALSE);
4397 if (connector == INVALID_SOCKET) goto done;
4399 socklen = 0;
4400 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen);
4401 ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
4402 ok(!socklen, "got %d\n", socklen);
4403 closesocket(connector);
4404 accepted = connector = INVALID_SOCKET;
4406 socklen = sizeof(address);
4407 connector = setup_connector_socket(&address, socklen, FALSE);
4408 if (connector == INVALID_SOCKET) goto done;
4410 accepted = accept(server_socket, NULL, NULL);
4411 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4412 closesocket(accepted);
4413 closesocket(connector);
4414 accepted = connector = INVALID_SOCKET;
4416 socklen = sizeof(address);
4417 connector = setup_connector_socket(&address, socklen, FALSE);
4418 if (connector == INVALID_SOCKET) goto done;
4420 socklen = sizeof(ss);
4421 memset(&ss, 0, sizeof(ss));
4422 accepted = accept(server_socket, (struct sockaddr *)&ss, &socklen);
4423 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4424 ok(socklen != sizeof(ss), "unexpected length\n");
4425 ok(ss.ss_family, "family not set\n");
4426 closesocket(accepted);
4427 closesocket(connector);
4428 accepted = connector = INVALID_SOCKET;
4430 socklen = sizeof(address);
4431 connector = setup_connector_socket(&address, socklen, FALSE);
4432 if (connector == INVALID_SOCKET) goto done;
4434 memset(&ss, 0, sizeof(ss));
4435 memset(&ss_empty, 0, sizeof(ss_empty));
4436 accepted = accept(server_socket, (struct sockaddr *)&ss, NULL);
4437 ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
4438 ok(!memcmp(&ss, &ss_empty, sizeof(ss)), "structure is different\n");
4440 done:
4441 if (accepted != INVALID_SOCKET)
4442 closesocket(accepted);
4443 if (connector != INVALID_SOCKET)
4444 closesocket(connector);
4445 if (thread_handle != NULL)
4446 CloseHandle(thread_handle);
4447 if (server_ready != INVALID_HANDLE_VALUE)
4448 CloseHandle(server_ready);
4449 if (server_socket != INVALID_SOCKET)
4450 closesocket(server_socket);
4453 static void test_extendedSocketOptions(void)
4455 WSADATA wsa;
4456 SOCKET sock;
4457 struct sockaddr_in sa;
4458 int sa_len = sizeof(struct sockaddr_in);
4459 int optval, optlen = sizeof(int), ret;
4460 BOOL bool_opt_val;
4461 LINGER linger_val;
4463 if(WSAStartup(MAKEWORD(2,0), &wsa)){
4464 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4465 return;
4468 memset(&sa, 0, sa_len);
4470 sa.sin_family = AF_INET;
4471 sa.sin_port = htons(0);
4472 sa.sin_addr.s_addr = htonl(INADDR_ANY);
4474 if((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET) {
4475 trace("Creating the socket failed: %d\n", WSAGetLastError());
4476 WSACleanup();
4477 return;
4480 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
4481 trace("Failed to bind socket: %d\n", WSAGetLastError());
4482 closesocket(sock);
4483 WSACleanup();
4484 return;
4487 ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4489 ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
4490 ok((optval == 65507) || (optval == 65527),
4491 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval);
4493 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
4494 SetLastError(0xdeadbeef);
4495 optval = 0xdeadbeef;
4496 optlen = sizeof(int);
4497 ret = getsockopt(sock, 0xffffffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4498 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
4499 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4500 ret, WSAGetLastError(), optval, optval);
4502 /* more invalid values for level */
4503 SetLastError(0xdeadbeef);
4504 optval = 0xdeadbeef;
4505 optlen = sizeof(int);
4506 ret = getsockopt(sock, 0x1234ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4507 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
4508 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4509 ret, WSAGetLastError(), optval, optval);
4511 SetLastError(0xdeadbeef);
4512 optval = 0xdeadbeef;
4513 optlen = sizeof(int);
4514 ret = getsockopt(sock, 0x8000ffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4515 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
4516 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4517 ret, WSAGetLastError(), optval, optval);
4519 SetLastError(0xdeadbeef);
4520 optval = 0xdeadbeef;
4521 optlen = sizeof(int);
4522 ret = getsockopt(sock, 0x00008000, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4523 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
4524 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4525 ret, WSAGetLastError(), optval, optval);
4527 SetLastError(0xdeadbeef);
4528 optval = 0xdeadbeef;
4529 optlen = sizeof(int);
4530 ret = getsockopt(sock, 0x00000800, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
4531 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAEINVAL),
4532 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4533 ret, WSAGetLastError(), optval, optval);
4535 SetLastError(0xdeadbeef);
4536 optlen = sizeof(LINGER);
4537 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
4538 ok( (ret == SOCKET_ERROR) && (WSAGetLastError() == WSAENOPROTOOPT),
4539 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
4540 ret, WSAGetLastError());
4541 closesocket(sock);
4543 if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
4544 trace("Creating the socket failed: %d\n", WSAGetLastError());
4545 WSACleanup();
4546 return;
4549 if(bind(sock, (struct sockaddr *) &sa, sa_len) < 0){
4550 trace("Failed to bind socket: %d\n", WSAGetLastError());
4551 closesocket(sock);
4552 WSACleanup();
4553 return;
4556 ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
4557 ok(ret == 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret);
4559 optlen = sizeof(BOOL);
4560 ret = getsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char *)&bool_opt_val, &optlen);
4561 ok(ret == 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret);
4562 ok((linger_val.l_onoff && !bool_opt_val) || (!linger_val.l_onoff && bool_opt_val),
4563 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
4564 bool_opt_val, linger_val.l_onoff);
4566 closesocket(sock);
4567 WSACleanup();
4570 static void test_getsockname(void)
4572 WSADATA wsa;
4573 SOCKET sock;
4574 struct sockaddr_in sa_set, sa_get;
4575 int sa_set_len = sizeof(struct sockaddr_in);
4576 int sa_get_len = sa_set_len;
4577 static const unsigned char null_padding[] = {0,0,0,0,0,0,0,0};
4578 int ret;
4579 struct hostent *h;
4581 if(WSAStartup(MAKEWORD(2,0), &wsa)){
4582 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4583 return;
4586 memset(&sa_set, 0, sa_set_len);
4588 sa_set.sin_family = AF_INET;
4589 sa_set.sin_port = htons(0);
4590 sa_set.sin_addr.s_addr = htonl(INADDR_ANY);
4592 if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
4593 trace("Creating the socket failed: %d\n", WSAGetLastError());
4594 WSACleanup();
4595 return;
4598 sa_get = sa_set;
4599 if (getsockname(sock, (struct sockaddr*) &sa_get, &sa_get_len) == 0)
4600 ok(0, "getsockname on unbound socket should fail\n");
4601 else {
4602 ok(WSAGetLastError() == WSAEINVAL, "getsockname on unbound socket "
4603 "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL);
4604 ok(memcmp(&sa_get, &sa_set, sizeof(sa_get)) == 0,
4605 "failed getsockname modified sockaddr when it shouldn't\n");
4608 if(bind(sock, (struct sockaddr *) &sa_set, sa_set_len) < 0){
4609 trace("Failed to bind socket: %d\n", WSAGetLastError());
4610 closesocket(sock);
4611 WSACleanup();
4612 return;
4615 if(getsockname(sock, (struct sockaddr *) &sa_get, &sa_get_len) != 0){
4616 trace("Failed to call getsockname: %d\n", WSAGetLastError());
4617 closesocket(sock);
4618 WSACleanup();
4619 return;
4622 ret = memcmp(sa_get.sin_zero, null_padding, 8);
4623 ok(ret == 0 || broken(ret != 0), /* NT4 */
4624 "getsockname did not zero the sockaddr_in structure\n");
4626 closesocket(sock);
4628 h = gethostbyname("");
4629 if (h && h->h_length == 4) /* this test is only meaningful in IPv4 */
4631 int i;
4632 for (i = 0; h->h_addr_list[i]; i++)
4634 char ipstr[32];
4635 struct in_addr ip;
4636 ip.s_addr = *(ULONG *) h->h_addr_list[i];
4638 sock = socket(AF_INET, SOCK_DGRAM, 0);
4639 ok(sock != INVALID_SOCKET, "socket failed with %d\n", GetLastError());
4641 memset(&sa_set, 0, sizeof(sa_set));
4642 sa_set.sin_family = AF_INET;
4643 sa_set.sin_addr.s_addr = ip.s_addr;
4644 /* The same address we bind must be the same address we get */
4645 ret = bind(sock, (struct sockaddr*)&sa_set, sizeof(sa_set));
4646 ok(ret == 0, "bind failed with %d\n", GetLastError());
4647 sa_get_len = sizeof(sa_get);
4648 ret = getsockname(sock, (struct sockaddr*)&sa_get, &sa_get_len);
4649 ok(ret == 0, "getsockname failed with %d\n", GetLastError());
4650 strcpy(ipstr, inet_ntoa(sa_get.sin_addr));
4651 trace("testing bind on interface %s\n", ipstr);
4652 ok(sa_get.sin_addr.s_addr == sa_set.sin_addr.s_addr,
4653 "address does not match: %s != %s\n", ipstr, inet_ntoa(sa_set.sin_addr));
4655 closesocket(sock);
4659 WSACleanup();
4662 static void test_dns(void)
4664 struct hostent *h;
4665 union memaddress
4667 char *chr;
4668 void *mem;
4669 } addr;
4670 char **ptr;
4671 int acount;
4673 h = gethostbyname("");
4674 ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno);
4676 /* Use an address with valid alias names if possible */
4677 h = gethostbyname("source.winehq.org");
4678 if(!h)
4680 skip("Can't test the hostent structure because gethostbyname failed\n");
4681 return;
4684 /* The returned struct must be allocated in a very strict way. First we need to
4685 * count how many aliases there are because they must be located right after
4686 * the struct hostent size. Knowing the amount of aliases we know the exact
4687 * location of the first IP returned. Rule valid for >= XP, for older OS's
4688 * it's somewhat the opposite. */
4689 addr.mem = h + 1;
4690 if(h->h_addr_list == addr.mem) /* <= W2K */
4692 win_skip("Skipping hostent tests since this OS is unsupported\n");
4693 return;
4696 ok(h->h_aliases == addr.mem,
4697 "hostent->h_aliases should be in %p, it is in %p\n", addr.mem, h->h_aliases);
4699 for(ptr = h->h_aliases, acount = 1; *ptr; ptr++) acount++;
4700 addr.chr += sizeof(*ptr) * acount;
4701 ok(h->h_addr_list == addr.mem,
4702 "hostent->h_addr_list should be in %p, it is in %p\n", addr.mem, h->h_addr_list);
4704 for(ptr = h->h_addr_list, acount = 1; *ptr; ptr++) acount++;
4706 addr.chr += sizeof(*ptr) * acount;
4707 ok(h->h_addr_list[0] == addr.mem,
4708 "hostent->h_addr_list[0] should be in %p, it is in %p\n", addr.mem, h->h_addr_list[0]);
4711 /* Our winsock headers don't define gethostname because it conflicts with the
4712 * definition in unistd.h. Define it here to get rid of the warning. */
4714 int WINAPI gethostname(char *name, int namelen);
4716 static void test_gethostbyname(void)
4718 struct hostent *he;
4719 struct in_addr **addr_list;
4720 char name[256], first_ip[16];
4721 int ret, i, count;
4722 PMIB_IPFORWARDTABLE routes = NULL;
4723 PIP_ADAPTER_INFO adapters = NULL, k;
4724 DWORD adap_size = 0, route_size = 0;
4725 BOOL found_default = FALSE;
4726 BOOL local_ip = FALSE;
4728 ret = gethostname(name, sizeof(name));
4729 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4731 he = gethostbyname(name);
4732 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4733 addr_list = (struct in_addr **)he->h_addr_list;
4734 strcpy(first_ip, inet_ntoa(*addr_list[0]));
4736 trace("List of local IPs:\n");
4737 for(count = 0; addr_list[count] != NULL; count++)
4739 char *ip = inet_ntoa(*addr_list[count]);
4740 if (!strcmp(ip, "127.0.0.1"))
4741 local_ip = TRUE;
4742 trace("%s\n", ip);
4745 if (local_ip)
4747 ok (count == 1, "expected 127.0.0.1 to be the only IP returned\n");
4748 skip("Only the loopback address is present, skipping tests\n");
4749 return;
4752 if (!pGetAdaptersInfo || !pGetIpForwardTable)
4754 win_skip("GetAdaptersInfo and/or GetIpForwardTable not found, skipping tests\n");
4755 return;
4758 ret = pGetAdaptersInfo(NULL, &adap_size);
4759 ok (ret == ERROR_BUFFER_OVERFLOW, "GetAdaptersInfo failed with a different error: %d\n", ret);
4760 ret = pGetIpForwardTable(NULL, &route_size, FALSE);
4761 ok (ret == ERROR_INSUFFICIENT_BUFFER, "GetIpForwardTable failed with a different error: %d\n", ret);
4763 adapters = HeapAlloc(GetProcessHeap(), 0, adap_size);
4764 routes = HeapAlloc(GetProcessHeap(), 0, route_size);
4766 ret = pGetAdaptersInfo(adapters, &adap_size);
4767 ok (ret == NO_ERROR, "GetAdaptersInfo failed, error: %d\n", ret);
4768 ret = pGetIpForwardTable(routes, &route_size, FALSE);
4769 ok (ret == NO_ERROR, "GetIpForwardTable failed, error: %d\n", ret);
4771 /* This test only has meaning if there is more than one IP configured */
4772 if (adapters->Next == NULL && count == 1)
4774 skip("Only one IP is present, skipping tests\n");
4775 goto cleanup;
4778 for (i = 0; !found_default && i < routes->dwNumEntries; i++)
4780 /* default route (ip 0.0.0.0) ? */
4781 if (routes->table[i].dwForwardDest) continue;
4783 for (k = adapters; k != NULL; k = k->Next)
4785 char *ip;
4787 if (k->Index != routes->table[i].dwForwardIfIndex) continue;
4789 /* the first IP returned from gethostbyname must be a default route */
4790 ip = k->IpAddressList.IpAddress.String;
4791 if (!strcmp(first_ip, ip))
4793 found_default = TRUE;
4794 break;
4798 ok (found_default, "failed to find the first IP from gethostbyname!\n");
4800 cleanup:
4801 HeapFree(GetProcessHeap(), 0, adapters);
4802 HeapFree(GetProcessHeap(), 0, routes);
4805 static void test_gethostbyname_hack(void)
4807 struct hostent *he;
4808 char name[256];
4809 static BYTE loopback[] = {127, 0, 0, 1};
4810 static BYTE magic_loopback[] = {127, 12, 34, 56};
4811 int ret;
4813 ret = gethostname(name, 256);
4814 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4816 he = gethostbyname("localhost");
4817 ok(he != NULL, "gethostbyname(\"localhost\") failed: %d\n", h_errno);
4818 if(he)
4820 if(he->h_length != 4)
4822 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
4823 return;
4826 ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0,
4827 "gethostbyname(\"localhost\") returned %u.%u.%u.%u\n",
4828 he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2],
4829 he->h_addr_list[0][3]);
4832 if(strcmp(name, "localhost") == 0)
4834 skip("hostname seems to be \"localhost\", skipping test.\n");
4835 return;
4838 he = gethostbyname(name);
4839 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno);
4840 if(he)
4842 if(he->h_length != 4)
4844 skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
4845 return;
4848 if (he->h_addr_list[0][0] == 127)
4850 ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0,
4851 "gethostbyname(\"%s\") returned %u.%u.%u.%u not 127.12.34.56\n",
4852 name, he->h_addr_list[0][0], he->h_addr_list[0][1],
4853 he->h_addr_list[0][2], he->h_addr_list[0][3]);
4857 gethostbyname("nonexistent.winehq.org");
4858 /* Don't check for the return value, as some braindead ISPs will kindly
4859 * resolve nonexistent host names to addresses of the ISP's spam pages. */
4862 static void test_gethostname(void)
4864 struct hostent *he;
4865 char name[256];
4866 int ret, len;
4868 WSASetLastError(0xdeadbeef);
4869 ret = gethostname(NULL, 256);
4870 ok(ret == -1, "gethostname() returned %d\n", ret);
4871 ok(WSAGetLastError() == WSAEFAULT, "gethostname with null buffer "
4872 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
4874 ret = gethostname(name, sizeof(name));
4875 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4876 he = gethostbyname(name);
4877 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4879 len = strlen(name);
4880 WSASetLastError(0xdeadbeef);
4881 strcpy(name, "deadbeef");
4882 ret = gethostname(name, len);
4883 ok(ret == -1, "gethostname() returned %d\n", ret);
4884 ok(!strcmp(name, "deadbeef"), "name changed unexpected!\n");
4885 ok(WSAGetLastError() == WSAEFAULT, "gethostname with insufficient length "
4886 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT);
4888 len++;
4889 ret = gethostname(name, len);
4890 ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
4891 he = gethostbyname(name);
4892 ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError());
4895 static void test_inet_addr(void)
4897 u_long addr;
4899 addr = inet_addr(NULL);
4900 ok(addr == INADDR_NONE, "inet_addr succeeded unexpectedly\n");
4903 static void test_addr_to_print(void)
4905 char dst[16];
4906 char dst6[64];
4907 const char * pdst;
4908 struct in_addr in;
4909 struct in6_addr in6;
4911 u_long addr0_Num = 0x00000000;
4912 PCSTR addr0_Str = "0.0.0.0";
4913 u_long addr1_Num = 0x20201015;
4914 PCSTR addr1_Str = "21.16.32.32";
4915 u_char addr2_Num[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74};
4916 PCSTR addr2_Str = "::fffe:cc98:bd74";
4917 u_char addr3_Num[16] = {0x20,0x30,0xa4,0xb1};
4918 PCSTR addr3_Str = "2030:a4b1::";
4919 u_char addr4_Num[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0xcC,0x98,0xbd,0x74};
4920 PCSTR addr4_Str = "::204.152.189.116";
4922 /* Test IPv4 addresses */
4923 in.s_addr = addr0_Num;
4925 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
4926 ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
4927 ok(!strcmp(pdst, addr0_Str),"Address %s != %s\n", pdst, addr0_Str);
4929 /* Test that inet_ntoa and inet_ntop return the same value */
4930 in.S_un.S_addr = addr1_Num;
4931 pdst = inet_ntoa(*((struct in_addr*)&in.s_addr));
4932 ok(pdst != NULL, "inet_ntoa failed %s\n", dst);
4933 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4935 /* InetNtop became available in Vista and Win2008 */
4936 if (!pInetNtop)
4938 win_skip("InetNtop not present, not executing tests\n");
4939 return;
4942 /* Second part of test */
4943 pdst = pInetNtop(AF_INET,(void*)&in.s_addr, dst, sizeof(dst));
4944 ok(pdst != NULL, "InetNtop failed %s\n", dst);
4945 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4947 /* Test invalid parm conditions */
4948 pdst = pInetNtop(1, (void*)&in.s_addr, dst, sizeof(dst));
4949 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4950 ok(WSAGetLastError() == WSAEAFNOSUPPORT, "Should be WSAEAFNOSUPPORT\n");
4952 /* Test Null destination */
4953 pdst = NULL;
4954 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, NULL, sizeof(dst));
4955 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4956 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
4957 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4959 /* Test zero length passed */
4960 WSASetLastError(0);
4961 pdst = NULL;
4962 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 0);
4963 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4964 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
4965 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4967 /* Test length one shorter than the address length */
4968 WSASetLastError(0);
4969 pdst = NULL;
4970 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, 6);
4971 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
4972 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
4973 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4975 /* Test longer length is ok */
4976 WSASetLastError(0);
4977 pdst = NULL;
4978 pdst = pInetNtop(AF_INET, (void*)&in.s_addr, dst, sizeof(dst)+1);
4979 ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst);
4980 ok(!strcmp(pdst, addr1_Str),"Address %s != %s\n", pdst, addr1_Str);
4982 /* Test the IPv6 addresses */
4984 /* Test an zero prefixed IPV6 address */
4985 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num));
4986 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
4987 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
4988 ok(!strcmp(pdst, addr2_Str),"Address %s != %s\n", pdst, addr2_Str);
4990 /* Test an zero suffixed IPV6 address */
4991 memcpy(in6.s6_addr, addr3_Num, sizeof(addr3_Num));
4992 pdst = pInetNtop(AF_INET6,(void*)&in6.s6_addr, dst6, sizeof(dst6));
4993 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
4994 ok(!strcmp(pdst, addr3_Str),"Address %s != %s\n", pdst, addr3_Str);
4996 /* Test the IPv6 address contains the IPv4 address in IPv4 notation */
4997 memcpy(in6.s6_addr, addr4_Num, sizeof(addr4_Num));
4998 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, sizeof(dst6));
4999 ok(pdst != NULL, "InetNtop failed %s\n", dst6);
5000 ok(!strcmp(pdst, addr4_Str),"Address %s != %s\n", pdst, addr4_Str);
5002 /* Test invalid parm conditions */
5003 memcpy(in6.u.Byte, addr2_Num, sizeof(addr2_Num));
5005 /* Test Null destination */
5006 pdst = NULL;
5007 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, NULL, sizeof(dst6));
5008 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
5009 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
5010 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
5012 /* Test zero length passed */
5013 WSASetLastError(0);
5014 pdst = NULL;
5015 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 0);
5016 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
5017 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
5018 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
5020 /* Test length one shorter than the address length */
5021 WSASetLastError(0);
5022 pdst = NULL;
5023 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 16);
5024 ok(pdst == NULL, "The pointer should not be returned (%p)\n", pdst);
5025 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER || WSAGetLastError() == WSAEINVAL /* Win7 */,
5026 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
5028 /* Test longer length is ok */
5029 WSASetLastError(0);
5030 pdst = NULL;
5031 pdst = pInetNtop(AF_INET6, (void*)&in6.s6_addr, dst6, 18);
5032 ok(pdst != NULL, "The pointer should be returned (%p)\n", pdst);
5034 static void test_inet_pton(void)
5036 struct TEST_DATA
5038 int family, ret;
5039 DWORD err;
5040 const char *printable, *collapsed, *raw_data;
5041 } tests[] = {
5042 {AF_UNSPEC, -1, WSAEFAULT, /* Test 0 */
5043 NULL, NULL, NULL},
5044 {AF_INET, -1, WSAEFAULT,
5045 NULL, NULL, NULL},
5046 {AF_INET6, -1, WSAEFAULT,
5047 NULL, NULL, NULL},
5048 {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
5049 "127.0.0.1", NULL, NULL},
5050 {AF_INET, 1, 0,
5051 "127.0.0.1", "127.0.0.1",
5052 "\x7f\x00\x00\x01"},
5053 {AF_INET6, 0, 0,
5054 "127.0.0.1", "127.0.0.1", NULL},
5055 {AF_INET, 0, 0,
5056 "::1/128", NULL, NULL},
5057 {AF_INET6, 0, 0,
5058 "::1/128", NULL, NULL},
5059 {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
5060 "broken", NULL, NULL},
5061 {AF_INET, 0, 0,
5062 "broken", NULL, NULL},
5063 {AF_INET6, 0, 0, /* Test 10 */
5064 "broken", NULL, NULL},
5065 {AF_UNSPEC, -1, WSAEAFNOSUPPORT,
5066 "177.32.45.20", NULL, NULL},
5067 {AF_INET, 1, 0,
5068 "177.32.45.20", "177.32.45.20",
5069 "\xb1\x20\x2d\x14"},
5070 {AF_INET6, 0, 0,
5071 "177.32.45.20", NULL, NULL},
5072 {AF_INET, 0, 0,
5073 "2607:f0d0:1002:51::4", NULL, NULL},
5074 {AF_INET6, 1, 0,
5075 "2607:f0d0:1002:51::4", "2607:f0d0:1002:51::4",
5076 "\x26\x07\xf0\xd0\x10\x02\x00\x51\x00\x00\x00\x00\x00\x00\x00\x04"},
5077 {AF_INET, 0, 0,
5078 "::177.32.45.20", NULL, NULL},
5079 {AF_INET6, 1, 0,
5080 "::177.32.45.20", "::177.32.45.20",
5081 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x20\x2d\x14"},
5082 {AF_INET, 0, 0,
5083 "fe80::0202:b3ff:fe1e:8329", NULL, NULL},
5084 {AF_INET6, 1, 0,
5085 "fe80::0202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
5086 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
5087 {AF_INET6, 1, 0, /* Test 20 */
5088 "fe80::202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
5089 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
5090 {AF_INET, 0, 0,
5091 "a", NULL, NULL},
5092 {AF_INET, 0, 0,
5093 "a.b", NULL, NULL},
5094 {AF_INET, 0, 0,
5095 "a.b.c", NULL, NULL},
5096 {AF_INET, 0, 0,
5097 "a.b.c.d", NULL, NULL},
5098 {AF_INET6, 1, 0,
5099 "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba::3257:9652",
5100 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
5101 {AF_INET6, 1, 0,
5102 "2001:cdba::3257:9652", "2001:cdba::3257:9652",
5103 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
5104 {AF_INET6, 1, 0,
5105 "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652",
5106 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}
5108 int i, ret;
5109 DWORD err;
5110 char buffer[64],str[64];
5111 WCHAR printableW[64], collapsedW[64];
5112 const char *ptr;
5113 const WCHAR *ptrW;
5115 /* InetNtop and InetPton became available in Vista and Win2008 */
5116 if (!pInetNtop || !pInetNtopW || !pInetPtonA || !pInetPtonW)
5118 win_skip("InetNtop and/or InetPton not present, not executing tests\n");
5119 return;
5122 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
5124 WSASetLastError(0xdeadbeef);
5125 ret = pInetPtonA(tests[i].family, tests[i].printable, buffer);
5126 ok (ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret);
5127 if (tests[i].ret == -1)
5129 err = WSAGetLastError();
5130 ok (tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err);
5132 if (tests[i].ret != 1) continue;
5133 ok (memcmp(buffer, tests[i].raw_data,
5134 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0,
5135 "Test [%d]: Expected binary data differs\n", i);
5137 /* Test the result from Pton with Ntop */
5138 strcpy (str, "deadbeef");
5139 ptr = pInetNtop(tests[i].family, buffer, str, sizeof(str));
5140 ok (ptr != NULL, "Test [%d]: Failed with NULL\n", i);
5141 ok (ptr == str, "Test [%d]: Pointers differ (%p != %p)\n", i, ptr, str);
5142 if (!ptr) continue;
5143 ok (strcmp(ptr, tests[i].collapsed) == 0, "Test [%d]: Expected '%s', got '%s'\n",
5144 i, tests[i].collapsed, ptr);
5147 for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
5149 if (tests[i].printable)
5150 MultiByteToWideChar(CP_ACP, 0, tests[i].printable, -1, printableW,
5151 sizeof(printableW) / sizeof(printableW[0]));
5152 WSASetLastError(0xdeadbeef);
5153 ret = pInetPtonW(tests[i].family, tests[i].printable ? printableW : NULL, buffer);
5154 ok(ret == tests[i].ret, "Test [%d]: Expected %d, got %d\n", i, tests[i].ret, ret);
5155 if (tests[i].ret == -1)
5157 err = WSAGetLastError();
5158 ok(tests[i].err == err, "Test [%d]: Expected 0x%x, got 0x%x\n", i, tests[i].err, err);
5160 if (tests[i].ret != 1) continue;
5161 ok(memcmp(buffer, tests[i].raw_data,
5162 tests[i].family == AF_INET ? sizeof(struct in_addr) : sizeof(struct in6_addr)) == 0,
5163 "Test [%d]: Expected binary data differs\n", i);
5165 /* Test the result from Pton with Ntop */
5166 printableW[0] = 0xdead;
5167 ptrW = pInetNtopW(tests[i].family, buffer, printableW, sizeof(printableW) / sizeof(printableW[0]));
5168 ok (ptrW != NULL, "Test [%d]: Failed with NULL\n", i);
5169 ok (ptrW == printableW, "Test [%d]: Pointers differ (%p != %p)\n", i, ptrW, printableW);
5170 if (!ptrW) continue;
5172 MultiByteToWideChar(CP_ACP, 0, tests[i].collapsed, -1, collapsedW,
5173 sizeof(collapsedW) / sizeof(collapsedW[0]));
5174 ok (lstrcmpW(ptrW, collapsedW) == 0, "Test [%d]: Expected '%s', got '%s'\n",
5175 i, tests[i].collapsed, wine_dbgstr_w(ptrW));
5179 static void test_ioctlsocket(void)
5181 SOCKET sock, src, dst;
5182 struct tcp_keepalive kalive;
5183 int ret, optval;
5184 static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK};
5185 UINT i, bytes_rec;
5186 char data;
5187 WSABUF bufs;
5188 u_long arg = 0;
5190 sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
5191 ok(sock != INVALID_SOCKET, "Creating the socket failed: %d\n", WSAGetLastError());
5192 if(sock == INVALID_SOCKET)
5194 skip("Can't continue without a socket.\n");
5195 return;
5198 for(i = 0; i < sizeof(cmds)/sizeof(cmds[0]); i++)
5200 /* broken apps like defcon pass the argp value directly instead of a pointer to it */
5201 ret = ioctlsocket(sock, cmds[i], (u_long *)1);
5202 ok(ret == SOCKET_ERROR, "ioctlsocket succeeded unexpectedly\n");
5203 ret = WSAGetLastError();
5204 ok(ret == WSAEFAULT, "expected WSAEFAULT, got %d instead\n", ret);
5207 /* A fresh and not connected socket has no urgent data, this test shows
5208 * that normal(not urgent) data returns a non-zero value for SIOCATMARK. */
5210 ret = ioctlsocket(sock, SIOCATMARK, &arg);
5211 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5212 ok(arg, "SIOCATMARK expected a non-zero value\n");
5214 /* when SO_OOBINLINE is set SIOCATMARK must always return TRUE */
5215 optval = 1;
5216 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5217 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5218 arg = 0;
5219 ret = ioctlsocket(sock, SIOCATMARK, &arg);
5220 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5221 ok(arg, "SIOCATMARK expected a non-zero value\n");
5223 /* disable SO_OOBINLINE and get the same old behavior */
5224 optval = 0;
5225 ret = setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5226 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5227 arg = 0;
5228 ret = ioctlsocket(sock, SIOCATMARK, &arg);
5229 ok(ret != SOCKET_ERROR, "ioctlsocket failed unexpectedly\n");
5230 ok(arg, "SIOCATMARK expected a non-zero value\n");
5232 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &arg, 0, NULL, 0, &arg, NULL, NULL);
5233 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5234 ret = WSAGetLastError();
5235 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret);
5237 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, NULL, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5238 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5239 ret = WSAGetLastError();
5240 ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret);
5242 /* broken used to catch W95, W98, NT4 */
5243 make_keepalive(kalive, 0, 0, 0);
5244 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5245 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5247 make_keepalive(kalive, 1, 0, 0);
5248 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5249 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5251 make_keepalive(kalive, 1, 1000, 1000);
5252 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5253 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5255 make_keepalive(kalive, 1, 10000, 10000);
5256 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5257 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5259 make_keepalive(kalive, 1, 100, 100);
5260 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5261 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5263 make_keepalive(kalive, 0, 100, 100);
5264 ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
5265 ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
5267 closesocket(sock);
5269 if (tcp_socketpair(&src, &dst) != 0)
5271 ok(0, "creating socket pair failed, skipping test\n");
5272 return;
5275 /* test FIONREAD on TCP sockets */
5276 optval = 0xdeadbeef;
5277 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5278 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5279 ok(optval == 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval);
5281 optval = 0xdeadbeef;
5282 ok(send(src, "TEST", 4, 0) == 4, "failed to send test data\n");
5283 Sleep(100);
5284 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5285 ok(ret == 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5286 ok(optval == 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval);
5288 /* trying to read from an OOB inlined socket with MSG_OOB results in WSAEINVAL */
5289 set_blocking(dst, FALSE);
5290 i = MSG_OOB;
5291 SetLastError(0xdeadbeef);
5292 ret = recv(dst, &data, 1, i);
5293 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5294 ret = GetLastError();
5295 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret);
5296 bufs.len = sizeof(char);
5297 bufs.buf = &data;
5298 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL);
5299 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5300 ret = GetLastError();
5301 ok(ret == WSAEWOULDBLOCK, "expected 10035, got %d\n", ret);
5302 optval = 1;
5303 ret = setsockopt(dst, SOL_SOCKET, SO_OOBINLINE, (void *)&optval, sizeof(optval));
5304 ok(ret != SOCKET_ERROR, "setsockopt failed unexpectedly\n");
5305 i = MSG_OOB;
5306 SetLastError(0xdeadbeef);
5307 ret = recv(dst, &data, 1, i);
5308 if (ret == SOCKET_ERROR)
5310 ret = GetLastError();
5311 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret);
5312 bufs.len = sizeof(char);
5313 bufs.buf = &data;
5314 ret = WSARecv(dst, &bufs, 1, &bytes_rec, &i, NULL, NULL);
5315 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5316 ret = GetLastError();
5317 ok(ret == WSAEINVAL, "expected 10022, got %d\n", ret);
5319 else ok(broken(ret == 1) /* <= NT4 */, "expected error, got 1\n");
5321 closesocket(dst);
5322 optval = 0xdeadbeef;
5323 ret = WSAIoctl(dst, FIONREAD, NULL, 0, &optval, sizeof(optval), &arg, NULL, NULL);
5324 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
5325 ok(optval == 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval);
5326 closesocket(src);
5329 static BOOL drain_pause = FALSE;
5330 static DWORD WINAPI drain_socket_thread(LPVOID arg)
5332 char buffer[1024];
5333 SOCKET sock = *(SOCKET*)arg;
5334 int ret;
5336 while ((ret = recv(sock, buffer, sizeof(buffer), 0)) != 0)
5338 if (ret < 0)
5340 if (WSAGetLastError() == WSAEWOULDBLOCK)
5342 fd_set readset;
5343 FD_ZERO(&readset);
5344 FD_SET(sock, &readset);
5345 select(sock+1, &readset, NULL, NULL, NULL);
5346 while (drain_pause)
5347 Sleep(100);
5349 else
5350 break;
5353 return 0;
5356 static void test_send(void)
5358 SOCKET src = INVALID_SOCKET;
5359 SOCKET dst = INVALID_SOCKET;
5360 HANDLE hThread = NULL;
5361 const int buflen = 1024*1024;
5362 char *buffer = NULL;
5363 int ret, i, zero = 0;
5364 WSABUF buf;
5365 OVERLAPPED ov;
5366 BOOL bret;
5367 DWORD id, bytes_sent, dwRet;
5369 memset(&ov, 0, sizeof(ov));
5371 if (tcp_socketpair(&src, &dst) != 0)
5373 ok(0, "creating socket pair failed, skipping test\n");
5374 return;
5377 set_blocking(dst, FALSE);
5378 /* force disable buffering so we can get a pending overlapped request */
5379 ret = setsockopt(dst, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof(zero));
5380 ok(!ret, "setsockopt SO_SNDBUF failed: %d - %d\n", ret, GetLastError());
5382 hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
5383 if (hThread == NULL)
5385 ok(0, "CreateThread failed, error %d\n", GetLastError());
5386 goto end;
5389 buffer = HeapAlloc(GetProcessHeap(), 0, buflen);
5390 if (buffer == NULL)
5392 ok(0, "HeapAlloc failed, error %d\n", GetLastError());
5393 goto end;
5396 /* fill the buffer with some nonsense */
5397 for (i = 0; i < buflen; ++i)
5399 buffer[i] = (char) i;
5402 ret = send(src, buffer, buflen, 0);
5403 if (ret >= 0)
5404 ok(ret == buflen, "send should have sent %d bytes, but it only sent %d\n", buflen, ret);
5405 else
5406 ok(0, "send failed, error %d\n", WSAGetLastError());
5408 buf.buf = buffer;
5409 buf.len = buflen;
5411 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
5412 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
5413 if (!ov.hEvent)
5414 goto end;
5416 bytes_sent = 0;
5417 WSASetLastError(12345);
5418 ret = WSASend(dst, &buf, 1, &bytes_sent, 0, &ov, NULL);
5419 ok((ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING) || broken(bytes_sent == buflen),
5420 "Failed to start overlapped send %d - %d - %d/%d\n", ret, WSAGetLastError(), bytes_sent, buflen);
5422 /* don't check for completion yet, we may need to drain the buffer while still sending */
5423 set_blocking(src, FALSE);
5424 for (i = 0; i < buflen; ++i)
5426 int j = 0;
5428 ret = recv(src, buffer, 1, 0);
5429 while (ret == SOCKET_ERROR && GetLastError() == WSAEWOULDBLOCK && j < 100)
5431 j++;
5432 Sleep(50);
5433 ret = recv(src, buffer, 1, 0);
5436 ok(ret == 1, "Failed to receive data %d - %d (got %d/%d)\n", ret, GetLastError(), i, buflen);
5437 if (ret != 1)
5438 break;
5440 ok(buffer[0] == (char) i, "Received bad data at position %d\n", i);
5443 dwRet = WaitForSingleObject(ov.hEvent, 1000);
5444 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
5445 if (dwRet == WAIT_OBJECT_0)
5447 bret = GetOverlappedResult((HANDLE)dst, &ov, &bytes_sent, FALSE);
5448 ok((bret && bytes_sent == buflen) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
5449 "Got %d instead of %d (%d - %d)\n", bytes_sent, buflen, bret, GetLastError());
5452 WSASetLastError(12345);
5453 ret = WSASend(INVALID_SOCKET, &buf, 1, NULL, 0, &ov, NULL);
5454 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK,
5455 "WSASend failed %d - %d\n", ret, WSAGetLastError());
5457 WSASetLastError(12345);
5458 ret = WSASend(dst, &buf, 1, NULL, 0, &ov, NULL);
5459 ok(ret == SOCKET_ERROR && WSAGetLastError() == ERROR_IO_PENDING,
5460 "Failed to start overlapped send %d - %d\n", ret, WSAGetLastError());
5462 end:
5463 if (src != INVALID_SOCKET)
5464 closesocket(src);
5465 if (dst != INVALID_SOCKET)
5466 closesocket(dst);
5467 if (hThread != NULL)
5469 dwRet = WaitForSingleObject(hThread, 500);
5470 ok(dwRet == WAIT_OBJECT_0, "failed to wait for thread termination: %d\n", GetLastError());
5471 CloseHandle(hThread);
5473 if (ov.hEvent)
5474 CloseHandle(ov.hEvent);
5475 HeapFree(GetProcessHeap(), 0, buffer);
5478 typedef struct async_message
5480 SOCKET socket;
5481 LPARAM lparam;
5482 struct async_message *next;
5483 } async_message;
5485 static struct async_message *messages_received;
5487 #define WM_SOCKET (WM_USER+100)
5488 static LRESULT CALLBACK ws2_test_WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
5490 struct async_message *message;
5492 switch (msg)
5494 case WM_SOCKET:
5495 message = HeapAlloc(GetProcessHeap(), 0, sizeof(*message));
5496 message->socket = (SOCKET) wparam;
5497 message->lparam = lparam;
5498 message->next = NULL;
5500 if (messages_received)
5502 struct async_message *last = messages_received;
5503 while (last->next) last = last->next;
5504 last->next = message;
5506 else
5507 messages_received = message;
5508 return 0;
5511 return DefWindowProcA(hwnd, msg, wparam, lparam);
5514 static void get_event_details(int event, int *bit, char *name)
5516 switch (event)
5518 case FD_ACCEPT:
5519 if (bit) *bit = FD_ACCEPT_BIT;
5520 if (name) strcpy(name, "FD_ACCEPT");
5521 break;
5522 case FD_CONNECT:
5523 if (bit) *bit = FD_CONNECT_BIT;
5524 if (name) strcpy(name, "FD_CONNECT");
5525 break;
5526 case FD_READ:
5527 if (bit) *bit = FD_READ_BIT;
5528 if (name) strcpy(name, "FD_READ");
5529 break;
5530 case FD_OOB:
5531 if (bit) *bit = FD_OOB_BIT;
5532 if (name) strcpy(name, "FD_OOB");
5533 break;
5534 case FD_WRITE:
5535 if (bit) *bit = FD_WRITE_BIT;
5536 if (name) strcpy(name, "FD_WRITE");
5537 break;
5538 case FD_CLOSE:
5539 if (bit) *bit = FD_CLOSE_BIT;
5540 if (name) strcpy(name, "FD_CLOSE");
5541 break;
5542 default:
5543 if (bit) *bit = -1;
5544 if (name) sprintf(name, "bad%x", event);
5548 static const char *dbgstr_event_seq(const LPARAM *seq)
5550 static char message[1024];
5551 char name[12];
5552 int len = 1;
5554 message[0] = '[';
5555 message[1] = 0;
5556 while (*seq)
5558 get_event_details(WSAGETSELECTEVENT(*seq), NULL, name);
5559 len += sprintf(message + len, "%s(%d) ", name, WSAGETSELECTERROR(*seq));
5560 seq++;
5562 if (len > 1) len--;
5563 strcpy( message + len, "]" );
5564 return message;
5567 static char *dbgstr_event_seq_result(SOCKET s, WSANETWORKEVENTS *netEvents)
5569 static char message[1024];
5570 struct async_message *curr = messages_received;
5571 int index, error, bit = 0;
5572 char name[12];
5573 int len = 1;
5575 message[0] = '[';
5576 message[1] = 0;
5577 while (1)
5579 if (netEvents)
5581 if (bit >= FD_MAX_EVENTS) break;
5582 if ( !(netEvents->lNetworkEvents & (1 << bit)) )
5584 bit++;
5585 continue;
5587 get_event_details(1 << bit, &index, name);
5588 error = netEvents->iErrorCode[index];
5589 bit++;
5591 else
5593 if (!curr) break;
5594 if (curr->socket != s)
5596 curr = curr->next;
5597 continue;
5599 get_event_details(WSAGETSELECTEVENT(curr->lparam), NULL, name);
5600 error = WSAGETSELECTERROR(curr->lparam);
5601 curr = curr->next;
5604 len += sprintf(message + len, "%s(%d) ", name, error);
5606 if (len > 1) len--;
5607 strcpy( message + len, "]" );
5608 return message;
5611 static void flush_events(SOCKET s, HANDLE hEvent)
5613 WSANETWORKEVENTS netEvents;
5614 struct async_message *prev = NULL, *curr = messages_received;
5615 int ret;
5616 DWORD dwRet;
5618 if (hEvent != INVALID_HANDLE_VALUE)
5620 dwRet = WaitForSingleObject(hEvent, 100);
5621 if (dwRet == WAIT_OBJECT_0)
5623 ret = WSAEnumNetworkEvents(s, hEvent, &netEvents);
5624 if (ret)
5625 ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
5628 else
5630 while (curr)
5632 if (curr->socket == s)
5634 if (prev) prev->next = curr->next;
5635 else messages_received = curr->next;
5637 HeapFree(GetProcessHeap(), 0, curr);
5639 if (prev) curr = prev->next;
5640 else curr = messages_received;
5642 else
5644 prev = curr;
5645 curr = curr->next;
5651 static int match_event_sequence(SOCKET s, WSANETWORKEVENTS *netEvents, const LPARAM *seq)
5653 int event, index, error, events;
5654 struct async_message *curr;
5656 if (netEvents)
5658 events = netEvents->lNetworkEvents;
5659 while (*seq)
5661 event = WSAGETSELECTEVENT(*seq);
5662 error = WSAGETSELECTERROR(*seq);
5663 get_event_details(event, &index, NULL);
5665 if (!(events & event) && index != -1)
5666 return 0;
5667 if (events & event && index != -1)
5669 if (netEvents->iErrorCode[index] != error)
5670 return 0;
5672 events &= ~event;
5673 seq++;
5675 if (events)
5676 return 0;
5678 else
5680 curr = messages_received;
5681 while (curr)
5683 if (curr->socket == s)
5685 if (!*seq) return 0;
5686 if (*seq != curr->lparam) return 0;
5687 seq++;
5689 curr = curr->next;
5691 if (*seq)
5692 return 0;
5694 return 1;
5697 /* checks for a sequence of events, (order only checked if window is used) */
5698 static void ok_event_sequence(SOCKET s, HANDLE hEvent, const LPARAM *seq, const LPARAM **broken_seqs, int completelyBroken)
5700 MSG msg;
5701 WSANETWORKEVENTS events, *netEvents = NULL;
5702 int ret;
5703 DWORD dwRet;
5705 if (hEvent != INVALID_HANDLE_VALUE)
5707 netEvents = &events;
5709 dwRet = WaitForSingleObject(hEvent, 200);
5710 if (dwRet == WAIT_OBJECT_0)
5712 ret = WSAEnumNetworkEvents(s, hEvent, netEvents);
5713 if (ret)
5715 winetest_ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret);
5716 return;
5719 else
5720 memset(netEvents, 0, sizeof(*netEvents));
5722 else
5724 Sleep(200);
5725 /* Run the message loop a little */
5726 while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE ))
5728 DispatchMessageA(&msg);
5732 if (match_event_sequence(s, netEvents, seq))
5734 winetest_ok(1, "Sequence matches expected: %s\n", dbgstr_event_seq(seq));
5735 flush_events(s, hEvent);
5736 return;
5739 if (broken_seqs)
5741 for (; *broken_seqs; broken_seqs++)
5743 if (match_event_sequence(s, netEvents, *broken_seqs))
5745 winetest_ok(broken(1), "Sequence matches broken: %s, expected %s\n", dbgstr_event_seq_result(s, netEvents), dbgstr_event_seq(seq));
5746 flush_events(s, hEvent);
5747 return;
5752 winetest_ok(broken(completelyBroken), "Expected event sequence %s, got %s\n", dbgstr_event_seq(seq),
5753 dbgstr_event_seq_result(s, netEvents));
5754 flush_events(s, hEvent);
5757 #define ok_event_seq (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence
5759 static void test_events(int useMessages)
5761 SOCKET server = INVALID_SOCKET;
5762 SOCKET src = INVALID_SOCKET, src2 = INVALID_SOCKET;
5763 SOCKET dst = INVALID_SOCKET, dst2 = INVALID_SOCKET;
5764 struct sockaddr_in addr;
5765 HANDLE hThread = NULL;
5766 HANDLE hEvent = INVALID_HANDLE_VALUE, hEvent2 = INVALID_HANDLE_VALUE;
5767 WNDCLASSEXA wndclass;
5768 HWND hWnd = NULL;
5769 char *buffer = NULL;
5770 int bufferSize = 1024*1024;
5771 WSABUF bufs;
5772 OVERLAPPED ov, ov2;
5773 DWORD flags = 0;
5774 DWORD bytesReturned;
5775 DWORD id;
5776 int len;
5777 int ret;
5778 DWORD dwRet;
5779 BOOL bret;
5780 static char szClassName[] = "wstestclass";
5781 const LPARAM *broken_seq[3];
5782 static const LPARAM empty_seq[] = { 0 };
5783 static const LPARAM close_seq[] = { WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 };
5784 static const LPARAM write_seq[] = { WSAMAKESELECTREPLY(FD_WRITE, 0), 0 };
5785 static const LPARAM read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0), 0 };
5786 static const LPARAM oob_seq[] = { WSAMAKESELECTREPLY(FD_OOB, 0), 0 };
5787 static const LPARAM connect_seq[] = { WSAMAKESELECTREPLY(FD_CONNECT, 0),
5788 WSAMAKESELECTREPLY(FD_WRITE, 0), 0 };
5789 static const LPARAM read_read_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5790 WSAMAKESELECTREPLY(FD_READ, 0), 0 };
5791 static const LPARAM read_write_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5792 WSAMAKESELECTREPLY(FD_WRITE, 0), 0 };
5793 static const LPARAM read_close_seq[] = { WSAMAKESELECTREPLY(FD_READ, 0),
5794 WSAMAKESELECTREPLY(FD_CLOSE, 0), 0 };
5796 memset(&ov, 0, sizeof(ov));
5797 memset(&ov2, 0, sizeof(ov2));
5799 /* don't use socketpair, we want connection event */
5800 src = socket(AF_INET, SOCK_STREAM, 0);
5801 if (src == INVALID_SOCKET)
5803 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5804 goto end;
5807 ret = set_blocking(src, TRUE);
5808 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
5810 src2 = socket(AF_INET, SOCK_STREAM, 0);
5811 if (src2 == INVALID_SOCKET)
5813 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5814 goto end;
5817 ret = set_blocking(src2, TRUE);
5818 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
5820 len = sizeof(BOOL);
5821 if (getsockopt(src, SOL_SOCKET, SO_OOBINLINE, (void *)&bret, &len) == SOCKET_ERROR)
5823 ok(0, "failed to get oobinline status, %d\n", GetLastError());
5824 goto end;
5826 ok(bret == FALSE, "OOB not inline\n");
5828 if (useMessages)
5830 trace("Event test using messages\n");
5832 wndclass.cbSize = sizeof(wndclass);
5833 wndclass.style = CS_HREDRAW | CS_VREDRAW;
5834 wndclass.lpfnWndProc = ws2_test_WndProc;
5835 wndclass.cbClsExtra = 0;
5836 wndclass.cbWndExtra = 0;
5837 wndclass.hInstance = GetModuleHandleA(NULL);
5838 wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
5839 wndclass.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
5840 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
5841 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
5842 wndclass.lpszClassName = szClassName;
5843 wndclass.lpszMenuName = NULL;
5844 RegisterClassExA(&wndclass);
5846 hWnd = CreateWindowA(szClassName, "WS2Test", WS_OVERLAPPEDWINDOW,
5847 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
5848 if (!hWnd)
5850 ok(0, "failed to create window: %d\n", GetLastError());
5851 return;
5854 ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
5855 if (ret)
5857 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
5858 goto end;
5861 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5862 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5864 ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
5865 if (ret)
5867 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
5868 goto end;
5871 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5872 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5874 else
5876 trace("Event test using events\n");
5878 hEvent = WSACreateEvent();
5879 if (hEvent == INVALID_HANDLE_VALUE)
5881 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5882 goto end;
5885 hEvent2 = WSACreateEvent();
5886 if (hEvent2 == INVALID_HANDLE_VALUE)
5888 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5889 goto end;
5892 ret = WSAEventSelect(src, hEvent, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
5893 if (ret)
5895 ok(0, "WSAEventSelect failed, error %d\n", ret);
5896 goto end;
5899 ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5900 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5902 ret = WSAEventSelect(src2, hEvent2, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
5903 if (ret)
5905 ok(0, "WSAEventSelect failed, error %d\n", ret);
5906 goto end;
5909 ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
5910 ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5913 server = socket(AF_INET, SOCK_STREAM, 0);
5914 if (server == INVALID_SOCKET)
5916 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5917 goto end;
5920 memset(&addr, 0, sizeof(addr));
5921 addr.sin_family = AF_INET;
5922 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
5923 ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
5924 if (ret != 0)
5926 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5927 goto end;
5930 len = sizeof(addr);
5931 ret = getsockname(server, (struct sockaddr*)&addr, &len);
5932 if (ret != 0)
5934 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5935 goto end;
5938 ret = listen(server, 2);
5939 if (ret != 0)
5941 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5942 goto end;
5945 SetLastError(0xdeadbeef);
5946 ret = connect(src, NULL, 0);
5947 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
5948 ok(GetLastError() == WSAEFAULT, "expected 10014, got %d\n", GetLastError());
5950 ret = connect(src, (struct sockaddr*)&addr, sizeof(addr));
5951 if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
5953 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5954 goto end;
5957 ret = connect(src2, (struct sockaddr*)&addr, sizeof(addr));
5958 if (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
5960 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5961 goto end;
5964 len = sizeof(addr);
5965 dst = accept(server, (struct sockaddr*)&addr, &len);
5966 if (dst == INVALID_SOCKET)
5968 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5969 goto end;
5972 len = sizeof(addr);
5973 dst2 = accept(server, (struct sockaddr*)&addr, &len);
5974 if (dst2 == INVALID_SOCKET)
5976 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5977 goto end;
5980 closesocket(server);
5981 server = INVALID_SOCKET;
5983 /* On Windows it seems when a non-blocking socket sends to a
5984 blocking socket on the same host, the send() is BLOCKING,
5985 so make both sockets non-blocking. src is already non-blocking
5986 from the async select */
5988 if (set_blocking(dst, FALSE))
5990 ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
5991 goto end;
5994 buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufferSize);
5995 if (buffer == NULL)
5997 ok(0, "could not allocate memory for test\n");
5998 goto end;
6001 ov.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
6002 if (ov.hEvent == NULL)
6004 ok(0, "could not create event object, errno = %d\n", GetLastError());
6005 goto end;
6008 ov2.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
6009 if (ov2.hEvent == NULL)
6011 ok(0, "could not create event object, errno = %d\n", GetLastError());
6012 goto end;
6015 /* FD_WRITE should be set initially, and allow us to send at least 1 byte */
6016 ok_event_seq(src, hEvent, connect_seq, NULL, 1);
6017 ok_event_seq(src2, hEvent2, connect_seq, NULL, 1);
6018 /* broken on all windows - FD_CONNECT error is garbage */
6020 /* Test simple send/recv */
6021 SetLastError(0xdeadbeef);
6022 ret = send(dst, buffer, 100, 0);
6023 ok(ret == 100, "Failed to send buffer %d err %d\n", ret, GetLastError());
6024 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6025 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6027 SetLastError(0xdeadbeef);
6028 ret = recv(src, buffer, 1, MSG_PEEK);
6029 ok(ret == 1, "Failed to peek at recv buffer %d err %d\n", ret, GetLastError());
6030 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6031 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6033 SetLastError(0xdeadbeef);
6034 ret = recv(src, buffer, 50, 0);
6035 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6036 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6037 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6039 ret = recv(src, buffer, 50, 0);
6040 ok(ret == 50, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6041 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6043 /* fun fact - events are re-enabled even on failure, but only for messages */
6044 ret = send(dst, "1", 1, 0);
6045 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6046 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6048 ret = recv(src, buffer, -1, 0);
6049 ok(ret == SOCKET_ERROR && (GetLastError() == WSAEFAULT || GetLastError() == WSAENOBUFS),
6050 "Failed to recv buffer %d err %d\n", ret, GetLastError());
6051 if (useMessages)
6053 broken_seq[0] = empty_seq; /* win9x */
6054 broken_seq[1] = NULL;
6055 todo_wine ok_event_seq(src, hEvent, read_seq, broken_seq, 0);
6057 else
6058 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6060 SetLastError(0xdeadbeef);
6061 ret = recv(src, buffer, 1, 0);
6062 ok(ret == 1, "Failed to recv buffer %d err %d\n", ret, GetLastError());
6063 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6064 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6066 /* Interaction with overlapped */
6067 bufs.len = sizeof(char);
6068 bufs.buf = buffer;
6069 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL);
6070 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
6071 "WSARecv failed - %d error %d\n", ret, GetLastError());
6073 bufs.len = sizeof(char);
6074 bufs.buf = buffer+1;
6075 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov2, NULL);
6076 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
6077 "WSARecv failed - %d error %d\n", ret, GetLastError());
6079 ret = send(dst, "12", 2, 0);
6080 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6081 broken_seq[0] = read_read_seq; /* win9x */
6082 broken_seq[1] = NULL;
6083 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0);
6085 dwRet = WaitForSingleObject(ov.hEvent, 100);
6086 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6087 if (dwRet == WAIT_OBJECT_0)
6089 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE);
6090 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6091 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6092 ok(buffer[0] == '1', "Got %c instead of 1\n", buffer[0]);
6095 dwRet = WaitForSingleObject(ov2.hEvent, 100);
6096 ok(dwRet == WAIT_OBJECT_0, "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6097 if (dwRet == WAIT_OBJECT_0)
6099 bret = GetOverlappedResult((HANDLE)src, &ov2, &bytesReturned, FALSE);
6100 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6101 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6102 ok(buffer[1] == '2', "Got %c instead of 2\n", buffer[1]);
6105 SetLastError(0xdeadbeef);
6106 ret = send(dst, "1", 1, 0);
6107 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6108 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6109 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6111 ret = recv(src, buffer, 1, 0);
6112 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6113 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6115 /* Notifications are delivered as soon as possible, blocked only on
6116 * async requests on the same type */
6117 bufs.len = sizeof(char);
6118 bufs.buf = buffer;
6119 ret = WSARecv(src, &bufs, 1, &bytesReturned, &flags, &ov, NULL);
6120 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
6121 "WSARecv failed - %d error %d\n", ret, GetLastError());
6123 if (0) {
6124 ret = send(dst, "1", 1, MSG_OOB);
6125 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6126 ok_event_seq(src, hEvent, oob_seq, NULL, 0);
6129 dwRet = WaitForSingleObject(ov.hEvent, 100);
6130 ok(dwRet == WAIT_TIMEOUT, "OOB message activated read?: %d - %d\n", dwRet, GetLastError());
6132 ret = send(dst, "2", 1, 0);
6133 ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
6134 broken_seq[0] = read_seq; /* win98 */
6135 broken_seq[1] = NULL;
6136 ok_event_seq(src, hEvent, empty_seq, broken_seq, 0);
6138 dwRet = WaitForSingleObject(ov.hEvent, 100);
6139 ok(dwRet == WAIT_OBJECT_0 || broken(dwRet == WAIT_TIMEOUT),
6140 "Failed to wait for recv message: %d - %d\n", dwRet, GetLastError());
6141 if (dwRet == WAIT_OBJECT_0)
6143 bret = GetOverlappedResult((HANDLE)src, &ov, &bytesReturned, FALSE);
6144 ok((bret && bytesReturned == 1) || broken(!bret && GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */,
6145 "Got %d instead of 1 (%d - %d)\n", bytesReturned, bret, GetLastError());
6146 ok(buffer[0] == '2', "Got %c instead of 2\n", buffer[0]);
6148 else if (dwRet == WAIT_TIMEOUT)
6150 /* this happens on win98. We get an FD_READ later on the next test */
6151 CancelIo((HANDLE) src);
6154 if (0) {
6155 ret = recv(src, buffer, 1, MSG_OOB);
6156 todo_wine ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6157 /* We get OOB notification, but no data on wine */
6158 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6161 /* Flood the send queue */
6162 hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
6163 if (hThread == NULL)
6165 ok(0, "CreateThread failed, error %d\n", GetLastError());
6166 goto end;
6169 /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */
6170 ok_event_seq(src, hEvent, empty_seq, NULL, 0);
6172 /* Now if we send a ton of data and the 'server' does not drain it fast
6173 * enough (set drain_pause to be sure), the socket send buffer will only
6174 * take some of it, and we will get a short write. This will trigger
6175 * another FD_WRITE event as soon as data is sent and more space becomes
6176 * available, but not any earlier. */
6177 drain_pause = TRUE;
6180 ret = send(src, buffer, bufferSize, 0);
6181 } while (ret == bufferSize);
6182 drain_pause = FALSE;
6183 if (ret >= 0 || WSAGetLastError() == WSAEWOULDBLOCK)
6185 Sleep(400); /* win9x */
6186 broken_seq[0] = read_write_seq;
6187 broken_seq[1] = NULL;
6188 ok_event_seq(src, hEvent, write_seq, broken_seq, 0);
6190 else
6192 ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError());
6195 /* Test how FD_CLOSE is handled */
6196 ret = send(dst, "12", 2, 0);
6197 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6199 /* Wait a little and let the send complete */
6200 Sleep(100);
6201 closesocket(dst);
6202 dst = INVALID_SOCKET;
6203 Sleep(100);
6205 /* We can never implement this in wine, best we can hope for is
6206 sending FD_CLOSE after the reads complete */
6207 broken_seq[0] = read_seq; /* win9x */
6208 broken_seq[1] = NULL;
6209 todo_wine ok_event_seq(src, hEvent, read_close_seq, broken_seq, 0);
6211 ret = recv(src, buffer, 1, 0);
6212 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6213 ok_event_seq(src, hEvent, read_seq, NULL, 0);
6215 ret = recv(src, buffer, 1, 0);
6216 ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6217 /* want it? it's here, but you can't have it */
6218 broken_seq[0] = close_seq; /* win9x */
6219 broken_seq[1] = NULL;
6220 todo_wine ok_event_seq(src, hEvent, empty_seq, /* wine sends FD_CLOSE here */
6221 broken_seq, 0);
6223 /* Test how FD_CLOSE is handled */
6224 ret = send(dst2, "12", 2, 0);
6225 ok(ret == 2, "Failed to send buffer %d err %d\n", ret, GetLastError());
6227 Sleep(200);
6228 shutdown(dst2, SD_SEND);
6229 Sleep(200);
6231 /* Some of the below are technically todo_wine, but our event sequence is still valid, so to prevent
6232 regressions, don't mark them as todo_wine, and mark windows as broken */
6233 broken_seq[0] = read_close_seq;
6234 broken_seq[1] = close_seq;
6235 broken_seq[2] = NULL;
6236 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0);
6238 ret = recv(src2, buffer, 1, 0);
6239 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6240 broken_seq[0] = close_seq; /* win98 */
6241 broken_seq[1] = NULL;
6242 ok_event_seq(src2, hEvent2, read_seq, broken_seq, 0);
6244 ret = recv(src2, buffer, 1, 0);
6245 ok(ret == 1 || broken(!ret), "Failed to empty buffer: %d - %d\n", ret, GetLastError());
6246 broken_seq[0] = empty_seq;
6247 broken_seq[1] = NULL;
6248 ok_event_seq(src2, hEvent2, close_seq, broken_seq, 0);
6250 ret = send(src2, "1", 1, 0);
6251 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError());
6252 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0);
6254 ret = send(src2, "1", 1, 0);
6255 ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError());
6256 ok_event_seq(src2, hEvent2, empty_seq, NULL, 0);
6258 if (useMessages)
6260 ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, 0);
6261 if (ret)
6263 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6264 goto end;
6267 ret = set_blocking(src, TRUE);
6268 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6270 ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, 0);
6271 if (ret)
6273 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6274 goto end;
6277 ret = set_blocking(src2, TRUE);
6278 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6280 else
6282 ret = WSAEventSelect(src, hEvent2, 0);
6283 if (ret)
6285 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6286 goto end;
6289 ret = set_blocking(src, TRUE);
6290 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6292 ret = WSAEventSelect(src2, hEvent2, 0);
6293 if (ret)
6295 ok(0, "WSAAsyncSelect failed, error %d\n", ret);
6296 goto end;
6299 ret = set_blocking(src2, TRUE);
6300 ok(!ret, "set_blocking failed, error %d\n", WSAGetLastError());
6303 end:
6304 if (src != INVALID_SOCKET)
6306 flush_events(src, hEvent);
6307 closesocket(src);
6309 if (src2 != INVALID_SOCKET)
6311 flush_events(src2, hEvent2);
6312 closesocket(src2);
6314 HeapFree(GetProcessHeap(), 0, buffer);
6315 if (server != INVALID_SOCKET)
6316 closesocket(server);
6317 if (dst != INVALID_SOCKET)
6318 closesocket(dst);
6319 if (dst2 != INVALID_SOCKET)
6320 closesocket(dst2);
6321 if (hThread != NULL)
6322 CloseHandle(hThread);
6323 if (hWnd != NULL)
6324 DestroyWindow(hWnd);
6325 if (hEvent != NULL)
6326 CloseHandle(hEvent);
6327 if (hEvent2 != NULL)
6328 CloseHandle(hEvent2);
6329 if (ov.hEvent != NULL)
6330 CloseHandle(ov.hEvent);
6331 if (ov2.hEvent != NULL)
6332 CloseHandle(ov2.hEvent);
6335 static void test_ipv6only(void)
6337 SOCKET v4 = INVALID_SOCKET, v6;
6338 struct sockaddr_in sin4;
6339 struct sockaddr_in6 sin6;
6340 int ret, enabled, len = sizeof(enabled);
6342 memset(&sin4, 0, sizeof(sin4));
6343 sin4.sin_family = AF_INET;
6344 sin4.sin_port = htons(SERVERPORT);
6346 memset(&sin6, 0, sizeof(sin6));
6347 sin6.sin6_family = AF_INET6;
6348 sin6.sin6_port = htons(SERVERPORT);
6350 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
6351 if (v6 == INVALID_SOCKET)
6353 skip("Could not create IPv6 socket (LastError: %d)\n", WSAGetLastError());
6354 goto end;
6357 enabled = 2;
6358 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6359 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6360 ok(enabled == 1, "expected 1, got %d\n", enabled);
6362 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
6363 if (ret)
6365 skip("Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
6366 goto end;
6369 v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
6370 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
6372 todo_wine {
6373 enabled = 2;
6374 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6375 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6376 ok(enabled == 1, "expected 1, got %d\n", enabled);
6379 enabled = 0;
6380 len = sizeof(enabled);
6381 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6382 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6384 todo_wine {
6385 enabled = 2;
6386 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6387 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6388 ok(!enabled, "expected 0, got %d\n", enabled);
6391 enabled = 1;
6392 len = sizeof(enabled);
6393 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6394 ok(!ret, "setsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6396 /* bind on IPv4 socket should succeed - IPV6_V6ONLY is enabled by default */
6397 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
6398 ok(!ret, "Could not bind IPv4 address (LastError: %d)\n", WSAGetLastError());
6400 todo_wine {
6401 enabled = 2;
6402 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6403 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6404 ok(enabled == 1, "expected 1, got %d\n", enabled);
6407 enabled = 0;
6408 len = sizeof(enabled);
6409 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6410 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
6412 todo_wine {
6413 enabled = 0;
6414 ret = getsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6415 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6416 ok(enabled == 1, "expected 1, got %d\n", enabled);
6419 enabled = 1;
6420 len = sizeof(enabled);
6421 ret = setsockopt(v4, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6422 ok(ret, "setsockopt(IPV6_ONLY) succeeded (LastError: %d)\n", WSAGetLastError());
6424 closesocket(v4);
6425 closesocket(v6);
6427 /* Test again, this time disabling IPV6_V6ONLY. */
6428 sin4.sin_port = htons(SERVERPORT+2);
6429 sin6.sin6_port = htons(SERVERPORT+2);
6431 v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
6432 ok(v6 != INVALID_SOCKET, "Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
6433 WSAGetLastError(), WSAEAFNOSUPPORT);
6435 enabled = 0;
6436 ret = setsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, len);
6437 ok(!ret, "Could not disable IPV6_V6ONLY (LastError: %d).\n", WSAGetLastError());
6439 enabled = 2;
6440 ret = getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6441 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6442 ok(!enabled, "expected 0, got %d\n", enabled);
6445 Observaition:
6446 On Windows, bind on both IPv4 and IPv6 with IPV6_V6ONLY disabled succeeds by default.
6447 Application must set SO_EXCLUSIVEADDRUSE on first socket to disallow another successful bind.
6448 In general, a standard application should not use SO_REUSEADDR.
6449 Setting both SO_EXCLUSIVEADDRUSE and SO_REUSEADDR on the same socket is not possible in
6450 either order, the later setsockopt call always fails.
6452 enabled = 1;
6453 ret = setsockopt(v6, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&enabled, len);
6454 ok(!ret, "Could not set SO_EXCLUSIVEADDRUSE on IPv6 socket (LastError: %d)\n", WSAGetLastError());
6456 ret = bind(v6, (struct sockaddr*)&sin6, sizeof(sin6));
6457 ok(!ret, "Could not bind IPv6 address (LastError: %d)\n", WSAGetLastError());
6459 enabled = 2;
6460 len = sizeof(enabled);
6461 getsockopt(v6, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&enabled, &len);
6462 ok(!ret, "getsockopt(IPV6_ONLY) failed (LastError: %d)\n", WSAGetLastError());
6463 ok(!enabled, "IPV6_V6ONLY is enabled after bind\n");
6465 v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
6466 ok(v4 != INVALID_SOCKET, "Could not create IPv4 socket (LastError: %d)\n", WSAGetLastError());
6468 enabled = 1;
6469 ret = setsockopt(v4, SOL_SOCKET, SO_REUSEADDR, (char*)&enabled, len);
6470 ok(!ret, "Could not set SO_REUSEADDR on IPv4 socket (LastError: %d)\n", WSAGetLastError());
6472 WSASetLastError(0xdeadbeef);
6473 ret = bind(v4, (struct sockaddr*)&sin4, sizeof(sin4));
6474 ok(ret, "bind succeeded unexpectedly for the IPv4 socket\n");
6475 ok(WSAGetLastError() == WSAEACCES, "Expected 10013, got %d\n", WSAGetLastError());
6477 end:
6478 if (v4 != INVALID_SOCKET)
6479 closesocket(v4);
6480 if (v6 != INVALID_SOCKET)
6481 closesocket(v6);
6484 static void test_WSASendMsg(void)
6486 SOCKET sock, dst;
6487 struct sockaddr_in sendaddr, sockaddr;
6488 GUID WSASendMsg_GUID = WSAID_WSASENDMSG;
6489 LPFN_WSASENDMSG pWSASendMsg = NULL;
6490 char teststr[12] = "hello world", buffer[32];
6491 WSABUF iovec[2];
6492 WSAMSG msg;
6493 DWORD bytesSent, err;
6494 int ret, addrlen;
6496 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
6498 sock = socket(AF_INET, SOCK_DGRAM, 0);
6499 ok(sock != INVALID_SOCKET, "socket() failed\n");
6501 /* Obtain the WSASendMsg function */
6502 WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &WSASendMsg_GUID, sizeof(WSASendMsg_GUID),
6503 &pWSASendMsg, sizeof(pWSASendMsg), &err, NULL, NULL);
6504 if (!pWSASendMsg)
6506 closesocket(sock);
6507 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
6508 return;
6511 /* fake address for now */
6512 sendaddr.sin_family = AF_INET;
6513 sendaddr.sin_port = htons(139);
6514 sendaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6516 memset(&msg, 0, sizeof(msg));
6517 iovec[0].buf = teststr;
6518 iovec[0].len = sizeof(teststr);
6519 iovec[1].buf = teststr;
6520 iovec[1].len = sizeof(teststr) / 2;
6521 msg.name = (struct sockaddr *) &sendaddr;
6522 msg.namelen = sizeof(sendaddr);
6523 msg.lpBuffers = iovec;
6524 msg.dwBufferCount = 1; /* send only one buffer for now */
6526 WSASetLastError(0xdeadbeef);
6527 ret = pWSASendMsg(INVALID_SOCKET, &msg, 0, NULL, NULL, NULL);
6528 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6529 err = WSAGetLastError();
6530 ok(err == WSAENOTSOCK, "expected 10038, got %d instead\n", err);
6532 WSASetLastError(0xdeadbeef);
6533 ret = pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL);
6534 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6535 err = WSAGetLastError();
6536 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6538 WSASetLastError(0xdeadbeef);
6539 ret = pWSASendMsg(sock, NULL, 0, &bytesSent, NULL, NULL);
6540 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6541 err = WSAGetLastError();
6542 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6544 WSASetLastError(0xdeadbeef);
6545 ret = pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL);
6546 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6547 err = WSAGetLastError();
6548 ok(err == WSAEFAULT, "expected 10014, got %d instead\n", err);
6550 closesocket(sock);
6552 sock = socket(AF_INET, SOCK_DGRAM, 0);
6553 ok(sock != INVALID_SOCKET, "socket() failed\n");
6555 dst = socket(AF_INET, SOCK_DGRAM, 0);
6556 ok(dst != INVALID_SOCKET, "socket() failed\n");
6558 memset(&sockaddr, 0, sizeof(sockaddr));
6559 sockaddr.sin_family = AF_INET;
6560 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6561 ok(!bind(dst, (struct sockaddr*)&sockaddr, sizeof(sockaddr)),
6562 "bind should have worked\n");
6564 /* read address to find out the port number to be used in send */
6565 memset(&sendaddr, 0, sizeof(sendaddr));
6566 addrlen = sizeof(sendaddr);
6567 ok(!getsockname(dst, (struct sockaddr *) &sendaddr, &addrlen),
6568 "getsockname should have worked\n");
6569 ok(sendaddr.sin_port, "socket port should be != 0\n");
6571 /* ensure the sending socket is not bound */
6572 WSASetLastError(0xdeadbeef);
6573 addrlen = sizeof(sockaddr);
6574 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen);
6575 ok(ret == SOCKET_ERROR, "getsockname should have failed\n");
6576 err = WSAGetLastError();
6577 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err);
6579 set_blocking(sock, TRUE);
6581 bytesSent = 0;
6582 SetLastError(0xdeadbeef);
6583 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6584 ok(!ret, "WSASendMsg should have worked\n");
6585 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6586 "Expected 0, got %d\n", GetLastError());
6587 ok(bytesSent == iovec[0].len, "incorret bytes sent, expected %d, sent %d\n",
6588 iovec[0].len, bytesSent);
6590 /* receive data */
6591 addrlen = sizeof(sockaddr);
6592 memset(buffer, 0, sizeof(buffer));
6593 SetLastError(0xdeadbeef);
6594 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen);
6595 ok(ret == bytesSent, "got %d, expected %d\n",
6596 ret, bytesSent);
6597 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6599 /* A successful call to WSASendMsg must have bound the socket */
6600 addrlen = sizeof(sockaddr);
6601 sockaddr.sin_port = 0;
6602 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6603 ret = getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen);
6604 ok(!ret, "getsockname should have worked\n");
6605 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n",
6606 inet_ntoa(sockaddr.sin_addr));
6607 ok(sockaddr.sin_port, "sin_port should be != 0\n");
6609 msg.dwBufferCount = 2; /* send both buffers */
6611 bytesSent = 0;
6612 SetLastError(0xdeadbeef);
6613 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6614 ok(!ret, "WSASendMsg should have worked\n");
6615 ok(bytesSent == iovec[0].len + iovec[1].len, "incorret bytes sent, expected %d, sent %d\n",
6616 iovec[0].len + iovec[1].len, bytesSent);
6617 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6618 "Expected 0, got %d\n", GetLastError());
6620 /* receive data */
6621 addrlen = sizeof(sockaddr);
6622 memset(buffer, 0, sizeof(buffer));
6623 SetLastError(0xdeadbeef);
6624 ret = recvfrom(dst, buffer, sizeof(buffer), 0, (struct sockaddr *) &sockaddr, &addrlen);
6625 ok(ret == bytesSent, "got %d, expected %d\n",
6626 ret, bytesSent);
6627 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6629 closesocket(sock);
6630 closesocket(dst);
6632 /* a bad call to WSASendMsg will also bind the socket */
6633 addrlen = sizeof(sockaddr);
6634 sockaddr.sin_port = 0;
6635 sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
6636 sock = socket(AF_INET, SOCK_DGRAM, 0);
6637 ok(sock != INVALID_SOCKET, "socket() failed\n");
6638 ok(pWSASendMsg(sock, &msg, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n");
6639 todo_wine {
6640 ok(!getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have worked\n");
6641 ok(sockaddr.sin_addr.s_addr == htonl(INADDR_ANY), "expected 0.0.0.0, got %s\n",
6642 inet_ntoa(sockaddr.sin_addr));
6643 ok(sockaddr.sin_port, "sin_port should be > 0\n");
6645 closesocket(sock);
6647 /* a bad call without msg parameter will not trigger the auto-bind */
6648 sock = socket(AF_INET, SOCK_DGRAM, 0);
6649 ok(sock != INVALID_SOCKET, "socket() failed\n");
6650 ok(pWSASendMsg(sock, NULL, 0, NULL, NULL, NULL) == SOCKET_ERROR, "WSASendMsg should have failed\n");
6651 ok(getsockname(sock, (struct sockaddr*)&sockaddr, &addrlen), "getsockname should have failed\n");
6652 err = WSAGetLastError();
6653 ok(err == WSAEINVAL, "expected 10022, got %d instead\n", err);
6654 closesocket(sock);
6656 /* SOCK_STREAM sockets are not supported */
6657 bytesSent = 0;
6658 sock = socket(AF_INET, SOCK_STREAM, 0);
6659 ok(sock != INVALID_SOCKET, "socket() failed\n");
6660 SetLastError(0xdeadbeef);
6661 ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
6662 ok(ret == SOCKET_ERROR, "WSASendMsg should have failed\n");
6663 err = WSAGetLastError();
6664 todo_wine
6665 ok(err == WSAEINVAL, "expected 10014, got %d instead\n", err);
6666 closesocket(sock);
6669 static void test_WSASendTo(void)
6671 SOCKET s;
6672 struct sockaddr_in addr;
6673 char buf[12] = "hello world";
6674 WSABUF data_buf;
6675 DWORD bytesSent;
6676 int ret;
6678 addr.sin_family = AF_INET;
6679 addr.sin_port = htons(139);
6680 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
6681 data_buf.len = sizeof(buf);
6682 data_buf.buf = buf;
6684 if( (s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
6685 ok(0, "socket() failed error: %d\n", WSAGetLastError());
6686 return;
6689 WSASetLastError(12345);
6690 ret = WSASendTo(INVALID_SOCKET, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL);
6691 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAENOTSOCK,
6692 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError());
6694 WSASetLastError(12345);
6695 ret = WSASendTo(s, &data_buf, 1, NULL, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL);
6696 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
6697 "WSASendTo() failed: %d/%d\n", ret, WSAGetLastError());
6699 WSASetLastError(12345);
6700 if(WSASendTo(s, &data_buf, 1, &bytesSent, 0, (struct sockaddr*)&addr, sizeof(addr), NULL, NULL)) {
6701 ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError());
6702 return;
6704 ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
6705 "a successful call to WSASendTo()\n");
6708 static DWORD WINAPI recv_thread(LPVOID arg)
6710 SOCKET sock = *(SOCKET *)arg;
6711 char buffer[32];
6712 WSABUF wsa;
6713 WSAOVERLAPPED ov;
6714 DWORD flags = 0;
6716 wsa.buf = buffer;
6717 wsa.len = sizeof(buffer);
6718 ov.hEvent = WSACreateEvent();
6719 WSARecv(sock, &wsa, 1, NULL, &flags, &ov, NULL);
6721 WaitForSingleObject(ov.hEvent, 1000);
6722 WSACloseEvent(ov.hEvent);
6723 return 0;
6726 static int completion_called;
6728 static void WINAPI io_completion(DWORD error, DWORD transferred, WSAOVERLAPPED *overlapped, DWORD flags)
6730 completion_called++;
6733 static void test_WSARecv(void)
6735 SOCKET src, dest, server = INVALID_SOCKET;
6736 char buf[20];
6737 WSABUF bufs[2];
6738 WSAOVERLAPPED ov;
6739 DWORD bytesReturned, flags, id;
6740 struct linger ling;
6741 struct sockaddr_in addr;
6742 int iret, len;
6743 DWORD dwret;
6744 BOOL bret;
6745 HANDLE thread, event = NULL, io_port;
6747 tcp_socketpair(&src, &dest);
6748 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
6750 skip("failed to create sockets\n");
6751 goto end;
6754 memset(&ov, 0, sizeof(ov));
6755 flags = 0;
6756 bufs[0].len = 2;
6757 bufs[0].buf = buf;
6759 /* Send 4 bytes and receive in two calls of 2 */
6760 SetLastError(0xdeadbeef);
6761 iret = send(src, "test", 4, 0);
6762 ok(iret == 4, "Expected 4, got %d\n", iret);
6763 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6764 SetLastError(0xdeadbeef);
6765 bytesReturned = 0xdeadbeef;
6766 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6767 ok(!iret, "Expected 0, got %d\n", iret);
6768 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned);
6769 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6770 SetLastError(0xdeadbeef);
6771 bytesReturned = 0xdeadbeef;
6772 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6773 ok(!iret, "Expected 0, got %d\n", iret);
6774 ok(bytesReturned == 2, "Expected 2, got %d\n", bytesReturned);
6775 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6777 bufs[0].len = 4;
6778 SetLastError(0xdeadbeef);
6779 iret = send(src, "test", 4, 0);
6780 ok(iret == 4, "Expected 4, got %d\n", iret);
6781 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6782 SetLastError(0xdeadbeef);
6783 bytesReturned = 0xdeadbeef;
6784 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, NULL, NULL);
6785 ok(!iret, "Expected 0, got %d\n", iret);
6786 ok(bytesReturned == 4, "Expected 4, got %d\n", bytesReturned);
6787 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6789 /* Test 2 buffers */
6790 bufs[0].len = 4;
6791 bufs[1].len = 5;
6792 bufs[1].buf = buf + 10;
6793 SetLastError(0xdeadbeef);
6794 iret = send(src, "deadbeefs", 9, 0);
6795 ok(iret == 9, "Expected 9, got %d\n", iret);
6796 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6797 SetLastError(0xdeadbeef);
6798 bytesReturned = 0xdeadbeef;
6799 iret = WSARecv(dest, bufs, 2, &bytesReturned, &flags, NULL, NULL);
6800 ok(!iret, "Expected 0, got %d\n", iret);
6801 ok(bytesReturned == 9, "Expected 9, got %d\n", bytesReturned);
6802 bufs[0].buf[4] = '\0';
6803 bufs[1].buf[5] = '\0';
6804 ok(!strcmp(bufs[0].buf, "dead"), "buf[0] doesn't match: %s != dead\n", bufs[0].buf);
6805 ok(!strcmp(bufs[1].buf, "beefs"), "buf[1] doesn't match: %s != beefs\n", bufs[1].buf);
6806 ok(GetLastError() == ERROR_SUCCESS, "Expected 0, got %d\n", GetLastError());
6808 bufs[0].len = sizeof(buf);
6809 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
6810 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
6811 if (!event)
6812 goto end;
6814 ling.l_onoff = 1;
6815 ling.l_linger = 0;
6816 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
6817 ok(!iret, "Failed to set linger %d\n", GetLastError());
6819 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, NULL);
6820 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6822 iret = WSARecv(dest, bufs, 1, &bytesReturned, &flags, &ov, NULL);
6823 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6825 closesocket(src);
6826 src = INVALID_SOCKET;
6828 dwret = WaitForSingleObject(ov.hEvent, 1000);
6829 ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %d + errno %d\n", dwret, GetLastError());
6831 bret = GetOverlappedResult((HANDLE)dest, &ov, &bytesReturned, FALSE);
6832 todo_wine ok(!bret && (GetLastError() == ERROR_NETNAME_DELETED || broken(GetLastError() == ERROR_IO_INCOMPLETE) /* win9x */),
6833 "Did not get disconnect event: %d, error %d\n", bret, GetLastError());
6834 ok(bytesReturned == 0, "Bytes received is %d\n", bytesReturned);
6835 closesocket(dest);
6836 dest = INVALID_SOCKET;
6838 src = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
6839 ok(src != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6840 if (src == INVALID_SOCKET) goto end;
6842 server = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
6843 ok(server != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6844 if (server == INVALID_SOCKET) goto end;
6846 memset(&addr, 0, sizeof(addr));
6847 addr.sin_family = AF_INET;
6848 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
6849 iret = bind(server, (struct sockaddr *)&addr, sizeof(addr));
6850 if (iret) goto end;
6852 len = sizeof(addr);
6853 iret = getsockname(server, (struct sockaddr *)&addr, &len);
6854 if (iret) goto end;
6856 iret = listen(server, 1);
6857 if (iret) goto end;
6859 iret = connect(src, (struct sockaddr *)&addr, sizeof(addr));
6860 if (iret) goto end;
6862 len = sizeof(addr);
6863 dest = accept(server, (struct sockaddr *)&addr, &len);
6864 ok(dest != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError());
6865 if (dest == INVALID_SOCKET) goto end;
6867 send(src, "test message", sizeof("test message"), 0);
6868 thread = CreateThread(NULL, 0, recv_thread, &dest, 0, &id);
6869 WaitForSingleObject(thread, 3000);
6870 CloseHandle(thread);
6872 memset(&ov, 0, sizeof(ov));
6873 ov.hEvent = event;
6874 ResetEvent(event);
6875 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion);
6876 ok(iret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING, "WSARecv failed - %d error %d\n", iret, GetLastError());
6877 send(src, "test message", sizeof("test message"), 0);
6879 completion_called = 0;
6880 dwret = SleepEx(1000, TRUE);
6881 ok(dwret == WAIT_IO_COMPLETION, "got %u\n", dwret);
6882 ok(completion_called == 1, "completion not called\n");
6884 dwret = WaitForSingleObject(event, 1);
6885 ok(dwret == WAIT_TIMEOUT, "got %u\n", dwret);
6887 io_port = CreateIoCompletionPort( (HANDLE)dest, NULL, 0, 0 );
6888 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
6890 /* Using completion function on socket associated with completion port is not allowed. */
6891 memset(&ov, 0, sizeof(ov));
6892 completion_called = 0;
6893 iret = WSARecv(dest, bufs, 1, NULL, &flags, &ov, io_completion);
6894 ok(iret == SOCKET_ERROR && GetLastError() == WSAEINVAL, "WSARecv failed - %d error %d\n", iret, GetLastError());
6895 ok(!completion_called, "completion called\n");
6897 CloseHandle(io_port);
6899 end:
6900 if (server != INVALID_SOCKET)
6901 closesocket(server);
6902 if (dest != INVALID_SOCKET)
6903 closesocket(dest);
6904 if (src != INVALID_SOCKET)
6905 closesocket(src);
6906 if (event)
6907 WSACloseEvent(event);
6910 struct write_watch_thread_args
6912 int func;
6913 SOCKET dest;
6914 void *base;
6915 DWORD size;
6916 const char *expect;
6919 static DWORD CALLBACK write_watch_thread( void *arg )
6921 struct write_watch_thread_args *args = arg;
6922 struct sockaddr addr;
6923 int addr_len = sizeof(addr), ret;
6924 DWORD bytes, flags = 0;
6925 WSABUF buf[1];
6927 switch (args->func)
6929 case 0:
6930 ret = recv( args->dest, args->base, args->size, 0 );
6931 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
6932 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6933 break;
6934 case 1:
6935 ret = recvfrom( args->dest, args->base, args->size, 0, &addr, &addr_len );
6936 ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
6937 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6938 break;
6939 case 2:
6940 buf[0].len = args->size;
6941 buf[0].buf = args->base;
6942 ret = WSARecv( args->dest, buf, 1, &bytes, &flags, NULL, NULL );
6943 ok( !ret, "WSARecv failed %u\n", GetLastError() );
6944 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
6945 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6946 break;
6947 case 3:
6948 buf[0].len = args->size;
6949 buf[0].buf = args->base;
6950 ret = WSARecvFrom( args->dest, buf, 1, &bytes, &flags, &addr, &addr_len, NULL, NULL );
6951 ok( !ret, "WSARecvFrom failed %u\n", GetLastError() );
6952 ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
6953 ok( !strcmp( args->base, args->expect ), "wrong data\n" );
6954 break;
6956 return 0;
6959 static void test_write_watch(void)
6961 SOCKET src, dest;
6962 WSABUF bufs[2];
6963 WSAOVERLAPPED ov;
6964 struct write_watch_thread_args args;
6965 DWORD bytesReturned, flags, size;
6966 struct sockaddr addr;
6967 int addr_len, ret;
6968 HANDLE thread, event;
6969 char *base;
6970 void *results[64];
6971 ULONG_PTR count;
6972 ULONG pagesize;
6973 UINT (WINAPI *pGetWriteWatch)(DWORD,LPVOID,SIZE_T,LPVOID*,ULONG_PTR*,ULONG*);
6975 pGetWriteWatch = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" );
6976 if (!pGetWriteWatch)
6978 win_skip( "write watched not supported\n" );
6979 return;
6982 tcp_socketpair(&src, &dest);
6983 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
6985 skip("failed to create sockets\n");
6986 return;
6989 memset(&ov, 0, sizeof(ov));
6990 ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
6991 ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
6993 flags = 0;
6995 size = 0x10000;
6996 base = VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_WRITE_WATCH, PAGE_READWRITE );
6997 ok( base != NULL, "VirtualAlloc failed %u\n", GetLastError() );
6999 memset( base, 0, size );
7000 count = 64;
7001 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7002 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7003 ok( count == 16, "wrong count %lu\n", count );
7005 bufs[0].len = 5;
7006 bufs[0].buf = base;
7007 bufs[1].len = 0x8000;
7008 bufs[1].buf = base + 0x4000;
7010 ret = WSARecv( dest, bufs, 2, NULL, &flags, &ov, NULL);
7011 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
7012 "WSARecv failed - %d error %d\n", ret, GetLastError());
7014 count = 64;
7015 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7016 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7017 ok( count == 9, "wrong count %lu\n", count );
7018 ok( !base[0], "data set\n" );
7020 send(src, "test message", sizeof("test message"), 0);
7022 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7023 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7024 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7025 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7026 ok( !memcmp( base + 0x4000, "message", 8 ), "wrong data %s\n", base + 0x4000 );
7028 count = 64;
7029 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7030 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7031 ok( count == 0, "wrong count %lu\n", count );
7033 memset( base, 0, size );
7034 count = 64;
7035 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7036 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7037 ok( count == 16, "wrong count %lu\n", count );
7039 bufs[1].len = 0x4000;
7040 bufs[1].buf = base + 0x2000;
7041 ret = WSARecvFrom( dest, bufs, 2, NULL, &flags, &addr, &addr_len, &ov, NULL);
7042 ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
7043 "WSARecv failed - %d error %d\n", ret, GetLastError());
7045 count = 64;
7046 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7047 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7048 ok( count == 5, "wrong count %lu\n", count );
7049 ok( !base[0], "data set\n" );
7051 send(src, "test message", sizeof("test message"), 0);
7053 ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
7054 ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
7055 ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
7056 ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
7057 ok( !memcmp( base + 0x2000, "message", 8 ), "wrong data %s\n", base + 0x2000 );
7059 count = 64;
7060 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7061 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7062 ok( count == 0, "wrong count %lu\n", count );
7064 memset( base, 0, size );
7065 count = 64;
7066 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7067 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7068 ok( count == 16, "wrong count %lu\n", count );
7070 args.dest = dest;
7071 args.base = base;
7072 args.size = 0x7002;
7073 args.expect = "test message";
7074 for (args.func = 0; args.func < 4; args.func++)
7076 thread = CreateThread( NULL, 0, write_watch_thread, &args, 0, NULL );
7077 Sleep( 200 );
7079 count = 64;
7080 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7081 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7082 ok( count == 8, "wrong count %lu\n", count );
7084 send(src, "test message", sizeof("test message"), 0);
7085 WaitForSingleObject( thread, 10000 );
7086 CloseHandle( thread );
7088 count = 64;
7089 ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
7090 ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
7091 ok( count == 0, "wrong count %lu\n", count );
7093 WSACloseEvent( event );
7094 closesocket( dest );
7095 closesocket( src );
7096 VirtualFree( base, 0, MEM_FREE );
7099 #define POLL_CLEAR() ix = 0
7100 #define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;}
7101 #define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
7102 static BOOL poll_isset(WSAPOLLFD *fds, int max, SOCKET s, int rev)
7104 int k;
7105 for (k = 0; k < max; k++)
7106 if (fds[k].fd == s && (fds[k].revents == rev)) return TRUE;
7107 return FALSE;
7110 static void test_WSAPoll(void)
7112 int ix, ret, err, poll_timeout;
7113 SOCKET fdListen, fdRead, fdWrite;
7114 struct sockaddr_in address;
7115 socklen_t len;
7116 static char tmp_buf[1024];
7117 WSAPOLLFD fds[16];
7118 HANDLE thread_handle;
7119 DWORD id;
7121 if (!pWSAPoll) /* >= Vista */
7123 skip("WSAPoll is unsupported, some tests will be skipped.\n");
7124 return;
7127 /* Invalid parameters test */
7128 SetLastError(0xdeadbeef);
7129 ret = pWSAPoll(NULL, 0, 0);
7130 err = GetLastError();
7131 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7132 ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7133 SetLastError(0xdeadbeef);
7134 ret = pWSAPoll(NULL, 1, 0);
7135 err = GetLastError();
7136 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7137 ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7138 SetLastError(0xdeadbeef);
7139 ret = pWSAPoll(NULL, 0, 1);
7140 err = GetLastError();
7141 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7142 ok(err == WSAEINVAL, "expected 10022, got %d\n", err);
7143 SetLastError(0xdeadbeef);
7144 ret = pWSAPoll(NULL, 1, 1);
7145 err = GetLastError();
7146 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7147 ok(err == WSAEFAULT, "expected 10014, got %d\n", err);
7149 /* WSAPoll() tries to mime the unix poll() call. The following tests do:
7150 * - check if a connection attempt ended with success or error;
7151 * - check if a pending connection is waiting for acceptance;
7152 * - check for data to read, availability for write and OOB data
7154 memset(&address, 0, sizeof(address));
7155 address.sin_addr.s_addr = inet_addr("127.0.0.1");
7156 address.sin_family = AF_INET;
7157 len = sizeof(address);
7158 fdListen = setup_server_socket(&address, &len);
7159 poll_timeout = 100;
7161 /* When no events are pending poll returns 0 with no error */
7162 POLL_CLEAR();
7163 POLL_SET(fdListen, POLLIN);
7164 ret = pWSAPoll(fds, ix, poll_timeout);
7165 ok(ret == 0, "expected 0, got %d\n", ret);
7167 /* Test listening socket connection attempt notifications */
7168 fdWrite = setup_connector_socket(&address, len, TRUE);
7169 POLL_CLEAR();
7170 POLL_SET(fdListen, POLLIN | POLLOUT);
7171 ret = pWSAPoll(fds, ix, poll_timeout);
7172 ok(ret == 1, "expected 1, got %d\n", ret);
7173 ok(POLL_ISSET(fdListen, POLLRDNORM), "fdListen socket events incorrect\n");
7174 len = sizeof(address);
7175 fdRead = accept(fdListen, (struct sockaddr*) &address, &len);
7176 ok(fdRead != INVALID_SOCKET, "expected a valid socket\n");
7178 /* Test client side connection attempt notifications */
7179 POLL_CLEAR();
7180 POLL_SET(fdListen, POLLIN | POLLOUT);
7181 POLL_SET(fdRead, POLLIN | POLLOUT);
7182 POLL_SET(fdWrite, POLLIN | POLLOUT);
7183 ret = pWSAPoll(fds, ix, poll_timeout);
7184 ok(ret == 2, "expected 2, got %d\n", ret);
7185 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7186 ok(POLL_ISSET(fdRead, POLLWRNORM), "fdRead socket events incorrect\n");
7187 len = sizeof(id);
7188 id = 0xdeadbeef;
7189 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7190 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7191 ok(id == 0, "expected 0, got %d\n", id);
7193 /* Test data receiving notifications */
7194 ret = send(fdWrite, "1234", 4, 0);
7195 ok(ret == 4, "expected 4, got %d\n", ret);
7196 POLL_CLEAR();
7197 POLL_SET(fdListen, POLLIN | POLLOUT);
7198 POLL_SET(fdRead, POLLIN);
7199 ret = pWSAPoll(fds, ix, poll_timeout);
7200 ok(ret == 1, "expected 1, got %d\n", ret);
7201 ok(POLL_ISSET(fdRead, POLLRDNORM), "fdRead socket events incorrect\n");
7202 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7203 ok(ret == 4, "expected 4, got %d\n", ret);
7204 ok(!strcmp(tmp_buf, "1234"), "data received differs from sent\n");
7206 /* Test OOB data notifications */
7207 ret = send(fdWrite, "A", 1, MSG_OOB);
7208 ok(ret == 1, "expected 1, got %d\n", ret);
7209 POLL_CLEAR();
7210 POLL_SET(fdListen, POLLIN | POLLOUT);
7211 POLL_SET(fdRead, POLLIN);
7212 ret = pWSAPoll(fds, ix, poll_timeout);
7213 ok(ret == 1, "expected 1, got %d\n", ret);
7214 ok(POLL_ISSET(fdRead, POLLRDBAND), "fdRead socket events incorrect\n");
7215 tmp_buf[0] = 0xAF;
7216 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7217 ok(ret == 1, "expected 1, got %d\n", ret);
7218 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7220 /* If the socket is OOBINLINED the notification is like normal data */
7221 ret = 1;
7222 ret = setsockopt(fdRead, SOL_SOCKET, SO_OOBINLINE, (char*) &ret, sizeof(ret));
7223 ok(ret == 0, "expected 0, got %d\n", ret);
7224 ret = send(fdWrite, "A", 1, MSG_OOB);
7225 ok(ret == 1, "expected 1, got %d\n", ret);
7226 POLL_CLEAR();
7227 POLL_SET(fdListen, POLLIN | POLLOUT);
7228 POLL_SET(fdRead, POLLIN | POLLOUT);
7229 ret = pWSAPoll(fds, ix, poll_timeout);
7230 ok(ret == 1, "expected 1, got %d\n", ret);
7231 tmp_buf[0] = 0xAF;
7232 SetLastError(0xdeadbeef);
7233 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), MSG_OOB);
7234 ok(ret == SOCKET_ERROR, "expected -1, got %d\n", ret);
7235 ok(GetLastError() == WSAEINVAL, "expected 10022, got %d\n", GetLastError());
7236 ret = recv(fdRead, tmp_buf, sizeof(tmp_buf), 0);
7237 ok(ret == 1, "expected 1, got %d\n", ret);
7238 ok(tmp_buf[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf[0]);
7240 /* Test connection closed notifications */
7241 ret = closesocket(fdRead);
7242 ok(ret == 0, "expected 0, got %d\n", ret);
7243 POLL_CLEAR();
7244 POLL_SET(fdListen, POLLIN | POLLOUT);
7245 POLL_SET(fdWrite, POLLIN);
7246 ret = pWSAPoll(fds, ix, poll_timeout);
7247 ok(ret == 1, "expected 1, got %d\n", ret);
7248 ok(POLL_ISSET(fdWrite, POLLHUP), "fdWrite socket events incorrect\n");
7249 ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0);
7250 ok(ret == 0, "expected 0, got %d\n", ret);
7252 /* When a connection is attempted to a non-listening socket due to a bug
7253 * in the MS code it will never be notified. This is a long standing issue
7254 * that will never be fixed for compatibility reasons so we have to deal
7255 * with it manually. */
7256 ret = closesocket(fdWrite);
7257 ok(ret == 0, "expected 0, got %d\n", ret);
7258 ret = closesocket(fdListen);
7259 ok(ret == 0, "expected 0, got %d\n", ret);
7260 len = sizeof(address);
7261 fdWrite = setup_connector_socket(&address, len, TRUE);
7262 POLL_CLEAR();
7263 POLL_SET(fdWrite, POLLIN | POLLOUT);
7264 poll_timeout = 2000;
7265 ret = pWSAPoll(fds, ix, poll_timeout);
7266 todo_wine
7267 ok(ret == 0, "expected 0, got %d\n", ret);
7268 len = sizeof(id);
7269 id = 0xdeadbeef;
7270 err = getsockopt(fdWrite, SOL_SOCKET, SO_ERROR, (char*)&id, &len);
7271 ok(!err, "getsockopt failed with %d\n", WSAGetLastError());
7272 ok(id == WSAECONNREFUSED, "expected 10061, got %d\n", id);
7273 closesocket(fdWrite);
7275 /* Try poll() on a closed socket after connection */
7276 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7277 closesocket(fdRead);
7278 POLL_CLEAR();
7279 POLL_SET(fdWrite, POLLIN | POLLOUT);
7280 POLL_SET(fdRead, POLLIN | POLLOUT);
7281 ret = pWSAPoll(fds, ix, poll_timeout);
7282 ok(ret == 1, "expected 1, got %d\n", ret);
7283 ok(POLL_ISSET(fdRead, POLLNVAL), "fdRead socket events incorrect\n");
7284 POLL_CLEAR();
7285 POLL_SET(fdWrite, POLLIN | POLLOUT);
7286 ret = pWSAPoll(fds, ix, poll_timeout);
7287 ok(ret == 1, "expected 1, got %d\n", ret);
7288 todo_wine
7289 ok(POLL_ISSET(fdWrite, POLLWRNORM | POLLHUP) || broken(POLL_ISSET(fdWrite, POLLWRNORM)) /* <= 2008 */,
7290 "fdWrite socket events incorrect\n");
7291 closesocket(fdWrite);
7293 /* Close the socket currently being polled in a thread */
7294 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7295 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7296 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7297 POLL_CLEAR();
7298 POLL_SET(fdWrite, POLLIN | POLLOUT);
7299 ret = pWSAPoll(fds, ix, poll_timeout);
7300 ok(ret == 1, "expected 1, got %d\n", ret);
7301 ok(POLL_ISSET(fdWrite, POLLWRNORM), "fdWrite socket events incorrect\n");
7302 WaitForSingleObject (thread_handle, 1000);
7303 closesocket(fdRead);
7304 /* test again with less flags - behavior changes */
7305 ok(!tcp_socketpair(&fdRead, &fdWrite), "creating socket pair failed\n");
7306 thread_handle = CreateThread(NULL, 0, SelectCloseThread, &fdWrite, 0, &id);
7307 ok(thread_handle != NULL, "CreateThread failed unexpectedly: %d\n", GetLastError());
7308 POLL_CLEAR();
7309 POLL_SET(fdWrite, POLLIN);
7310 ret = pWSAPoll(fds, ix, poll_timeout);
7311 ok(ret == 1, "expected 1, got %d\n", ret);
7312 ok(POLL_ISSET(fdWrite, POLLNVAL), "fdWrite socket events incorrect\n");
7313 WaitForSingleObject (thread_handle, 1000);
7314 closesocket(fdRead);
7316 #undef POLL_SET
7317 #undef POLL_ISSET
7318 #undef POLL_CLEAR
7320 static void test_GetAddrInfoW(void)
7322 static const WCHAR port[] = {'8','0',0};
7323 static const WCHAR empty[] = {0};
7324 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7325 static const WCHAR nxdomain[] =
7326 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
7327 static const WCHAR zero[] = {'0',0};
7328 int i, ret;
7329 ADDRINFOW *result, *result2, *p, hint;
7330 WCHAR name[256];
7331 DWORD size = sizeof(name)/sizeof(WCHAR);
7332 /* te su to.winehq.org written in katakana */
7333 static const WCHAR idn_domain[] =
7334 {0x30C6,0x30B9,0x30C8,'.','w','i','n','e','h','q','.','o','r','g',0};
7335 static const WCHAR idn_punycode[] =
7336 {'x','n','-','-','z','c','k','z','a','h','.','w','i','n','e','h','q','.','o','r','g',0};
7338 if (!pGetAddrInfoW || !pFreeAddrInfoW)
7340 win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
7341 return;
7343 memset(&hint, 0, sizeof(ADDRINFOW));
7344 name[0] = 0;
7345 GetComputerNameExW( ComputerNamePhysicalDnsHostname, name, &size );
7347 result = (ADDRINFOW *)0xdeadbeef;
7348 WSASetLastError(0xdeadbeef);
7349 ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7350 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7351 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7352 ok(result == NULL, "got %p\n", result);
7354 result = NULL;
7355 WSASetLastError(0xdeadbeef);
7356 ret = pGetAddrInfoW(empty, NULL, NULL, &result);
7357 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7358 ok(result != NULL, "GetAddrInfoW failed\n");
7359 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7360 pFreeAddrInfoW(result);
7362 result = NULL;
7363 ret = pGetAddrInfoW(NULL, zero, NULL, &result);
7364 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7365 ok(result != NULL, "GetAddrInfoW failed\n");
7367 result2 = NULL;
7368 ret = pGetAddrInfoW(NULL, empty, NULL, &result2);
7369 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7370 ok(result2 != NULL, "GetAddrInfoW failed\n");
7371 compare_addrinfow(result, result2);
7372 pFreeAddrInfoW(result);
7373 pFreeAddrInfoW(result2);
7375 result = NULL;
7376 ret = pGetAddrInfoW(empty, zero, NULL, &result);
7377 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7378 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7379 ok(result != NULL, "GetAddrInfoW failed\n");
7381 result2 = NULL;
7382 ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7383 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7384 ok(result2 != NULL, "GetAddrInfoW failed\n");
7385 compare_addrinfow(result, result2);
7386 pFreeAddrInfoW(result);
7387 pFreeAddrInfoW(result2);
7389 result = NULL;
7390 ret = pGetAddrInfoW(localhost, NULL, NULL, &result);
7391 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7392 pFreeAddrInfoW(result);
7394 result = NULL;
7395 ret = pGetAddrInfoW(localhost, empty, NULL, &result);
7396 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7397 pFreeAddrInfoW(result);
7399 result = NULL;
7400 ret = pGetAddrInfoW(localhost, zero, NULL, &result);
7401 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7402 pFreeAddrInfoW(result);
7404 result = NULL;
7405 ret = pGetAddrInfoW(localhost, port, NULL, &result);
7406 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7407 pFreeAddrInfoW(result);
7409 result = NULL;
7410 ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7411 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7412 pFreeAddrInfoW(result);
7414 result = NULL;
7415 SetLastError(0xdeadbeef);
7416 ret = pGetAddrInfoW(localhost, port, &hint, &result);
7417 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7418 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7419 pFreeAddrInfoW(result);
7421 /* try to get information from the computer name, result is the same
7422 * as if requesting with an empty host name. */
7423 ret = pGetAddrInfoW(name, NULL, NULL, &result);
7424 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7425 ok(result != NULL, "GetAddrInfoW failed\n");
7427 ret = pGetAddrInfoW(empty, NULL, NULL, &result2);
7428 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7429 ok(result != NULL, "GetAddrInfoW failed\n");
7430 compare_addrinfow(result, result2);
7431 pFreeAddrInfoW(result);
7432 pFreeAddrInfoW(result2);
7434 ret = pGetAddrInfoW(name, empty, NULL, &result);
7435 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7436 ok(result != NULL, "GetAddrInfoW failed\n");
7438 ret = pGetAddrInfoW(empty, empty, NULL, &result2);
7439 ok(!ret, "GetAddrInfoW failed with %d\n", WSAGetLastError());
7440 ok(result != NULL, "GetAddrInfoW failed\n");
7441 compare_addrinfow(result, result2);
7442 pFreeAddrInfoW(result);
7443 pFreeAddrInfoW(result2);
7445 result = (ADDRINFOW *)0xdeadbeef;
7446 WSASetLastError(0xdeadbeef);
7447 ret = pGetAddrInfoW(NULL, NULL, NULL, &result);
7448 if(ret == 0)
7450 skip("nxdomain returned success. Broken ISP redirects?\n");
7451 return;
7453 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7454 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7455 ok(result == NULL, "got %p\n", result);
7457 result = (ADDRINFOW *)0xdeadbeef;
7458 WSASetLastError(0xdeadbeef);
7459 ret = pGetAddrInfoW(nxdomain, NULL, NULL, &result);
7460 if(ret == 0)
7462 skip("nxdomain returned success. Broken ISP redirects?\n");
7463 return;
7465 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7466 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7467 ok(result == NULL, "got %p\n", result);
7469 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7471 hint.ai_family = hinttests[i].family;
7472 hint.ai_socktype = hinttests[i].socktype;
7473 hint.ai_protocol = hinttests[i].protocol;
7475 result = NULL;
7476 SetLastError(0xdeadbeef);
7477 ret = pGetAddrInfoW(localhost, NULL, &hint, &result);
7478 if (!ret)
7480 if (hinttests[i].error)
7481 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i);
7482 else
7484 p = result;
7487 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7488 if (hinttests[i].family == AF_UNSPEC)
7489 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7490 "test %d: expected AF_INET or AF_INET6, got %d\n",
7491 i, p->ai_family);
7492 else
7493 ok(p->ai_family == hinttests[i].family,
7494 "test %d: expected family %d, got %d\n",
7495 i, hinttests[i].family, p->ai_family);
7497 ok(p->ai_socktype == hinttests[i].socktype,
7498 "test %d: expected type %d, got %d\n",
7499 i, hinttests[i].socktype, p->ai_socktype);
7500 ok(p->ai_protocol == hinttests[i].protocol,
7501 "test %d: expected protocol %d, got %d\n",
7502 i, hinttests[i].protocol, p->ai_protocol);
7503 p = p->ai_next;
7505 while (p);
7507 pFreeAddrInfoW(result);
7509 else
7511 DWORD err = WSAGetLastError();
7512 if (hinttests[i].error)
7513 ok(hinttests[i].error == err, "test %d: GetAddrInfoW failed with error %d, expected %d\n",
7514 i, err, hinttests[i].error);
7515 else
7516 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i, ret, err);
7520 /* Test IDN resolution (Internationalized Domain Names) present since Windows 8 */
7521 trace("Testing punycode IDN %s\n", wine_dbgstr_w(idn_punycode));
7522 result = NULL;
7523 ret = pGetAddrInfoW(idn_punycode, NULL, NULL, &result);
7524 ok(!ret, "got %d expected success\n", ret);
7525 ok(result != NULL, "got %p\n", result);
7526 pFreeAddrInfoW(result);
7528 hint.ai_family = AF_INET;
7529 hint.ai_socktype = 0;
7530 hint.ai_protocol = 0;
7531 hint.ai_flags = 0;
7533 result = NULL;
7534 ret = pGetAddrInfoW(idn_punycode, NULL, &hint, &result);
7535 ok(!ret, "got %d expected success\n", ret);
7536 ok(result != NULL, "got %p\n", result);
7538 trace("Testing unicode IDN %s\n", wine_dbgstr_w(idn_domain));
7539 result2 = NULL;
7540 ret = pGetAddrInfoW(idn_domain, NULL, NULL, &result2);
7541 if (ret == WSAHOST_NOT_FOUND && broken(1))
7543 pFreeAddrInfoW(result);
7544 win_skip("IDN resolution not supported in Win <= 7\n");
7545 return;
7548 ok(!ret, "got %d expected success\n", ret);
7549 ok(result2 != NULL, "got %p\n", result2);
7550 pFreeAddrInfoW(result2);
7552 hint.ai_family = AF_INET;
7553 hint.ai_socktype = 0;
7554 hint.ai_protocol = 0;
7555 hint.ai_flags = 0;
7557 result2 = NULL;
7558 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7559 ok(!ret, "got %d expected success\n", ret);
7560 ok(result2 != NULL, "got %p\n", result2);
7562 /* ensure manually resolved punycode and unicode hosts result in same data */
7563 compare_addrinfow(result, result2);
7565 pFreeAddrInfoW(result);
7566 pFreeAddrInfoW(result2);
7568 hint.ai_family = AF_INET;
7569 hint.ai_socktype = 0;
7570 hint.ai_protocol = 0;
7571 hint.ai_flags = 0;
7573 result2 = NULL;
7574 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7575 ok(!ret, "got %d expected success\n", ret);
7576 ok(result2 != NULL, "got %p\n", result2);
7577 pFreeAddrInfoW(result2);
7579 /* Disable IDN resolution and test again*/
7580 hint.ai_family = AF_INET;
7581 hint.ai_socktype = 0;
7582 hint.ai_protocol = 0;
7583 hint.ai_flags = AI_DISABLE_IDN_ENCODING;
7585 SetLastError(0xdeadbeef);
7586 result2 = NULL;
7587 ret = pGetAddrInfoW(idn_domain, NULL, &hint, &result2);
7588 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7589 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7590 ok(result2 == NULL, "got %p\n", result2);
7593 static void test_GetAddrInfoExW(void)
7595 static const WCHAR empty[] = {0};
7596 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
7597 static const WCHAR winehq[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
7598 ADDRINFOEXW *result;
7599 OVERLAPPED overlapped;
7600 HANDLE event;
7601 int ret;
7603 if (!pGetAddrInfoExW || !pGetAddrInfoExOverlappedResult)
7605 win_skip("GetAddrInfoExW and/or GetAddrInfoExOverlappedResult not present\n");
7606 return;
7609 event = WSACreateEvent();
7611 result = (ADDRINFOEXW *)0xdeadbeef;
7612 WSASetLastError(0xdeadbeef);
7613 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7614 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7615 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7616 ok(result == NULL, "got %p\n", result);
7618 result = NULL;
7619 WSASetLastError(0xdeadbeef);
7620 ret = pGetAddrInfoExW(empty, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7621 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7622 ok(result != NULL, "GetAddrInfoW failed\n");
7623 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7624 pFreeAddrInfoExW(result);
7626 result = NULL;
7627 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, NULL, NULL, NULL);
7628 ok(!ret, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7629 pFreeAddrInfoExW(result);
7631 result = (void*)0xdeadbeef;
7632 memset(&overlapped, 0xcc, sizeof(overlapped));
7633 overlapped.hEvent = event;
7634 ResetEvent(event);
7635 ret = pGetAddrInfoExW(localhost, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7636 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7637 ok(!result, "result != NULL\n");
7638 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7639 ret = pGetAddrInfoExOverlappedResult(&overlapped);
7640 ok(!ret, "overlapped result is %d\n", ret);
7641 pFreeAddrInfoExW(result);
7643 result = (void*)0xdeadbeef;
7644 memset(&overlapped, 0xcc, sizeof(overlapped));
7645 ResetEvent(event);
7646 overlapped.hEvent = event;
7647 WSASetLastError(0xdeadbeef);
7648 ret = pGetAddrInfoExW(winehq, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7649 ok(ret == ERROR_IO_PENDING, "GetAddrInfoExW failed with %d\n", WSAGetLastError());
7650 ok(WSAGetLastError() == ERROR_IO_PENDING, "expected 11001, got %d\n", WSAGetLastError());
7651 ret = overlapped.Internal;
7652 ok(ret == WSAEINPROGRESS || ret == ERROR_SUCCESS, "overlapped.Internal = %u\n", ret);
7653 ok(WaitForSingleObject(event, 1000) == WAIT_OBJECT_0, "wait failed\n");
7654 ret = pGetAddrInfoExOverlappedResult(&overlapped);
7655 ok(!ret, "overlapped result is %d\n", ret);
7656 ok(overlapped.hEvent == event, "hEvent changed %p\n", overlapped.hEvent);
7657 ok(overlapped.Internal == ERROR_SUCCESS, "overlapped.Internal = %lx\n", overlapped.Internal);
7658 ok(overlapped.Pointer == &result, "overlapped.Pointer != &result\n");
7659 ok(result != NULL, "result == NULL\n");
7660 ok(!result->ai_blob, "ai_blob != NULL\n");
7661 ok(!result->ai_bloblen, "ai_bloblen != 0\n");
7662 ok(!result->ai_provider, "ai_provider = %s\n", wine_dbgstr_guid(result->ai_provider));
7663 pFreeAddrInfoExW(result);
7665 result = (void*)0xdeadbeef;
7666 memset(&overlapped, 0xcc, sizeof(overlapped));
7667 ResetEvent(event);
7668 overlapped.hEvent = event;
7669 ret = pGetAddrInfoExW(NULL, NULL, NS_DNS, NULL, NULL, &result, NULL, &overlapped, NULL, NULL);
7670 todo_wine
7671 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7672 todo_wine
7673 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7674 ok(result == NULL, "got %p\n", result);
7675 ret = WaitForSingleObject(event, 0);
7676 todo_wine_if(ret != WAIT_TIMEOUT) /* Remove when abowe todo_wines are fixed */
7677 ok(ret == WAIT_TIMEOUT, "wait failed\n");
7679 WSACloseEvent(event);
7682 static void verify_ipv6_addrinfo(ADDRINFOA *result, const char *expectedIp)
7684 SOCKADDR_IN6 *sockaddr6;
7685 char ipBuffer[256];
7686 const char *ret;
7688 ok(result->ai_family == AF_INET6, "ai_family == %d\n", result->ai_family);
7689 ok(result->ai_addrlen >= sizeof(struct sockaddr_in6), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7690 ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7692 if (result->ai_addr != NULL)
7694 sockaddr6 = (SOCKADDR_IN6 *)result->ai_addr;
7695 ok(sockaddr6->sin6_family == AF_INET6, "ai_addr->sin6_family == %d\n", sockaddr6->sin6_family);
7696 ok(sockaddr6->sin6_port == 0, "ai_addr->sin6_port == %d\n", sockaddr6->sin6_port);
7698 ZeroMemory(ipBuffer, sizeof(ipBuffer));
7699 ret = pInetNtop(AF_INET6, &sockaddr6->sin6_addr, ipBuffer, sizeof(ipBuffer));
7700 ok(ret != NULL, "inet_ntop failed (%d)\n", WSAGetLastError());
7701 ok(strcmp(ipBuffer, expectedIp) == 0, "ai_addr->sin6_addr == '%s' (expected '%s')\n", ipBuffer, expectedIp);
7705 static void test_getaddrinfo(void)
7707 int i, ret;
7708 ADDRINFOA *result, *result2, *p, hint;
7709 SOCKADDR_IN *sockaddr;
7710 CHAR name[256], *ip;
7711 DWORD size = sizeof(name);
7713 if (!pgetaddrinfo || !pfreeaddrinfo)
7715 win_skip("getaddrinfo and/or freeaddrinfo not present\n");
7716 return;
7718 memset(&hint, 0, sizeof(ADDRINFOA));
7719 GetComputerNameExA( ComputerNamePhysicalDnsHostname, name, &size );
7721 result = (ADDRINFOA *)0xdeadbeef;
7722 WSASetLastError(0xdeadbeef);
7723 ret = pgetaddrinfo(NULL, NULL, NULL, &result);
7724 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7725 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7726 ok(result == NULL, "got %p\n", result);
7728 result = NULL;
7729 WSASetLastError(0xdeadbeef);
7730 ret = pgetaddrinfo("", NULL, NULL, &result);
7731 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7732 ok(result != NULL, "getaddrinfo failed\n");
7733 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7734 pfreeaddrinfo(result);
7736 result = NULL;
7737 ret = pgetaddrinfo(NULL, "0", NULL, &result);
7738 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7739 ok(result != NULL, "getaddrinfo failed\n");
7741 result2 = NULL;
7742 ret = pgetaddrinfo(NULL, "", NULL, &result2);
7743 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7744 ok(result2 != NULL, "getaddrinfo failed\n");
7745 compare_addrinfo(result, result2);
7746 pfreeaddrinfo(result);
7747 pfreeaddrinfo(result2);
7749 result = NULL;
7750 WSASetLastError(0xdeadbeef);
7751 ret = pgetaddrinfo("", "0", NULL, &result);
7752 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7753 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7754 ok(result != NULL, "getaddrinfo failed\n");
7756 result2 = NULL;
7757 ret = pgetaddrinfo("", "", NULL, &result2);
7758 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7759 ok(result2 != NULL, "getaddrinfo failed\n");
7760 compare_addrinfo(result, result2);
7761 pfreeaddrinfo(result);
7762 pfreeaddrinfo(result2);
7764 result = NULL;
7765 ret = pgetaddrinfo("localhost", NULL, NULL, &result);
7766 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7767 pfreeaddrinfo(result);
7769 result = NULL;
7770 ret = pgetaddrinfo("localhost", "", NULL, &result);
7771 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7772 pfreeaddrinfo(result);
7774 result = NULL;
7775 ret = pgetaddrinfo("localhost", "0", NULL, &result);
7776 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7777 pfreeaddrinfo(result);
7779 result = NULL;
7780 ret = pgetaddrinfo("localhost", "80", NULL, &result);
7781 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7782 pfreeaddrinfo(result);
7784 result = NULL;
7785 ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7786 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7787 pfreeaddrinfo(result);
7789 result = NULL;
7790 WSASetLastError(0xdeadbeef);
7791 ret = pgetaddrinfo("localhost", "80", &hint, &result);
7792 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7793 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7794 pfreeaddrinfo(result);
7796 hint.ai_flags = AI_NUMERICHOST;
7797 result = (void*)0xdeadbeef;
7798 ret = pgetaddrinfo("localhost", "80", &hint, &result);
7799 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", WSAGetLastError());
7800 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected WSAHOST_NOT_FOUND, got %d\n", WSAGetLastError());
7801 ok(!result, "result = %p\n", result);
7802 hint.ai_flags = 0;
7804 /* try to get information from the computer name, result is the same
7805 * as if requesting with an empty host name. */
7806 ret = pgetaddrinfo(name, NULL, NULL, &result);
7807 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7808 ok(result != NULL, "GetAddrInfoW failed\n");
7810 ret = pgetaddrinfo("", NULL, NULL, &result2);
7811 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7812 ok(result != NULL, "GetAddrInfoW failed\n");
7813 compare_addrinfo(result, result2);
7814 pfreeaddrinfo(result);
7815 pfreeaddrinfo(result2);
7817 ret = pgetaddrinfo(name, "", NULL, &result);
7818 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7819 ok(result != NULL, "GetAddrInfoW failed\n");
7821 ret = pgetaddrinfo("", "", NULL, &result2);
7822 ok(!ret, "getaddrinfo failed with %d\n", WSAGetLastError());
7823 ok(result != NULL, "GetAddrInfoW failed\n");
7824 compare_addrinfo(result, result2);
7825 pfreeaddrinfo(result);
7826 pfreeaddrinfo(result2);
7828 result = (ADDRINFOA *)0xdeadbeef;
7829 WSASetLastError(0xdeadbeef);
7830 ret = pgetaddrinfo("nxdomain.codeweavers.com", NULL, NULL, &result);
7831 if(ret == 0)
7833 skip("nxdomain returned success. Broken ISP redirects?\n");
7834 return;
7836 ok(ret == WSAHOST_NOT_FOUND, "got %d expected WSAHOST_NOT_FOUND\n", ret);
7837 ok(WSAGetLastError() == WSAHOST_NOT_FOUND, "expected 11001, got %d\n", WSAGetLastError());
7838 ok(result == NULL, "got %p\n", result);
7840 /* Test IPv4 address conversion */
7841 result = NULL;
7842 ret = pgetaddrinfo("192.168.1.253", NULL, NULL, &result);
7843 ok(!ret, "getaddrinfo failed with %d\n", ret);
7844 ok(result->ai_family == AF_INET, "ai_family == %d\n", result->ai_family);
7845 ok(result->ai_addrlen >= sizeof(struct sockaddr_in), "ai_addrlen == %d\n", (int)result->ai_addrlen);
7846 ok(result->ai_addr != NULL, "ai_addr == NULL\n");
7847 sockaddr = (SOCKADDR_IN *)result->ai_addr;
7848 ok(sockaddr->sin_family == AF_INET, "ai_addr->sin_family == %d\n", sockaddr->sin_family);
7849 ok(sockaddr->sin_port == 0, "ai_addr->sin_port == %d\n", sockaddr->sin_port);
7851 ip = inet_ntoa(sockaddr->sin_addr);
7852 ok(strcmp(ip, "192.168.1.253") == 0, "sockaddr->ai_addr == '%s'\n", ip);
7853 pfreeaddrinfo(result);
7855 /* Test IPv4 address conversion with port */
7856 result = NULL;
7857 hint.ai_flags = AI_NUMERICHOST;
7858 ret = pgetaddrinfo("192.168.1.253:1024", NULL, &hint, &result);
7859 hint.ai_flags = 0;
7860 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo returned unexpected result: %d\n", ret);
7861 ok(result == NULL, "expected NULL, got %p\n", result);
7863 /* Test IPv6 address conversion */
7864 result = NULL;
7865 SetLastError(0xdeadbeef);
7866 ret = pgetaddrinfo("2a00:2039:dead:beef:cafe::6666", NULL, NULL, &result);
7868 if (result != NULL)
7870 ok(!ret, "getaddrinfo failed with %d\n", ret);
7871 verify_ipv6_addrinfo(result, "2a00:2039:dead:beef:cafe::6666");
7872 pfreeaddrinfo(result);
7874 /* Test IPv6 address conversion with brackets */
7875 result = NULL;
7876 ret = pgetaddrinfo("[beef::cafe]", NULL, NULL, &result);
7877 ok(!ret, "getaddrinfo failed with %d\n", ret);
7878 verify_ipv6_addrinfo(result, "beef::cafe");
7879 pfreeaddrinfo(result);
7881 /* Test IPv6 address conversion with brackets and hints */
7882 memset(&hint, 0, sizeof(ADDRINFOA));
7883 hint.ai_flags = AI_NUMERICHOST;
7884 hint.ai_family = AF_INET6;
7885 result = NULL;
7886 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7887 ok(!ret, "getaddrinfo failed with %d\n", ret);
7888 verify_ipv6_addrinfo(result, "beef::cafe");
7889 pfreeaddrinfo(result);
7891 memset(&hint, 0, sizeof(ADDRINFOA));
7892 hint.ai_flags = AI_NUMERICHOST;
7893 hint.ai_family = AF_INET;
7894 result = NULL;
7895 ret = pgetaddrinfo("[beef::cafe]", NULL, &hint, &result);
7896 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7898 /* Test IPv6 address conversion with brackets and port */
7899 result = NULL;
7900 ret = pgetaddrinfo("[beef::cafe]:10239", NULL, NULL, &result);
7901 ok(!ret, "getaddrinfo failed with %d\n", ret);
7902 verify_ipv6_addrinfo(result, "beef::cafe");
7903 pfreeaddrinfo(result);
7905 /* Test IPv6 address conversion with unmatched brackets */
7906 result = NULL;
7907 hint.ai_flags = AI_NUMERICHOST;
7908 ret = pgetaddrinfo("[beef::cafe", NULL, &hint, &result);
7909 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7911 ret = pgetaddrinfo("beef::cafe]", NULL, &hint, &result);
7912 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7914 else
7916 ok(ret == WSAHOST_NOT_FOUND, "getaddrinfo failed with %d\n", ret);
7917 win_skip("getaddrinfo does not support IPV6\n");
7920 hint.ai_flags = 0;
7922 for (i = 0;i < (sizeof(hinttests) / sizeof(hinttests[0]));i++)
7924 hint.ai_family = hinttests[i].family;
7925 hint.ai_socktype = hinttests[i].socktype;
7926 hint.ai_protocol = hinttests[i].protocol;
7928 result = NULL;
7929 SetLastError(0xdeadbeef);
7930 ret = pgetaddrinfo("localhost", NULL, &hint, &result);
7931 if(!ret)
7933 if (hinttests[i].error)
7934 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i);
7935 else
7937 p = result;
7940 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7941 if (hinttests[i].family == AF_UNSPEC)
7942 ok(p->ai_family == AF_INET || p->ai_family == AF_INET6,
7943 "test %d: expected AF_INET or AF_INET6, got %d\n",
7944 i, p->ai_family);
7945 else
7946 ok(p->ai_family == hinttests[i].family,
7947 "test %d: expected family %d, got %d\n",
7948 i, hinttests[i].family, p->ai_family);
7950 ok(p->ai_socktype == hinttests[i].socktype,
7951 "test %d: expected type %d, got %d\n",
7952 i, hinttests[i].socktype, p->ai_socktype);
7953 ok(p->ai_protocol == hinttests[i].protocol,
7954 "test %d: expected protocol %d, got %d\n",
7955 i, hinttests[i].protocol, p->ai_protocol);
7956 p = p->ai_next;
7958 while (p);
7960 pfreeaddrinfo(result);
7962 else
7964 DWORD err = WSAGetLastError();
7965 if (hinttests[i].error)
7966 ok(hinttests[i].error == err, "test %d: getaddrinfo failed with error %d, expected %d\n",
7967 i, err, hinttests[i].error);
7968 else
7969 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i, ret, err);
7974 static void test_ConnectEx(void)
7976 SOCKET listener = INVALID_SOCKET;
7977 SOCKET acceptor = INVALID_SOCKET;
7978 SOCKET connector = INVALID_SOCKET;
7979 struct sockaddr_in address, conaddress;
7980 int addrlen;
7981 OVERLAPPED overlapped;
7982 LPFN_CONNECTEX pConnectEx;
7983 GUID connectExGuid = WSAID_CONNECTEX;
7984 DWORD bytesReturned;
7985 char buffer[1024];
7986 BOOL bret;
7987 DWORD dwret;
7988 int iret;
7990 memset(&overlapped, 0, sizeof(overlapped));
7992 listener = socket(AF_INET, SOCK_STREAM, 0);
7993 if (listener == INVALID_SOCKET) {
7994 skip("could not create listener socket, error %d\n", WSAGetLastError());
7995 goto end;
7998 connector = socket(AF_INET, SOCK_STREAM, 0);
7999 if (connector == INVALID_SOCKET) {
8000 skip("could not create connector socket, error %d\n", WSAGetLastError());
8001 goto end;
8004 memset(&address, 0, sizeof(address));
8005 address.sin_family = AF_INET;
8006 address.sin_addr.s_addr = inet_addr("127.0.0.1");
8007 iret = bind(listener, (struct sockaddr*)&address, sizeof(address));
8008 if (iret != 0) {
8009 skip("failed to bind, error %d\n", WSAGetLastError());
8010 goto end;
8013 addrlen = sizeof(address);
8014 iret = getsockname(listener, (struct sockaddr*)&address, &addrlen);
8015 if (iret != 0) {
8016 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8017 goto end;
8020 if (set_blocking(listener, TRUE)) {
8021 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8022 goto end;
8025 bytesReturned = 0xdeadbeef;
8026 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid),
8027 &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL);
8028 if (iret) {
8029 win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret, WSAGetLastError());
8030 goto end;
8033 ok(bytesReturned == sizeof(pConnectEx), "expected sizeof(pConnectEx), got %u\n", bytesReturned);
8035 bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8036 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on invalid socket "
8037 "returned %d + errno %d\n", bret, WSAGetLastError());
8039 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8040 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "ConnectEx on a unbound socket "
8041 "returned %d + errno %d\n", bret, WSAGetLastError());
8042 if (bret == TRUE || WSAGetLastError() != WSAEINVAL)
8044 acceptor = accept(listener, NULL, NULL);
8045 if (acceptor != INVALID_SOCKET) {
8046 closesocket(acceptor);
8047 acceptor = INVALID_SOCKET;
8050 closesocket(connector);
8051 connector = socket(AF_INET, SOCK_STREAM, 0);
8052 if (connector == INVALID_SOCKET) {
8053 skip("could not create connector socket, error %d\n", WSAGetLastError());
8054 goto end;
8058 /* ConnectEx needs a bound socket */
8059 memset(&conaddress, 0, sizeof(conaddress));
8060 conaddress.sin_family = AF_INET;
8061 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8062 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8063 if (iret != 0) {
8064 skip("failed to bind, error %d\n", WSAGetLastError());
8065 goto end;
8068 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, NULL);
8069 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "ConnectEx on a NULL overlapped "
8070 "returned %d + errno %d\n", bret, WSAGetLastError());
8072 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
8073 if (overlapped.hEvent == NULL) {
8074 skip("could not create event object, errno = %d\n", GetLastError());
8075 goto end;
8078 iret = listen(listener, 1);
8079 if (iret != 0) {
8080 skip("listening failed, errno = %d\n", WSAGetLastError());
8081 goto end;
8084 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8085 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8086 "returned %d + errno %d\n", bret, WSAGetLastError());
8087 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8088 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8090 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8091 ok(bret, "Connecting failed, error %d\n", GetLastError());
8092 ok(bytesReturned == 0, "Bytes sent is %d\n", bytesReturned);
8094 closesocket(connector);
8095 connector = socket(AF_INET, SOCK_STREAM, 0);
8096 if (connector == INVALID_SOCKET) {
8097 skip("could not create connector socket, error %d\n", WSAGetLastError());
8098 goto end;
8100 /* ConnectEx needs a bound socket */
8101 memset(&conaddress, 0, sizeof(conaddress));
8102 conaddress.sin_family = AF_INET;
8103 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8104 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8105 if (iret != 0) {
8106 skip("failed to bind, error %d\n", WSAGetLastError());
8107 goto end;
8110 acceptor = accept(listener, NULL, NULL);
8111 if (acceptor != INVALID_SOCKET) {
8112 closesocket(acceptor);
8115 buffer[0] = '1';
8116 buffer[1] = '2';
8117 buffer[2] = '3';
8118 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, buffer, 3, &bytesReturned, &overlapped);
8119 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: "
8120 "returned %d + errno %d\n", bret, WSAGetLastError());
8121 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8122 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8124 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8125 ok(bret, "Connecting failed, error %d\n", GetLastError());
8126 ok(bytesReturned == 3, "Bytes sent is %d\n", bytesReturned);
8128 acceptor = accept(listener, NULL, NULL);
8129 ok(acceptor != INVALID_SOCKET, "could not accept socket error %d\n", WSAGetLastError());
8131 bytesReturned = recv(acceptor, buffer, 3, 0);
8132 buffer[4] = 0;
8133 ok(bytesReturned == 3, "Didn't get all sent data, got only %d\n", bytesReturned);
8134 ok(buffer[0] == '1' && buffer[1] == '2' && buffer[2] == '3',
8135 "Failed to get the right data, expected '123', got '%s'\n", buffer);
8137 closesocket(connector);
8138 connector = socket(AF_INET, SOCK_STREAM, 0);
8139 if (connector == INVALID_SOCKET) {
8140 skip("could not create connector socket, error %d\n", WSAGetLastError());
8141 goto end;
8143 /* ConnectEx needs a bound socket */
8144 memset(&conaddress, 0, sizeof(conaddress));
8145 conaddress.sin_family = AF_INET;
8146 conaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8147 iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress));
8148 if (iret != 0) {
8149 skip("failed to bind, error %d\n", WSAGetLastError());
8150 goto end;
8153 if (acceptor != INVALID_SOCKET) {
8154 closesocket(acceptor);
8155 acceptor = INVALID_SOCKET;
8158 /* Connect with error */
8159 closesocket(listener);
8160 listener = INVALID_SOCKET;
8162 address.sin_port = htons(1);
8164 bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped);
8165 ok(bret == FALSE && GetLastError() == ERROR_IO_PENDING, "ConnectEx to bad destination failed: "
8166 "returned %d + errno %d\n", bret, GetLastError());
8167 dwret = WaitForSingleObject(overlapped.hEvent, 15000);
8168 ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError());
8170 bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE);
8171 ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED,
8172 "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError());
8174 end:
8175 if (overlapped.hEvent)
8176 WSACloseEvent(overlapped.hEvent);
8177 if (listener != INVALID_SOCKET)
8178 closesocket(listener);
8179 if (acceptor != INVALID_SOCKET)
8180 closesocket(acceptor);
8181 if (connector != INVALID_SOCKET)
8182 closesocket(connector);
8185 static void test_AcceptEx(void)
8187 SOCKET listener = INVALID_SOCKET;
8188 SOCKET acceptor = INVALID_SOCKET;
8189 SOCKET connector = INVALID_SOCKET;
8190 SOCKET connector2 = INVALID_SOCKET;
8191 struct sockaddr_in bindAddress, peerAddress, *readBindAddress, *readRemoteAddress;
8192 int socklen, optlen;
8193 GUID acceptExGuid = WSAID_ACCEPTEX, getAcceptExGuid = WSAID_GETACCEPTEXSOCKADDRS;
8194 LPFN_ACCEPTEX pAcceptEx = NULL;
8195 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs = NULL;
8196 fd_set fds_accept, fds_send;
8197 struct timeval timeout = {0,10}; /* wait for 10 milliseconds */
8198 int got, conn1, i;
8199 DWORD bytesReturned, connect_time;
8200 char buffer[1024], ipbuffer[32];
8201 OVERLAPPED overlapped;
8202 int iret, localSize = sizeof(struct sockaddr_in), remoteSize = localSize;
8203 BOOL bret;
8204 DWORD dwret;
8206 memset(&overlapped, 0, sizeof(overlapped));
8208 listener = socket(AF_INET, SOCK_STREAM, 0);
8209 if (listener == INVALID_SOCKET) {
8210 skip("could not create listener socket, error %d\n", WSAGetLastError());
8211 goto end;
8214 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8215 if (acceptor == INVALID_SOCKET) {
8216 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8217 goto end;
8220 connector = socket(AF_INET, SOCK_STREAM, 0);
8221 if (connector == INVALID_SOCKET) {
8222 skip("could not create connector socket, error %d\n", WSAGetLastError());
8223 goto end;
8226 memset(&bindAddress, 0, sizeof(bindAddress));
8227 bindAddress.sin_family = AF_INET;
8228 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8229 iret = bind(listener, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8230 if (iret != 0) {
8231 skip("failed to bind, error %d\n", WSAGetLastError());
8232 goto end;
8235 socklen = sizeof(bindAddress);
8236 iret = getsockname(listener, (struct sockaddr*)&bindAddress, &socklen);
8237 if (iret != 0) {
8238 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8239 goto end;
8242 if (set_blocking(listener, FALSE)) {
8243 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8244 goto end;
8247 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
8248 &pAcceptEx, sizeof(pAcceptEx), &bytesReturned, NULL, NULL);
8249 if (iret) {
8250 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
8251 goto end;
8254 iret = WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &getAcceptExGuid, sizeof(getAcceptExGuid),
8255 &pGetAcceptExSockaddrs, sizeof(pGetAcceptExSockaddrs), &bytesReturned, NULL, NULL);
8256 if (iret) {
8257 skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret, WSAGetLastError());
8258 goto end;
8261 bret = pAcceptEx(INVALID_SOCKET, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8262 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8263 &bytesReturned, &overlapped);
8264 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid listening socket "
8265 "returned %d + errno %d\n", bret, WSAGetLastError());
8267 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8268 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8269 &bytesReturned, &overlapped);
8270 todo_wine
8271 ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on a non-listening socket "
8272 "returned %d + errno %d\n", bret, WSAGetLastError());
8274 iret = listen(listener, 5);
8275 if (iret != 0) {
8276 skip("listening failed, errno = %d\n", WSAGetLastError());
8277 goto end;
8280 bret = pAcceptEx(listener, INVALID_SOCKET, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8281 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8282 &bytesReturned, &overlapped);
8283 ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid accepting socket "
8284 "returned %d + errno %d\n", bret, WSAGetLastError());
8286 bret = pAcceptEx(listener, acceptor, NULL, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8287 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8288 &bytesReturned, &overlapped);
8289 ok(bret == FALSE &&
8290 (WSAGetLastError() == WSAEINVAL ||
8291 broken(WSAGetLastError() == WSAEFAULT)), /* NT4 */
8292 "AcceptEx on NULL buffer returned %d + errno %d\n", bret, WSAGetLastError());
8294 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, sizeof(struct sockaddr_in) + 16,
8295 &bytesReturned, &overlapped);
8296 ok(bret == FALSE && (WSAGetLastError() == ERROR_IO_PENDING || broken(WSAGetLastError() == WSAEINVAL)) /* NT4 */,
8297 "AcceptEx on too small local address size returned %d + errno %d\n",
8298 bret, WSAGetLastError());
8299 bret = CancelIo((HANDLE) listener);
8300 ok(bret, "Failed to cancel pending accept socket\n");
8302 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15,
8303 sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped);
8304 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address "
8305 "size returned %d + errno %d\n",
8306 bret, WSAGetLastError());
8307 bret = CancelIo((HANDLE) listener);
8308 ok(bret, "Failed to cancel pending accept socket\n");
8310 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 0,
8311 &bytesReturned, &overlapped);
8312 ok(bret == FALSE && (WSAGetLastError() == WSAEFAULT || broken(WSAGetLastError() == WSAEINVAL)) /* NT4 */,
8313 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8315 bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16,
8316 sizeof(struct sockaddr_in) + 15, &bytesReturned, &overlapped);
8317 ok(bret == FALSE && (WSAGetLastError() == ERROR_IO_PENDING || broken(WSAGetLastError() == WSAEINVAL)) /* NT4 */,
8318 "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError());
8319 bret = CancelIo((HANDLE) listener);
8320 ok(bret, "Failed to cancel pending accept socket\n");
8322 bret = pAcceptEx(listener, acceptor, buffer, 0,
8323 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8324 &bytesReturned, NULL);
8325 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8326 "returned %d + errno %d\n", bret, WSAGetLastError());
8328 bret = pAcceptEx(listener, acceptor, buffer, 0, 0, 0, &bytesReturned, NULL);
8329 ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
8330 "returned %d + errno %d\n", bret, WSAGetLastError());
8332 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
8333 if (overlapped.hEvent == NULL) {
8334 skip("could not create event object, errno = %d\n", GetLastError());
8335 goto end;
8338 bret = pAcceptEx(listener, acceptor, buffer, 0,
8339 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8340 &bytesReturned, &overlapped);
8341 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8343 bret = pAcceptEx(listener, acceptor, buffer, 0,
8344 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8345 &bytesReturned, &overlapped);
8346 todo_wine ok((bret == FALSE && WSAGetLastError() == WSAEINVAL) || broken(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) /* NT4 */,
8347 "AcceptEx on already pending socket returned %d + errno %d\n", bret, WSAGetLastError());
8348 if (bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) {
8349 /* We need to cancel this call, otherwise things fail */
8350 bret = CancelIo((HANDLE) listener);
8351 ok(bret, "Failed to cancel failed test. Bailing...\n");
8352 if (!bret) return;
8353 WaitForSingleObject(overlapped.hEvent, 0);
8355 bret = pAcceptEx(listener, acceptor, buffer, 0,
8356 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8357 &bytesReturned, &overlapped);
8358 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8361 iret = connect(acceptor, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8362 todo_wine ok((iret == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL) || broken(!iret) /* NT4 */,
8363 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret, WSAGetLastError());
8364 if (!iret || (iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)) {
8365 /* We need to cancel this call, otherwise things fail */
8366 closesocket(acceptor);
8367 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8368 if (acceptor == INVALID_SOCKET) {
8369 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8370 goto end;
8373 bret = CancelIo((HANDLE) listener);
8374 ok(bret, "Failed to cancel failed test. Bailing...\n");
8375 if (!bret) return;
8377 bret = pAcceptEx(listener, acceptor, buffer, 0,
8378 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8379 &bytesReturned, &overlapped);
8380 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8383 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8384 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8386 dwret = WaitForSingleObject(overlapped.hEvent, INFINITE);
8387 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8389 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8390 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8391 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8393 closesocket(connector);
8394 connector = INVALID_SOCKET;
8395 closesocket(acceptor);
8397 /* Test short reads */
8399 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8400 if (acceptor == INVALID_SOCKET) {
8401 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8402 goto end;
8404 connector = socket(AF_INET, SOCK_STREAM, 0);
8405 if (connector == INVALID_SOCKET) {
8406 skip("could not create connector socket, error %d\n", WSAGetLastError());
8407 goto end;
8409 bret = pAcceptEx(listener, acceptor, buffer, 2,
8410 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8411 &bytesReturned, &overlapped);
8412 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8414 connect_time = 0xdeadbeef;
8415 optlen = sizeof(connect_time);
8416 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8417 ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8418 ok(connect_time == ~0u, "unexpected connect time %u\n", connect_time);
8420 /* AcceptEx() still won't complete until we send data */
8421 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8422 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8424 connect_time = 0xdeadbeef;
8425 optlen = sizeof(connect_time);
8426 iret = getsockopt(connector, SOL_SOCKET, SO_CONNECT_TIME, (char *)&connect_time, &optlen);
8427 ok(!iret, "getsockopt failed %d\n", WSAGetLastError());
8428 ok(connect_time < 0xdeadbeef, "unexpected connect time %u\n", connect_time);
8430 dwret = WaitForSingleObject(overlapped.hEvent, 0);
8431 ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %d + errno %d\n", dwret, GetLastError());
8433 iret = getsockname( connector, (struct sockaddr *)&peerAddress, &remoteSize);
8434 ok( !iret, "getsockname failed.\n");
8436 /* AcceptEx() could complete any time now */
8437 iret = send(connector, buffer, 1, 0);
8438 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
8440 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8441 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8443 /* Check if the buffer from AcceptEx is decoded correctly */
8444 pGetAcceptExSockaddrs(buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8445 (struct sockaddr **)&readBindAddress, &localSize,
8446 (struct sockaddr **)&readRemoteAddress, &remoteSize);
8447 strcpy( ipbuffer, inet_ntoa(readBindAddress->sin_addr));
8448 ok( readBindAddress->sin_addr.s_addr == bindAddress.sin_addr.s_addr,
8449 "Local socket address is different %s != %s\n",
8450 ipbuffer, inet_ntoa(bindAddress.sin_addr));
8451 ok( readBindAddress->sin_port == bindAddress.sin_port,
8452 "Local socket port is different: %d != %d\n",
8453 readBindAddress->sin_port, bindAddress.sin_port);
8454 strcpy( ipbuffer, inet_ntoa(readRemoteAddress->sin_addr));
8455 ok( readRemoteAddress->sin_addr.s_addr == peerAddress.sin_addr.s_addr,
8456 "Remote socket address is different %s != %s\n",
8457 ipbuffer, inet_ntoa(peerAddress.sin_addr));
8458 ok( readRemoteAddress->sin_port == peerAddress.sin_port,
8459 "Remote socket port is different: %d != %d\n",
8460 readRemoteAddress->sin_port, peerAddress.sin_port);
8462 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8463 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8464 ok(bytesReturned == 1, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8466 closesocket(connector);
8467 connector = INVALID_SOCKET;
8468 closesocket(acceptor);
8470 /* Test CF_DEFER & AcceptEx interaction */
8472 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8473 if (acceptor == INVALID_SOCKET) {
8474 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8475 goto end;
8477 connector = socket(AF_INET, SOCK_STREAM, 0);
8478 if (connector == INVALID_SOCKET) {
8479 skip("could not create connector socket, error %d\n", WSAGetLastError());
8480 goto end;
8482 connector2 = socket(AF_INET, SOCK_STREAM, 0);
8483 if (connector == INVALID_SOCKET) {
8484 skip("could not create connector socket, error %d\n", WSAGetLastError());
8485 goto end;
8488 if (set_blocking(connector, FALSE)) {
8489 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8490 goto end;
8493 if (set_blocking(connector2, FALSE)) {
8494 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8495 goto end;
8498 /* Connect socket #1 */
8499 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8500 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8502 FD_ZERO ( &fds_accept );
8503 FD_ZERO ( &fds_send );
8505 FD_SET ( listener, &fds_accept );
8506 FD_SET ( connector, &fds_send );
8508 buffer[0] = '0';
8509 got = 0;
8510 conn1 = 0;
8512 for (i = 0; i < 4000; ++i)
8514 fd_set fds_openaccept = fds_accept, fds_opensend = fds_send;
8516 wsa_ok ( ( select ( 0, &fds_openaccept, &fds_opensend, NULL, &timeout ) ), SOCKET_ERROR !=,
8517 "acceptex test(%d): could not select on socket, errno %d\n" );
8519 /* check for incoming requests */
8520 if ( FD_ISSET ( listener, &fds_openaccept ) ) {
8521 got++;
8522 if (got == 1) {
8523 SOCKET tmp = WSAAccept(listener, NULL, NULL, (LPCONDITIONPROC) AlwaysDeferConditionFunc, 0);
8524 ok(tmp == INVALID_SOCKET && WSAGetLastError() == WSATRY_AGAIN, "Failed to defer connection, %d\n", WSAGetLastError());
8525 bret = pAcceptEx(listener, acceptor, buffer, 0,
8526 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8527 &bytesReturned, &overlapped);
8528 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8530 else if (got == 2) {
8531 /* this should be socket #2 */
8532 SOCKET tmp = accept(listener, NULL, NULL);
8533 ok(tmp != INVALID_SOCKET, "accept failed %d\n", WSAGetLastError());
8534 closesocket(tmp);
8536 else {
8537 ok(FALSE, "Got more than 2 connections?\n");
8540 if ( conn1 && FD_ISSET ( connector2, &fds_opensend ) ) {
8541 /* Send data on second socket, and stop */
8542 send(connector2, "2", 1, 0);
8543 FD_CLR ( connector2, &fds_send );
8545 break;
8547 if ( FD_ISSET ( connector, &fds_opensend ) ) {
8548 /* Once #1 is connected, allow #2 to connect */
8549 conn1 = 1;
8551 send(connector, "1", 1, 0);
8552 FD_CLR ( connector, &fds_send );
8554 iret = connect(connector2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8555 ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8556 FD_SET ( connector2, &fds_send );
8560 ok (got == 2 || broken(got == 1) /* NT4 */,
8561 "Did not get both connections, got %d\n", got);
8563 dwret = WaitForSingleObject(overlapped.hEvent, 0);
8564 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8566 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8567 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8568 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8570 set_blocking(acceptor, TRUE);
8571 iret = recv( acceptor, buffer, 2, 0);
8572 ok(iret == 1, "Failed to get data, %d, errno: %d\n", iret, WSAGetLastError());
8574 ok(buffer[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer[0]);
8576 closesocket(connector);
8577 connector = INVALID_SOCKET;
8578 closesocket(acceptor);
8580 /* clean up in case of failures */
8581 while ((acceptor = accept(listener, NULL, NULL)) != INVALID_SOCKET)
8582 closesocket(acceptor);
8584 /* Disconnect during receive? */
8586 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8587 if (acceptor == INVALID_SOCKET) {
8588 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8589 goto end;
8591 connector = socket(AF_INET, SOCK_STREAM, 0);
8592 if (connector == INVALID_SOCKET) {
8593 skip("could not create connector socket, error %d\n", WSAGetLastError());
8594 goto end;
8596 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8597 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8598 &bytesReturned, &overlapped);
8599 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8601 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8602 ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
8604 closesocket(connector);
8605 connector = INVALID_SOCKET;
8607 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8608 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8610 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8611 ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError());
8612 ok(bytesReturned == 0, "bytesReturned isn't supposed to be %d\n", bytesReturned);
8614 closesocket(acceptor);
8616 /* Test closing with pending requests */
8618 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8619 if (acceptor == INVALID_SOCKET) {
8620 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8621 goto end;
8623 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8624 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8625 &bytesReturned, &overlapped);
8626 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8628 closesocket(acceptor);
8630 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8631 todo_wine ok(dwret == WAIT_OBJECT_0 || broken(dwret == WAIT_TIMEOUT) /* NT4/2000 */,
8632 "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8634 if (dwret != WAIT_TIMEOUT) {
8635 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8636 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8638 else {
8639 bret = CancelIo((HANDLE) listener);
8640 ok(bret, "Failed to cancel failed test. Bailing...\n");
8641 if (!bret) return;
8642 WaitForSingleObject(overlapped.hEvent, 0);
8645 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8646 if (acceptor == INVALID_SOCKET) {
8647 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8648 goto end;
8650 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8651 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8652 &bytesReturned, &overlapped);
8653 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8655 CancelIo((HANDLE) acceptor);
8657 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8658 ok(dwret == WAIT_TIMEOUT, "Waiting for timeout failed with %d + errno %d\n", dwret, GetLastError());
8660 closesocket(acceptor);
8662 acceptor = socket(AF_INET, SOCK_STREAM, 0);
8663 if (acceptor == INVALID_SOCKET) {
8664 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8665 goto end;
8667 bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16),
8668 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
8669 &bytesReturned, &overlapped);
8670 ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError());
8672 closesocket(listener);
8673 listener = INVALID_SOCKET;
8675 dwret = WaitForSingleObject(overlapped.hEvent, 1000);
8676 ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError());
8678 bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
8679 ok(!bret && GetLastError() == ERROR_OPERATION_ABORTED, "GetOverlappedResult failed, error %d\n", GetLastError());
8681 end:
8682 if (overlapped.hEvent)
8683 WSACloseEvent(overlapped.hEvent);
8684 if (listener != INVALID_SOCKET)
8685 closesocket(listener);
8686 if (acceptor != INVALID_SOCKET)
8687 closesocket(acceptor);
8688 if (connector != INVALID_SOCKET)
8689 closesocket(connector);
8690 if (connector2 != INVALID_SOCKET)
8691 closesocket(connector2);
8694 static void test_DisconnectEx(void)
8696 SOCKET listener, acceptor, connector;
8697 LPFN_DISCONNECTEX pDisconnectEx;
8698 GUID disconnectExGuid = WSAID_DISCONNECTEX;
8699 struct sockaddr_in address;
8700 DWORD num_bytes, flags;
8701 OVERLAPPED overlapped;
8702 int addrlen, iret;
8703 BOOL bret;
8705 connector = socket(AF_INET, SOCK_STREAM, 0);
8706 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8708 iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &disconnectExGuid, sizeof(disconnectExGuid),
8709 &pDisconnectEx, sizeof(pDisconnectEx), &num_bytes, NULL, NULL);
8710 if (iret)
8712 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
8713 closesocket(connector);
8714 return;
8717 listener = socket(AF_INET, SOCK_STREAM, 0);
8718 ok(listener != INVALID_SOCKET, "failed to create listener socket, error %d\n", WSAGetLastError());
8720 memset(&address, 0, sizeof(address));
8721 address.sin_family = AF_INET;
8722 address.sin_addr.s_addr = inet_addr("127.0.0.1");
8723 iret = bind(listener, (struct sockaddr *)&address, sizeof(address));
8724 ok(iret == 0, "failed to bind, error %d\n", WSAGetLastError());
8726 addrlen = sizeof(address);
8727 iret = getsockname(listener, (struct sockaddr *)&address, &addrlen);
8728 ok(iret == 0, "failed to lookup bind address, error %d\n", WSAGetLastError());
8730 iret = listen(listener, 1);
8731 ok(iret == 0, "failed to listen, error %d\n", WSAGetLastError());
8733 set_blocking(listener, TRUE);
8735 memset(&overlapped, 0, sizeof(overlapped));
8736 bret = pDisconnectEx(INVALID_SOCKET, &overlapped, 0, 0);
8737 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8738 ok(WSAGetLastError() == WSAENOTSOCK, "expected WSAENOTSOCK, got %d\n", WSAGetLastError());
8740 memset(&overlapped, 0, sizeof(overlapped));
8741 bret = pDisconnectEx(connector, &overlapped, 0, 0);
8742 ok(bret == FALSE, "DisconnectEx unexpectedly succeeded\n");
8743 todo_wine ok(WSAGetLastError() == WSAENOTCONN, "expected WSAENOTCONN, got %d\n", WSAGetLastError());
8745 iret = connect(connector, (struct sockaddr *)&address, addrlen);
8746 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8748 acceptor = accept(listener, NULL, NULL);
8749 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8751 memset(&overlapped, 0, sizeof(overlapped));
8752 overlapped.hEvent = WSACreateEvent();
8753 ok(overlapped.hEvent != WSA_INVALID_EVENT, "WSACreateEvent failed, error %d\n", WSAGetLastError());
8754 bret = pDisconnectEx(connector, &overlapped, 0, 0);
8755 if (bret)
8756 ok(overlapped.Internal == STATUS_PENDING, "expected STATUS_PENDING, got %08lx\n", overlapped.Internal);
8757 else if (WSAGetLastError() == ERROR_IO_PENDING)
8758 bret = WSAGetOverlappedResult(connector, &overlapped, &num_bytes, TRUE, &flags);
8759 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8760 WSACloseEvent(overlapped.hEvent);
8762 iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8763 ok(iret != 0, "connect unexpectedly succeeded\n");
8764 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8766 closesocket(acceptor);
8767 closesocket(connector);
8769 connector = socket(AF_INET, SOCK_STREAM, 0);
8770 ok(connector != INVALID_SOCKET, "failed to create connector socket, error %d\n", WSAGetLastError());
8772 iret = connect(connector, (struct sockaddr *)&address, addrlen);
8773 ok(iret == 0, "failed to connect, error %d\n", WSAGetLastError());
8775 acceptor = accept(listener, NULL, NULL);
8776 ok(acceptor != INVALID_SOCKET, "could not accept socket, error %d\n", WSAGetLastError());
8778 bret = pDisconnectEx(connector, NULL, 0, 0);
8779 ok(bret, "DisconnectEx failed, error %d\n", WSAGetLastError());
8781 iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
8782 ok(iret != 0, "connect unexpectedly succeeded\n");
8783 ok(WSAGetLastError() == WSAEISCONN, "expected WSAEISCONN, got %d\n", WSAGetLastError());
8785 closesocket(acceptor);
8786 closesocket(connector);
8787 closesocket(listener);
8790 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
8792 static void compare_file2(HANDLE handle, SOCKET sock, int offset, const char *file, int line)
8794 char buf1[256], buf2[256];
8795 BOOL success;
8796 int i = 0;
8798 SetFilePointer(handle, offset, NULL, FILE_BEGIN);
8799 while (1)
8801 DWORD n1 = 0, n2 = 0;
8803 success = ReadFile(handle, buf1, sizeof(buf1), &n1, NULL);
8804 ok_(file,line)(success, "Failed to read from file.\n");
8805 if (success && n1 == 0)
8806 break;
8807 else if(!success)
8808 return;
8809 n2 = recv(sock, buf2, n1, 0);
8810 ok_(file,line)(n1 == n2, "Block %d size mismatch (%d != %d)\n", i, n1, n2);
8811 ok_(file,line)(memcmp(buf1, buf2, n2) == 0, "Block %d failed\n", i);
8812 i++;
8816 static void test_TransmitFile(void)
8818 DWORD num_bytes, err, file_size, total_sent;
8819 GUID transmitFileGuid = WSAID_TRANSMITFILE;
8820 LPFN_TRANSMITFILE pTransmitFile = NULL;
8821 HANDLE file = INVALID_HANDLE_VALUE;
8822 char header_msg[] = "hello world";
8823 char footer_msg[] = "goodbye!!!";
8824 char system_ini_path[MAX_PATH];
8825 struct sockaddr_in bindAddress;
8826 TRANSMIT_FILE_BUFFERS buffers;
8827 SOCKET client, server, dest;
8828 WSAOVERLAPPED ov;
8829 char buf[256];
8830 int iret, len;
8831 BOOL bret;
8833 memset( &ov, 0, sizeof(ov) );
8835 /* Setup sockets for testing TransmitFile */
8836 client = socket(AF_INET, SOCK_STREAM, 0);
8837 server = socket(AF_INET, SOCK_STREAM, 0);
8838 if (client == INVALID_SOCKET || server == INVALID_SOCKET)
8840 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8841 goto cleanup;
8843 iret = WSAIoctl(client, SIO_GET_EXTENSION_FUNCTION_POINTER, &transmitFileGuid, sizeof(transmitFileGuid),
8844 &pTransmitFile, sizeof(pTransmitFile), &num_bytes, NULL, NULL);
8845 if (iret)
8847 skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret, WSAGetLastError());
8848 goto cleanup;
8850 GetSystemWindowsDirectoryA(system_ini_path, MAX_PATH );
8851 strcat(system_ini_path, "\\system.ini");
8852 file = CreateFileA(system_ini_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0x0, NULL);
8853 if (file == INVALID_HANDLE_VALUE)
8855 skip("Unable to open a file to transmit.\n");
8856 goto cleanup;
8858 file_size = GetFileSize(file, NULL);
8860 /* Test TransmitFile with an invalid socket */
8861 bret = pTransmitFile(INVALID_SOCKET, file, 0, 0, NULL, NULL, 0);
8862 err = WSAGetLastError();
8863 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8864 ok(err == WSAENOTSOCK, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTSOCK);
8866 /* Test a bogus TransmitFile without a connected socket */
8867 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, TF_REUSE_SOCKET);
8868 err = WSAGetLastError();
8869 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8870 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
8872 /* Setup a properly connected socket for transfers */
8873 memset(&bindAddress, 0, sizeof(bindAddress));
8874 bindAddress.sin_family = AF_INET;
8875 bindAddress.sin_port = htons(SERVERPORT+1);
8876 bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
8877 iret = bind(server, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8878 if (iret != 0)
8880 skip("failed to bind(), error %d\n", WSAGetLastError());
8881 goto cleanup;
8883 iret = listen(server, 1);
8884 if (iret != 0)
8886 skip("failed to listen(), error %d\n", WSAGetLastError());
8887 goto cleanup;
8889 iret = connect(client, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
8890 if (iret != 0)
8892 skip("failed to connect(), error %d\n", WSAGetLastError());
8893 goto cleanup;
8895 len = sizeof(bindAddress);
8896 dest = accept(server, (struct sockaddr*)&bindAddress, &len);
8897 if (dest == INVALID_SOCKET)
8899 skip("failed to accept(), error %d\n", WSAGetLastError());
8900 goto cleanup;
8902 if (set_blocking(dest, FALSE))
8904 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8905 goto cleanup;
8908 /* Test TransmitFile with no possible buffer */
8909 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
8910 ok(bret, "TransmitFile failed unexpectedly.\n");
8911 iret = recv(dest, buf, sizeof(buf), 0);
8912 ok(iret == -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret);
8914 /* Test TransmitFile with only buffer data */
8915 buffers.Head = &header_msg[0];
8916 buffers.HeadLength = sizeof(header_msg);
8917 buffers.Tail = &footer_msg[0];
8918 buffers.TailLength = sizeof(footer_msg);
8919 bret = pTransmitFile(client, NULL, 0, 0, NULL, &buffers, 0);
8920 ok(bret, "TransmitFile failed unexpectedly.\n");
8921 iret = recv(dest, buf, sizeof(buf), 0);
8922 ok(iret == sizeof(header_msg)+sizeof(footer_msg),
8923 "Returned an unexpected buffer from TransmitFile: %d\n", iret );
8924 ok(memcmp(&buf[0], &header_msg[0], sizeof(header_msg)) == 0,
8925 "TransmitFile header buffer did not match!\n");
8926 ok(memcmp(&buf[sizeof(header_msg)], &footer_msg[0], sizeof(footer_msg)) == 0,
8927 "TransmitFile footer buffer did not match!\n");
8929 /* Test TransmitFile with only file data */
8930 bret = pTransmitFile(client, file, 0, 0, NULL, NULL, 0);
8931 ok(bret, "TransmitFile failed unexpectedly.\n");
8932 compare_file(file, dest, 0);
8934 /* Test TransmitFile with both file and buffer data */
8935 buffers.Head = &header_msg[0];
8936 buffers.HeadLength = sizeof(header_msg);
8937 buffers.Tail = &footer_msg[0];
8938 buffers.TailLength = sizeof(footer_msg);
8939 SetFilePointer(file, 0, NULL, FILE_BEGIN);
8940 bret = pTransmitFile(client, file, 0, 0, NULL, &buffers, 0);
8941 ok(bret, "TransmitFile failed unexpectedly.\n");
8942 iret = recv(dest, buf, sizeof(header_msg), 0);
8943 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
8944 "TransmitFile header buffer did not match!\n");
8945 compare_file(file, dest, 0);
8946 iret = recv(dest, buf, sizeof(footer_msg), 0);
8947 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
8948 "TransmitFile footer buffer did not match!\n");
8950 /* Test overlapped TransmitFile */
8951 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
8952 if (ov.hEvent == INVALID_HANDLE_VALUE)
8954 skip("Could not create event object, some tests will be skipped. errno = %d\n",
8955 GetLastError());
8956 goto cleanup;
8958 SetFilePointer(file, 0, NULL, FILE_BEGIN);
8959 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
8960 err = WSAGetLastError();
8961 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8962 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n",
8963 err, ERROR_IO_PENDING);
8964 iret = WaitForSingleObject(ov.hEvent, 2000);
8965 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
8966 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
8967 ok(total_sent == file_size,
8968 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8969 total_sent, file_size);
8970 compare_file(file, dest, 0);
8972 /* Test overlapped TransmitFile w/ start offset */
8973 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
8974 if (ov.hEvent == INVALID_HANDLE_VALUE)
8976 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
8977 goto cleanup;
8979 SetFilePointer(file, 0, NULL, FILE_BEGIN);
8980 ov.Offset = 10;
8981 bret = pTransmitFile(client, file, 0, 0, &ov, NULL, 0);
8982 err = WSAGetLastError();
8983 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
8984 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
8985 iret = WaitForSingleObject(ov.hEvent, 2000);
8986 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
8987 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
8988 ok(total_sent == (file_size - ov.Offset),
8989 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8990 total_sent, file_size - ov.Offset);
8991 compare_file(file, dest, ov.Offset);
8993 /* Test overlapped TransmitFile w/ file and buffer data */
8994 ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
8995 if (ov.hEvent == INVALID_HANDLE_VALUE)
8997 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
8998 goto cleanup;
9000 buffers.Head = &header_msg[0];
9001 buffers.HeadLength = sizeof(header_msg);
9002 buffers.Tail = &footer_msg[0];
9003 buffers.TailLength = sizeof(footer_msg);
9004 SetFilePointer(file, 0, NULL, FILE_BEGIN);
9005 ov.Offset = 0;
9006 bret = pTransmitFile(client, file, 0, 0, &ov, &buffers, 0);
9007 err = WSAGetLastError();
9008 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9009 ok(err == ERROR_IO_PENDING, "TransmitFile triggered unexpected errno (%d != %d)\n", err, ERROR_IO_PENDING);
9010 iret = WaitForSingleObject(ov.hEvent, 2000);
9011 ok(iret == WAIT_OBJECT_0, "Overlapped TransmitFile failed.\n");
9012 WSAGetOverlappedResult(client, &ov, &total_sent, FALSE, NULL);
9013 ok(total_sent == (file_size + buffers.HeadLength + buffers.TailLength),
9014 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
9015 total_sent, file_size + buffers.HeadLength + buffers.TailLength);
9016 iret = recv(dest, buf, sizeof(header_msg), 0);
9017 ok(memcmp(buf, &header_msg[0], sizeof(header_msg)) == 0,
9018 "TransmitFile header buffer did not match!\n");
9019 compare_file(file, dest, 0);
9020 iret = recv(dest, buf, sizeof(footer_msg), 0);
9021 ok(memcmp(buf, &footer_msg[0], sizeof(footer_msg)) == 0,
9022 "TransmitFile footer buffer did not match!\n");
9024 /* Test TransmitFile with a UDP datagram socket */
9025 closesocket(client);
9026 client = socket(AF_INET, SOCK_DGRAM, 0);
9027 bret = pTransmitFile(client, NULL, 0, 0, NULL, NULL, 0);
9028 err = WSAGetLastError();
9029 ok(!bret, "TransmitFile succeeded unexpectedly.\n");
9030 ok(err == WSAENOTCONN, "TransmitFile triggered unexpected errno (%d != %d)\n", err, WSAENOTCONN);
9032 cleanup:
9033 CloseHandle(file);
9034 CloseHandle(ov.hEvent);
9035 closesocket(client);
9036 closesocket(server);
9039 static void test_getpeername(void)
9041 SOCKET sock;
9042 struct sockaddr_in sa, sa_out;
9043 SOCKADDR_STORAGE ss;
9044 int sa_len;
9045 const char buf[] = "hello world";
9046 int ret;
9048 /* Test the parameter validation order. */
9049 ret = getpeername(INVALID_SOCKET, NULL, NULL);
9050 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9051 ok(WSAGetLastError() == WSAENOTSOCK,
9052 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
9054 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
9055 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9056 if (sock == INVALID_SOCKET)
9058 skip("Socket creation failed with %d\n", WSAGetLastError());
9059 return;
9062 ret = getpeername(sock, NULL, NULL);
9063 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9064 ok(WSAGetLastError() == WSAENOTCONN ||
9065 broken(WSAGetLastError() == WSAEFAULT), /* Win9x and WinMe */
9066 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9068 memset(&sa, 0, sizeof(sa));
9069 sa.sin_family = AF_INET;
9070 sa.sin_port = htons(139);
9071 sa.sin_addr.s_addr = inet_addr("127.0.0.1");
9073 /* sendto does not change a socket's connection state. */
9074 ret = sendto(sock, buf, sizeof(buf), 0, (struct sockaddr*)&sa, sizeof(sa));
9075 ok(ret != SOCKET_ERROR,
9076 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9078 ret = getpeername(sock, NULL, NULL);
9079 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9080 ok(WSAGetLastError() == WSAENOTCONN ||
9081 broken(WSAGetLastError() == WSAEFAULT), /* Win9x and WinMe */
9082 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
9084 ret = connect(sock, (struct sockaddr*)&sa, sizeof(sa));
9085 ok(ret == 0,
9086 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
9088 ret = getpeername(sock, NULL, NULL);
9089 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9090 ok(WSAGetLastError() == WSAEFAULT,
9091 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9093 /* Test crashes on Wine. */
9094 if (0)
9096 ret = getpeername(sock, (void*)0xdeadbeef, (void*)0xcafebabe);
9097 ok(ret == SOCKET_ERROR, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret);
9098 ok(WSAGetLastError() == WSAEFAULT,
9099 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9102 ret = getpeername(sock, (struct sockaddr*)&sa_out, NULL);
9103 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9104 ok(WSAGetLastError() == WSAEFAULT,
9105 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9107 sa_len = 0;
9108 ret = getpeername(sock, NULL, &sa_len);
9109 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9110 ok(WSAGetLastError() == WSAEFAULT,
9111 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9112 ok(!sa_len, "got %d\n", sa_len);
9114 sa_len = 0;
9115 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9116 ok(ret == SOCKET_ERROR, "Expected getpeername to return 0, got %d\n", ret);
9117 ok(WSAGetLastError() == WSAEFAULT,
9118 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
9119 ok(!sa_len, "got %d\n", sa_len);
9121 sa_len = sizeof(ss);
9122 ret = getpeername(sock, (struct sockaddr *)&ss, &sa_len);
9123 ok(ret == 0, "Expected getpeername to return 0, got %d\n", ret);
9124 ok(!memcmp(&sa, &ss, sizeof(sa)),
9125 "Expected the returned structure to be identical to the connect structure\n");
9126 ok(sa_len == sizeof(sa), "got %d\n", sa_len);
9128 closesocket(sock);
9131 static void test_sioRoutingInterfaceQuery(void)
9133 int ret;
9134 SOCKET sock;
9135 SOCKADDR_IN sin = { 0 }, sout = { 0 };
9136 DWORD bytesReturned;
9138 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
9139 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9140 if (sock == INVALID_SOCKET)
9142 skip("Socket creation failed with %d\n", WSAGetLastError());
9143 return;
9145 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, NULL, 0, NULL, 0, NULL,
9146 NULL, NULL);
9147 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
9148 "expected WSAEFAULT, got %d\n", WSAGetLastError());
9149 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9150 NULL, 0, NULL, NULL, NULL);
9151 ok(ret == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
9152 "expected WSAEFAULT, got %d\n", WSAGetLastError());
9153 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9154 NULL, 0, &bytesReturned, NULL, NULL);
9155 ok(ret == SOCKET_ERROR &&
9156 (WSAGetLastError() == WSAEFAULT /* Win98 */ ||
9157 WSAGetLastError() == WSAEINVAL /* NT4 */||
9158 WSAGetLastError() == WSAEAFNOSUPPORT),
9159 "expected WSAEFAULT or WSAEINVAL or WSAEAFNOSUPPORT, got %d\n",
9160 WSAGetLastError());
9161 sin.sin_family = AF_INET;
9162 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9163 NULL, 0, &bytesReturned, NULL, NULL);
9164 ok(ret == SOCKET_ERROR &&
9165 (WSAGetLastError() == WSAEFAULT /* Win98 */ ||
9166 WSAGetLastError() == WSAEINVAL),
9167 "expected WSAEFAULT or WSAEINVAL, got %d\n", WSAGetLastError());
9168 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
9169 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9170 NULL, 0, &bytesReturned, NULL, NULL);
9171 ok(ret == SOCKET_ERROR &&
9172 (WSAGetLastError() == WSAEINVAL /* NT4 */ ||
9173 WSAGetLastError() == WSAEFAULT),
9174 "expected WSAEINVAL or WSAEFAULT, got %d\n", WSAGetLastError());
9175 ret = WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &sin, sizeof(sin),
9176 &sout, sizeof(sout), &bytesReturned, NULL, NULL);
9177 ok(!ret || broken(WSAGetLastError() == WSAEINVAL /* NT4 */),
9178 "WSAIoctl failed: %d\n", WSAGetLastError());
9179 if (!ret)
9181 ok(sout.sin_family == AF_INET, "expected AF_INET, got %d\n",
9182 sout.sin_family);
9183 /* We expect the source address to be INADDR_LOOPBACK as well, but
9184 * there's no guarantee that a route to the loopback address exists,
9185 * so rather than introduce spurious test failures we do not test the
9186 * source address.
9189 closesocket(sock);
9192 static void test_sioAddressListChange(void)
9194 struct sockaddr_in bindAddress;
9195 struct in_addr net_address;
9196 WSAOVERLAPPED overlapped, *olp;
9197 struct hostent *h;
9198 DWORD num_bytes, error, tick;
9199 SOCKET sock, sock2, sock3;
9200 WSAEVENT event2, event3;
9201 HANDLE io_port;
9202 ULONG_PTR key;
9203 int acount;
9204 BOOL bret;
9205 int ret;
9207 /* Use gethostbyname to find the list of local network interfaces */
9208 h = gethostbyname("");
9209 if (!h)
9211 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n",
9212 WSAGetLastError());
9213 return;
9215 for (acount = 0; h->h_addr_list[acount]; acount++);
9216 if (acount == 0)
9218 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
9219 return;
9222 net_address.s_addr = *(ULONG *) h->h_addr_list[0];
9224 sock = socket(AF_INET, 0, IPPROTO_TCP);
9225 ok(sock != INVALID_SOCKET, "socket() failed\n");
9227 memset(&bindAddress, 0, sizeof(bindAddress));
9228 bindAddress.sin_family = AF_INET;
9229 bindAddress.sin_addr.s_addr = net_address.s_addr;
9230 SetLastError(0xdeadbeef);
9231 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9232 ok (!ret, "bind() failed with error %d\n", GetLastError());
9233 set_blocking(sock, FALSE);
9235 memset(&overlapped, 0, sizeof(overlapped));
9236 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9237 SetLastError(0xdeadbeef);
9238 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9239 error = GetLastError();
9240 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9241 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9243 CloseHandle(overlapped.hEvent);
9244 closesocket(sock);
9246 sock = socket(AF_INET, 0, IPPROTO_TCP);
9247 ok(sock != INVALID_SOCKET, "socket() failed\n");
9249 SetLastError(0xdeadbeef);
9250 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9251 ok (!ret, "bind() failed with error %d\n", GetLastError());
9252 set_blocking(sock, TRUE);
9254 memset(&overlapped, 0, sizeof(overlapped));
9255 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9256 SetLastError(0xdeadbeef);
9257 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9258 error = GetLastError();
9259 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9260 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9262 CloseHandle(overlapped.hEvent);
9263 closesocket(sock);
9265 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9266 ok(sock != INVALID_SOCKET, "socket() failed\n");
9268 SetLastError(0xdeadbeef);
9269 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9270 ok (!ret, "bind() failed with error %d\n", GetLastError());
9271 set_blocking(sock, FALSE);
9273 memset(&overlapped, 0, sizeof(overlapped));
9274 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9275 SetLastError(0xdeadbeef);
9276 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9277 error = GetLastError();
9278 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9279 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9281 CloseHandle(overlapped.hEvent);
9282 closesocket(sock);
9284 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9285 ok(sock != INVALID_SOCKET, "socket() failed\n");
9287 SetLastError(0xdeadbeef);
9288 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9289 ok (!ret, "bind() failed with error %d\n", GetLastError());
9290 set_blocking(sock, TRUE);
9292 memset(&overlapped, 0, sizeof(overlapped));
9293 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9294 SetLastError(0xdeadbeef);
9295 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9296 error = GetLastError();
9297 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9298 ok (error == ERROR_IO_PENDING, "expected 0x3e5, got 0x%x\n", error);
9300 CloseHandle(overlapped.hEvent);
9301 closesocket(sock);
9303 /* When the socket is overlapped non-blocking and the list change is requested without
9304 * an overlapped structure the error will be different. */
9305 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9306 ok(sock != INVALID_SOCKET, "socket() failed\n");
9308 SetLastError(0xdeadbeef);
9309 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9310 ok (!ret, "bind() failed with error %d\n", GetLastError());
9311 set_blocking(sock, FALSE);
9313 SetLastError(0xdeadbeef);
9314 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9315 error = GetLastError();
9316 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %d\n", error);
9317 ok (error == WSAEWOULDBLOCK, "expected 10035, got %d\n", error);
9319 io_port = CreateIoCompletionPort( (HANDLE)sock, NULL, 0, 0 );
9320 ok (io_port != NULL, "failed to create completion port %u\n", GetLastError());
9322 set_blocking(sock, FALSE);
9323 memset(&overlapped, 0, sizeof(overlapped));
9324 SetLastError(0xdeadbeef);
9325 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9326 error = GetLastError();
9327 ok (ret == SOCKET_ERROR, "WSAIoctl(SIO_ADDRESS_LIST_CHANGE) failed with error %u\n", error);
9328 ok (error == ERROR_IO_PENDING, "expected ERROR_IO_PENDING got %u\n", error);
9330 olp = (WSAOVERLAPPED *)0xdeadbeef;
9331 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9332 ok(!bret, "failed to get completion status %u\n", bret);
9333 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9334 ok(!olp, "Overlapped structure is at %p\n", olp);
9336 closesocket(sock);
9338 olp = (WSAOVERLAPPED *)0xdeadbeef;
9339 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 0 );
9340 ok(!bret, "failed to get completion status %u\n", bret);
9341 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %u\n", GetLastError());
9342 ok(olp == &overlapped, "Overlapped structure is at %p\n", olp);
9344 CloseHandle(io_port);
9346 /* Misuse of the API by using a blocking socket and not using an overlapped structure,
9347 * this leads to a hang forever. */
9348 if (0)
9350 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9352 SetLastError(0xdeadbeef);
9353 bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9355 set_blocking(sock, TRUE);
9356 WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9357 /* hang */
9359 closesocket(sock);
9362 if (!winetest_interactive)
9364 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
9365 return;
9368 /* Bind an overlapped socket to the first found network interface */
9369 sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9370 ok(sock != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9371 sock2 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9372 ok(sock2 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9373 sock3 = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
9374 ok(sock3 != INVALID_SOCKET, "Expected socket to return a valid socket\n");
9376 ret = bind(sock, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9377 ok(!ret, "bind failed unexpectedly\n");
9378 ret = bind(sock2, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9379 ok(!ret, "bind failed unexpectedly\n");
9380 ret = bind(sock3, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
9381 ok(!ret, "bind failed unexpectedly\n");
9383 set_blocking(sock2, FALSE);
9384 set_blocking(sock3, FALSE);
9386 /* Wait for address changes, request that the user connects/disconnects an interface */
9387 memset(&overlapped, 0, sizeof(overlapped));
9388 overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
9389 ret = WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, &overlapped, NULL);
9390 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9391 ok(WSAGetLastError() == WSA_IO_PENDING, "Expected pending last error, got %d\n", WSAGetLastError());
9393 ret = WSAIoctl(sock2, SIO_ADDRESS_LIST_CHANGE, NULL, 0, NULL, 0, &num_bytes, NULL, NULL);
9394 ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
9395 ok(WSAGetLastError() == WSAEWOULDBLOCK, "Expected would block last error, got %d\n", WSAGetLastError());
9397 event2 = WSACreateEvent();
9398 event3 = WSACreateEvent();
9399 ret = WSAEventSelect (sock2, event2, FD_ADDRESS_LIST_CHANGE);
9400 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9401 /* sock3 did not request SIO_ADDRESS_LIST_CHANGE but it is trying to wait anyway */
9402 ret = WSAEventSelect (sock3, event3, FD_ADDRESS_LIST_CHANGE);
9403 ok(!ret, "WSAEventSelect failed with %d\n", WSAGetLastError());
9405 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
9406 " change the ipv4 address of any of the local network interfaces (15 second timeout).\n");
9407 tick = GetTickCount();
9408 ret = WaitForSingleObject(overlapped.hEvent, 15000);
9409 ok(ret == WAIT_OBJECT_0, "failed to get overlapped event %u\n", ret);
9411 ret = WaitForSingleObject(event2, 500);
9412 todo_wine
9413 ok(ret == WAIT_OBJECT_0, "failed to get change event %u\n", ret);
9415 ret = WaitForSingleObject(event3, 500);
9416 ok(ret == WAIT_TIMEOUT, "unexpected change event\n");
9418 trace("Spent %d ms waiting.\n", GetTickCount() - tick);
9420 WSACloseEvent(event2);
9421 WSACloseEvent(event3);
9423 closesocket(sock);
9424 closesocket(sock2);
9425 closesocket(sock3);
9428 static void test_synchronous_WSAIoctl(void)
9430 HANDLE previous_port, io_port;
9431 WSAOVERLAPPED overlapped, *olp;
9432 SOCKET socket;
9433 ULONG on;
9434 ULONG_PTR key;
9435 DWORD num_bytes;
9436 BOOL ret;
9437 int res;
9439 previous_port = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );
9440 ok( previous_port != NULL, "failed to create completion port %u\n", GetLastError() );
9442 socket = WSASocketW( AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED );
9443 ok( socket != INVALID_SOCKET, "failed to create socket %d\n", WSAGetLastError() );
9445 io_port = CreateIoCompletionPort( (HANDLE)socket, previous_port, 0, 0 );
9446 ok( io_port != NULL, "failed to create completion port %u\n", GetLastError() );
9448 on = 1;
9449 memset( &overlapped, 0, sizeof(overlapped) );
9450 res = WSAIoctl( socket, FIONBIO, &on, sizeof(on), NULL, 0, &num_bytes, &overlapped, NULL );
9451 ok( !res, "WSAIoctl failed %d\n", WSAGetLastError() );
9453 ret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 10000 );
9454 ok( ret, "failed to get completion status %u\n", GetLastError() );
9456 CloseHandle( io_port );
9457 closesocket( socket );
9458 CloseHandle( previous_port );
9461 #define WM_ASYNCCOMPLETE (WM_USER + 100)
9462 static HWND create_async_message_window(void)
9464 static const char class_name[] = "ws2_32 async message window class";
9466 WNDCLASSEXA wndclass;
9467 HWND hWnd;
9469 wndclass.cbSize = sizeof(wndclass);
9470 wndclass.style = CS_HREDRAW | CS_VREDRAW;
9471 wndclass.lpfnWndProc = DefWindowProcA;
9472 wndclass.cbClsExtra = 0;
9473 wndclass.cbWndExtra = 0;
9474 wndclass.hInstance = GetModuleHandleA(NULL);
9475 wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
9476 wndclass.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
9477 wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
9478 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
9479 wndclass.lpszClassName = class_name;
9480 wndclass.lpszMenuName = NULL;
9482 RegisterClassExA(&wndclass);
9484 hWnd = CreateWindowA(class_name, "ws2_32 async message window", WS_OVERLAPPEDWINDOW,
9485 0, 0, 500, 500, NULL, NULL, GetModuleHandleA(NULL), NULL);
9486 if (!hWnd)
9488 ok(0, "failed to create window: %u\n", GetLastError());
9489 return NULL;
9492 return hWnd;
9495 static void wait_for_async_message(HWND hwnd, HANDLE handle)
9497 BOOL ret;
9498 MSG msg;
9500 while ((ret = GetMessageA(&msg, 0, 0, 0)) &&
9501 !(msg.hwnd == hwnd && msg.message == WM_ASYNCCOMPLETE))
9503 TranslateMessage(&msg);
9504 DispatchMessageA(&msg);
9507 ok(ret, "did not expect WM_QUIT message\n");
9508 ok(msg.wParam == (WPARAM)handle, "expected wParam = %p, got %lx\n", handle, msg.wParam);
9511 static void test_WSAAsyncGetServByPort(void)
9513 HWND hwnd = create_async_message_window();
9514 HANDLE ret;
9515 char buffer[MAXGETHOSTSTRUCT];
9517 if (!hwnd)
9518 return;
9520 /* FIXME: The asynchronous window messages should be tested. */
9522 /* Parameters are not checked when initiating the asynchronous operation. */
9523 ret = WSAAsyncGetServByPort(NULL, 0, 0, NULL, NULL, 0);
9524 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9526 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, 0, NULL, NULL, 0);
9527 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9528 wait_for_async_message(hwnd, ret);
9530 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, NULL, 0);
9531 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9532 wait_for_async_message(hwnd, ret);
9534 ret = WSAAsyncGetServByPort(hwnd, WM_ASYNCCOMPLETE, htons(80), NULL, buffer, MAXGETHOSTSTRUCT);
9535 ok(ret != NULL, "WSAAsyncGetServByPort returned NULL\n");
9536 wait_for_async_message(hwnd, ret);
9538 DestroyWindow(hwnd);
9541 static void test_WSAAsyncGetServByName(void)
9543 HWND hwnd = create_async_message_window();
9544 HANDLE ret;
9545 char buffer[MAXGETHOSTSTRUCT];
9547 if (!hwnd)
9548 return;
9550 /* FIXME: The asynchronous window messages should be tested. */
9552 /* Parameters are not checked when initiating the asynchronous operation. */
9553 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", NULL, NULL, 0);
9554 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9555 wait_for_async_message(hwnd, ret);
9557 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "", "", buffer, MAXGETHOSTSTRUCT);
9558 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9559 wait_for_async_message(hwnd, ret);
9561 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", NULL, NULL, 0);
9562 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9563 wait_for_async_message(hwnd, ret);
9565 ret = WSAAsyncGetServByName(hwnd, WM_ASYNCCOMPLETE, "http", "tcp", buffer, MAXGETHOSTSTRUCT);
9566 ok(ret != NULL, "WSAAsyncGetServByName returned NULL\n");
9567 wait_for_async_message(hwnd, ret);
9569 DestroyWindow(hwnd);
9573 * Provide consistent initialization for the AcceptEx IOCP tests.
9575 static SOCKET setup_iocp_src(struct sockaddr_in *bindAddress)
9577 SOCKET src, ret = INVALID_SOCKET;
9578 int iret, socklen;
9580 src = socket(AF_INET, SOCK_STREAM, 0);
9581 if (src == INVALID_SOCKET)
9583 skip("could not create listener socket, error %d\n", WSAGetLastError());
9584 goto end;
9587 memset(bindAddress, 0, sizeof(*bindAddress));
9588 bindAddress->sin_family = AF_INET;
9589 bindAddress->sin_addr.s_addr = inet_addr("127.0.0.1");
9590 iret = bind(src, (struct sockaddr*)bindAddress, sizeof(*bindAddress));
9591 if (iret != 0)
9593 skip("failed to bind, error %d\n", WSAGetLastError());
9594 goto end;
9597 socklen = sizeof(*bindAddress);
9598 iret = getsockname(src, (struct sockaddr*)bindAddress, &socklen);
9599 if (iret != 0) {
9600 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
9601 goto end;
9604 if (set_blocking(src, FALSE))
9606 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
9607 goto end;
9610 iret = listen(src, 5);
9611 if (iret != 0)
9613 skip("listening failed, errno = %d\n", WSAGetLastError());
9614 goto end;
9617 ret = src;
9618 end:
9619 if (src != ret && ret == INVALID_SOCKET)
9620 closesocket(src);
9621 return ret;
9624 static void test_completion_port(void)
9626 HANDLE previous_port, io_port;
9627 WSAOVERLAPPED ov, *olp;
9628 SOCKET src, dest, dup, connector = INVALID_SOCKET;
9629 WSAPROTOCOL_INFOA info;
9630 char buf[1024];
9631 WSABUF bufs;
9632 DWORD num_bytes, flags;
9633 struct linger ling;
9634 int iret;
9635 BOOL bret;
9636 ULONG_PTR key;
9637 struct sockaddr_in bindAddress;
9638 GUID acceptExGuid = WSAID_ACCEPTEX;
9639 LPFN_ACCEPTEX pAcceptEx = NULL;
9640 fd_set fds_recv;
9642 memset(buf, 0, sizeof(buf));
9643 previous_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
9644 ok( previous_port != NULL, "Failed to create completion port %u\n", GetLastError());
9646 memset(&ov, 0, sizeof(ov));
9648 tcp_socketpair(&src, &dest);
9649 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9651 skip("failed to create sockets\n");
9652 goto end;
9655 bufs.len = sizeof(buf);
9656 bufs.buf = buf;
9657 flags = 0;
9659 ling.l_onoff = 1;
9660 ling.l_linger = 0;
9661 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9662 ok(!iret, "Failed to set linger %d\n", GetLastError());
9664 io_port = CreateIoCompletionPort( (HANDLE)dest, previous_port, 125, 0 );
9665 ok(io_port != NULL, "Failed to create completion port %u\n", GetLastError());
9667 SetLastError(0xdeadbeef);
9669 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9670 ok(iret == SOCKET_ERROR, "WSARecv returned %d\n", iret);
9671 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9673 Sleep(100);
9675 closesocket(src);
9676 src = INVALID_SOCKET;
9678 SetLastError(0xdeadbeef);
9679 key = 0xdeadbeef;
9680 num_bytes = 0xdeadbeef;
9681 olp = (WSAOVERLAPPED *)0xdeadbeef;
9683 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9684 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
9685 todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %d\n", GetLastError());
9686 ok(key == 125, "Key is %lu\n", key);
9687 ok(num_bytes == 0, "Number of bytes received is %u\n", num_bytes);
9688 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9690 SetLastError(0xdeadbeef);
9691 key = 0xdeadbeef;
9692 num_bytes = 0xdeadbeef;
9693 olp = (WSAOVERLAPPED *)0xdeadbeef;
9695 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9696 ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret );
9697 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9698 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9699 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9700 ok(!olp, "Overlapped structure is at %p\n", olp);
9702 if (dest != INVALID_SOCKET)
9703 closesocket(dest);
9705 memset(&ov, 0, sizeof(ov));
9707 tcp_socketpair(&src, &dest);
9708 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9710 skip("failed to create sockets\n");
9711 goto end;
9714 bufs.len = sizeof(buf);
9715 bufs.buf = buf;
9716 flags = 0;
9718 ling.l_onoff = 1;
9719 ling.l_linger = 0;
9720 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9721 ok(!iret, "Failed to set linger %d\n", GetLastError());
9723 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9724 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9726 set_blocking(dest, FALSE);
9728 closesocket(src);
9729 src = INVALID_SOCKET;
9731 Sleep(100);
9733 num_bytes = 0xdeadbeef;
9734 SetLastError(0xdeadbeef);
9736 iret = WSASend(dest, &bufs, 1, &num_bytes, 0, &ov, NULL);
9737 ok(iret == SOCKET_ERROR, "WSASend failed - %d\n", iret);
9738 ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9739 ok(num_bytes == 0xdeadbeef, "Managed to send %d\n", num_bytes);
9741 SetLastError(0xdeadbeef);
9742 key = 0xdeadbeef;
9743 num_bytes = 0xdeadbeef;
9744 olp = (WSAOVERLAPPED *)0xdeadbeef;
9746 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9747 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9748 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9749 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9750 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9751 ok(!olp, "Overlapped structure is at %p\n", olp);
9753 if (dest != INVALID_SOCKET)
9754 closesocket(dest);
9756 /* Test IOCP response on successful immediate read. */
9757 tcp_socketpair(&src, &dest);
9758 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9760 skip("failed to create sockets\n");
9761 goto end;
9764 bufs.len = sizeof(buf);
9765 bufs.buf = buf;
9766 flags = 0;
9767 SetLastError(0xdeadbeef);
9769 iret = WSASend(src, &bufs, 1, &num_bytes, 0, &ov, NULL);
9770 ok(!iret, "WSASend failed - %d, last error %u\n", iret, GetLastError());
9771 ok(num_bytes == sizeof(buf), "Managed to send %d\n", num_bytes);
9773 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9774 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9775 set_blocking(dest, FALSE);
9777 FD_ZERO(&fds_recv);
9778 FD_SET(dest, &fds_recv);
9779 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9781 num_bytes = 0xdeadbeef;
9782 flags = 0;
9784 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9785 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9786 ok(num_bytes == sizeof(buf), "Managed to read %d\n", num_bytes);
9788 SetLastError(0xdeadbeef);
9789 key = 0xdeadbeef;
9790 num_bytes = 0xdeadbeef;
9791 olp = (WSAOVERLAPPED *)0xdeadbeef;
9793 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9794 ok(bret == TRUE, "failed to get completion status %u\n", bret);
9795 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9796 ok(key == 125, "Key is %lu\n", key);
9797 ok(num_bytes == sizeof(buf), "Number of bytes transferred is %u\n", num_bytes);
9798 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9800 /* Test IOCP response on graceful shutdown. */
9801 closesocket(src);
9803 FD_ZERO(&fds_recv);
9804 FD_SET(dest, &fds_recv);
9805 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9807 num_bytes = 0xdeadbeef;
9808 flags = 0;
9809 memset(&ov, 0, sizeof(ov));
9811 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9812 ok(!iret, "WSARecv failed - %d, last error %u\n", iret, GetLastError());
9813 ok(!num_bytes, "Managed to read %d\n", num_bytes);
9815 SetLastError(0xdeadbeef);
9816 key = 0xdeadbeef;
9817 num_bytes = 0xdeadbeef;
9818 olp = (WSAOVERLAPPED *)0xdeadbeef;
9820 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9821 ok(bret == TRUE, "failed to get completion status %u\n", bret);
9822 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9823 ok(key == 125, "Key is %lu\n", key);
9824 ok(!num_bytes, "Number of bytes transferred is %u\n", num_bytes);
9825 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9827 closesocket(src);
9828 src = INVALID_SOCKET;
9829 closesocket(dest);
9830 dest = INVALID_SOCKET;
9832 /* Test IOCP response on hard shutdown. This was the condition that triggered
9833 * a crash in an actual app (bug 38980). */
9834 tcp_socketpair(&src, &dest);
9835 if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
9837 skip("failed to create sockets\n");
9838 goto end;
9841 bufs.len = sizeof(buf);
9842 bufs.buf = buf;
9843 flags = 0;
9844 memset(&ov, 0, sizeof(ov));
9846 ling.l_onoff = 1;
9847 ling.l_linger = 0;
9848 iret = setsockopt (src, SOL_SOCKET, SO_LINGER, (char *) &ling, sizeof(ling));
9849 ok(!iret, "Failed to set linger %d\n", GetLastError());
9851 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9852 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9853 set_blocking(dest, FALSE);
9855 closesocket(src);
9856 src = INVALID_SOCKET;
9858 FD_ZERO(&fds_recv);
9859 FD_SET(dest, &fds_recv);
9860 select(dest + 1, &fds_recv, NULL, NULL, NULL);
9862 num_bytes = 0xdeadbeef;
9863 SetLastError(0xdeadbeef);
9865 /* Somehow a hard shutdown doesn't work on my Linux box. It seems SO_LINGER is ignored. */
9866 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9867 todo_wine ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9868 todo_wine ok(GetLastError() == WSAECONNRESET, "Last error was %d\n", GetLastError());
9869 todo_wine ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9871 SetLastError(0xdeadbeef);
9872 key = 0xdeadbeef;
9873 num_bytes = 0xdeadbeef;
9874 olp = (WSAOVERLAPPED *)0xdeadbeef;
9876 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9877 todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9878 todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9879 todo_wine ok(key == 0xdeadbeef, "Key is %lu\n", key);
9880 todo_wine ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9881 todo_wine ok(!olp, "Overlapped structure is at %p\n", olp);
9883 closesocket(dest);
9885 /* Test reading from a non-connected socket, mostly because the above test is marked todo. */
9886 dest = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9887 ok(dest != INVALID_SOCKET, "socket() failed\n");
9889 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 125, 0);
9890 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9891 set_blocking(dest, FALSE);
9893 num_bytes = 0xdeadbeef;
9894 SetLastError(0xdeadbeef);
9895 memset(&ov, 0, sizeof(ov));
9897 iret = WSARecv(dest, &bufs, 1, &num_bytes, &flags, &ov, NULL);
9898 ok(iret == SOCKET_ERROR, "WSARecv failed - %d\n", iret);
9899 ok(GetLastError() == WSAENOTCONN, "Last error was %d\n", GetLastError());
9900 ok(num_bytes == 0xdeadbeef, "Managed to read %d\n", num_bytes);
9902 SetLastError(0xdeadbeef);
9903 key = 0xdeadbeef;
9904 num_bytes = 0xdeadbeef;
9905 olp = (WSAOVERLAPPED *)0xdeadbeef;
9907 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9908 ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
9909 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9910 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9911 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9912 ok(!olp, "Overlapped structure is at %p\n", olp);
9914 num_bytes = 0xdeadbeef;
9915 closesocket(dest);
9917 dest = socket(AF_INET, SOCK_STREAM, 0);
9918 if (dest == INVALID_SOCKET)
9920 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9921 goto end;
9924 iret = WSAIoctl(dest, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptExGuid, sizeof(acceptExGuid),
9925 &pAcceptEx, sizeof(pAcceptEx), &num_bytes, NULL, NULL);
9926 if (iret)
9928 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret, WSAGetLastError());
9929 goto end;
9932 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
9934 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
9935 goto end;
9937 SetLastError(0xdeadbeef);
9939 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
9940 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
9941 &num_bytes, &ov);
9942 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
9943 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9945 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
9946 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9948 closesocket(src);
9949 src = INVALID_SOCKET;
9951 SetLastError(0xdeadbeef);
9952 key = 0xdeadbeef;
9953 num_bytes = 0xdeadbeef;
9954 olp = (WSAOVERLAPPED *)0xdeadbeef;
9956 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
9957 ok(bret == FALSE, "failed to get completion status %u\n", bret);
9958 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
9959 ok(key == 125, "Key is %lu\n", key);
9960 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
9961 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
9962 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
9964 SetLastError(0xdeadbeef);
9965 key = 0xdeadbeef;
9966 num_bytes = 0xdeadbeef;
9967 olp = (WSAOVERLAPPED *)0xdeadbeef;
9968 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
9969 ok(bret == FALSE, "failed to get completion status %u\n", bret);
9970 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
9971 ok(key == 0xdeadbeef, "Key is %lu\n", key);
9972 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
9973 ok(!olp, "Overlapped structure is at %p\n", olp);
9975 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
9977 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
9978 goto end;
9980 SetLastError(0xdeadbeef);
9982 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
9983 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
9985 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
9986 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
9987 &num_bytes, &ov);
9988 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
9989 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
9991 closesocket(src);
9992 src = INVALID_SOCKET;
9994 SetLastError(0xdeadbeef);
9995 key = 0xdeadbeef;
9996 num_bytes = 0xdeadbeef;
9997 olp = (WSAOVERLAPPED *)0xdeadbeef;
9999 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10000 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10001 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10002 ok(key == 125, "Key is %lu\n", key);
10003 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10004 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10005 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10007 SetLastError(0xdeadbeef);
10008 key = 0xdeadbeef;
10009 num_bytes = 0xdeadbeef;
10010 olp = (WSAOVERLAPPED *)0xdeadbeef;
10011 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10012 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10013 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10014 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10015 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10016 ok(!olp, "Overlapped structure is at %p\n", olp);
10018 /* Test IOCP with duplicated handle */
10020 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10021 goto end;
10023 SetLastError(0xdeadbeef);
10025 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10026 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10028 WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10029 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10030 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10032 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10033 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10034 &num_bytes, &ov);
10035 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10036 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10038 SetLastError(0xdeadbeef);
10039 key = 0xdeadbeef;
10040 num_bytes = 0xdeadbeef;
10041 olp = (WSAOVERLAPPED *)0xdeadbeef;
10042 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10043 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10044 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10045 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10046 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10047 ok(!olp, "Overlapped structure is at %p\n", olp);
10049 closesocket(src);
10050 src = INVALID_SOCKET;
10051 closesocket(dup);
10052 dup = INVALID_SOCKET;
10054 SetLastError(0xdeadbeef);
10055 key = 0xdeadbeef;
10056 num_bytes = 0xdeadbeef;
10057 olp = (WSAOVERLAPPED *)0xdeadbeef;
10058 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10059 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10060 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10061 ok(key == 125, "Key is %lu\n", key);
10062 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10063 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10064 ok(olp && olp->Internal == (ULONG)STATUS_CANCELLED, "Internal status is %lx\n", olp ? olp->Internal : 0);
10066 SetLastError(0xdeadbeef);
10067 key = 0xdeadbeef;
10068 num_bytes = 0xdeadbeef;
10069 olp = (WSAOVERLAPPED *)0xdeadbeef;
10070 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10071 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10072 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10073 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10074 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10075 ok(!olp, "Overlapped structure is at %p\n", olp);
10077 /* Test IOCP with duplicated handle (closing duplicated handle) */
10079 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10080 goto end;
10082 SetLastError(0xdeadbeef);
10084 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10085 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10087 WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10088 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10089 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10091 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10092 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10093 &num_bytes, &ov);
10094 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10095 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10097 closesocket(dup);
10098 dup = INVALID_SOCKET;
10100 SetLastError(0xdeadbeef);
10101 key = 0xdeadbeef;
10102 num_bytes = 0xdeadbeef;
10103 olp = (WSAOVERLAPPED *)0xdeadbeef;
10104 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10105 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10106 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10107 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10108 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10109 ok(!olp, "Overlapped structure is at %p\n", olp);
10111 SetLastError(0xdeadbeef);
10112 key = 0xdeadbeef;
10113 num_bytes = 0xdeadbeef;
10114 olp = (WSAOVERLAPPED *)0xdeadbeef;
10115 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10116 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10117 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10118 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10119 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10120 ok(!olp, "Overlapped structure is at %p\n", olp);
10122 closesocket(src);
10123 src = INVALID_SOCKET;
10125 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10126 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10127 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10128 ok(key == 125, "Key is %lu\n", key);
10129 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10130 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10131 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10133 SetLastError(0xdeadbeef);
10134 key = 0xdeadbeef;
10135 num_bytes = 0xdeadbeef;
10136 olp = (WSAOVERLAPPED *)0xdeadbeef;
10137 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10138 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10139 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10140 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10141 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10142 ok(!olp, "Overlapped structure is at %p\n", olp);
10144 /* Test IOCP with duplicated handle (closing original handle) */
10146 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10147 goto end;
10149 SetLastError(0xdeadbeef);
10151 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10152 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10154 WSADuplicateSocketA( src, GetCurrentProcessId(), &info );
10155 dup = WSASocketA(AF_INET, SOCK_STREAM, 0, &info, 0, WSA_FLAG_OVERLAPPED);
10156 ok(dup != INVALID_SOCKET, "failed to duplicate socket!\n");
10158 bret = pAcceptEx(dup, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10159 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10160 &num_bytes, &ov);
10161 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10162 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10164 closesocket(src);
10165 src = INVALID_SOCKET;
10167 SetLastError(0xdeadbeef);
10168 key = 0xdeadbeef;
10169 num_bytes = 0xdeadbeef;
10170 olp = (WSAOVERLAPPED *)0xdeadbeef;
10171 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10172 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10173 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10174 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10175 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10176 ok(!olp, "Overlapped structure is at %p\n", olp);
10178 closesocket(dup);
10179 dup = INVALID_SOCKET;
10181 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10182 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10183 ok(GetLastError() == ERROR_OPERATION_ABORTED, "Last error was %d\n", GetLastError());
10184 ok(key == 125, "Key is %lu\n", key);
10185 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10186 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10187 ok(olp && (olp->Internal == (ULONG)STATUS_CANCELLED), "Internal status is %lx\n", olp ? olp->Internal : 0);
10189 SetLastError(0xdeadbeef);
10190 key = 0xdeadbeef;
10191 num_bytes = 0xdeadbeef;
10192 olp = (WSAOVERLAPPED *)0xdeadbeef;
10193 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10194 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10195 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10196 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10197 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10198 ok(!olp, "Overlapped structure is at %p\n", olp);
10200 /* Test IOCP without AcceptEx */
10202 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10203 goto end;
10205 SetLastError(0xdeadbeef);
10207 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10208 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10210 closesocket(src);
10211 src = INVALID_SOCKET;
10213 SetLastError(0xdeadbeef);
10214 key = 0xdeadbeef;
10215 num_bytes = 0xdeadbeef;
10216 olp = (WSAOVERLAPPED *)0xdeadbeef;
10217 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10218 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10219 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10220 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10221 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10222 ok(!olp, "Overlapped structure is at %p\n", olp);
10224 /* */
10226 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10227 goto end;
10229 connector = socket(AF_INET, SOCK_STREAM, 0);
10230 if (connector == INVALID_SOCKET) {
10231 skip("could not create connector socket, error %d\n", WSAGetLastError());
10232 goto end;
10235 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10236 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10238 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10239 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10241 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10242 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10243 &num_bytes, &ov);
10244 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10245 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10247 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10248 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10250 closesocket(connector);
10251 connector = INVALID_SOCKET;
10253 SetLastError(0xdeadbeef);
10254 key = 0xdeadbeef;
10255 num_bytes = 0xdeadbeef;
10256 olp = (WSAOVERLAPPED *)0xdeadbeef;
10258 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10259 ok(bret == TRUE, "failed to get completion status %u\n", bret);
10260 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10261 ok(key == 125, "Key is %lu\n", key);
10262 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10263 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10264 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10266 SetLastError(0xdeadbeef);
10267 key = 0xdeadbeef;
10268 num_bytes = 0xdeadbeef;
10269 olp = (WSAOVERLAPPED *)0xdeadbeef;
10270 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10271 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10272 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10273 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10274 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10275 ok(!olp, "Overlapped structure is at %p\n", olp);
10277 if (dest != INVALID_SOCKET)
10278 closesocket(dest);
10279 if (src != INVALID_SOCKET)
10280 closesocket(dest);
10282 /* */
10284 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10285 goto end;
10287 dest = socket(AF_INET, SOCK_STREAM, 0);
10288 if (dest == INVALID_SOCKET)
10290 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10291 goto end;
10294 connector = socket(AF_INET, SOCK_STREAM, 0);
10295 if (connector == INVALID_SOCKET) {
10296 skip("could not create connector socket, error %d\n", WSAGetLastError());
10297 goto end;
10300 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10301 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10303 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10304 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10306 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10307 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10308 &num_bytes, &ov);
10309 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10310 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10312 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10313 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10315 iret = send(connector, buf, 1, 0);
10316 ok(iret == 1, "could not send 1 byte: send %d errno %d\n", iret, WSAGetLastError());
10318 Sleep(100);
10320 closesocket(dest);
10321 dest = INVALID_SOCKET;
10323 SetLastError(0xdeadbeef);
10324 key = 0xdeadbeef;
10325 num_bytes = 0xdeadbeef;
10326 olp = (WSAOVERLAPPED *)0xdeadbeef;
10328 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10329 ok(bret == TRUE, "failed to get completion status %u\n", bret);
10330 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
10331 ok(key == 125, "Key is %lu\n", key);
10332 ok(num_bytes == 1, "Number of bytes transferred is %u\n", num_bytes);
10333 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10334 ok(olp && (olp->Internal == (ULONG)STATUS_SUCCESS), "Internal status is %lx\n", olp ? olp->Internal : 0);
10336 SetLastError(0xdeadbeef);
10337 key = 0xdeadbeef;
10338 num_bytes = 0xdeadbeef;
10339 olp = (WSAOVERLAPPED *)0xdeadbeef;
10340 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10341 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10342 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10343 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10344 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10345 ok(!olp, "Overlapped structure is at %p\n", olp);
10347 if (src != INVALID_SOCKET)
10348 closesocket(src);
10349 if (connector != INVALID_SOCKET)
10350 closesocket(connector);
10352 /* */
10354 if ((src = setup_iocp_src(&bindAddress)) == INVALID_SOCKET)
10355 goto end;
10357 dest = socket(AF_INET, SOCK_STREAM, 0);
10358 if (dest == INVALID_SOCKET)
10360 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
10361 goto end;
10364 connector = socket(AF_INET, SOCK_STREAM, 0);
10365 if (connector == INVALID_SOCKET) {
10366 skip("could not create connector socket, error %d\n", WSAGetLastError());
10367 goto end;
10370 io_port = CreateIoCompletionPort((HANDLE)src, previous_port, 125, 0);
10371 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10373 io_port = CreateIoCompletionPort((HANDLE)dest, previous_port, 236, 0);
10374 ok(io_port != NULL, "failed to create completion port %u\n", GetLastError());
10376 bret = pAcceptEx(src, dest, buf, sizeof(buf) - 2*(sizeof(struct sockaddr_in) + 16),
10377 sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
10378 &num_bytes, &ov);
10379 ok(bret == FALSE, "AcceptEx returned %d\n", bret);
10380 ok(GetLastError() == ERROR_IO_PENDING, "Last error was %d\n", GetLastError());
10382 iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
10383 ok(iret == 0, "connecting to accepting socket failed, error %d\n", GetLastError());
10385 closesocket(dest);
10386 dest = INVALID_SOCKET;
10388 SetLastError(0xdeadbeef);
10389 key = 0xdeadbeef;
10390 num_bytes = 0xdeadbeef;
10391 olp = (WSAOVERLAPPED *)0xdeadbeef;
10393 bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
10394 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10395 todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED ||
10396 GetLastError() == ERROR_OPERATION_ABORTED ||
10397 GetLastError() == ERROR_CONNECTION_ABORTED ||
10398 GetLastError() == ERROR_PIPE_NOT_CONNECTED /* win 2000 */,
10399 "Last error was %d\n", GetLastError());
10400 ok(key == 125, "Key is %lu\n", key);
10401 ok(num_bytes == 0, "Number of bytes transferred is %u\n", num_bytes);
10402 ok(olp == &ov, "Overlapped structure is at %p\n", olp);
10403 todo_wine ok(olp && (olp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT ||
10404 olp->Internal == (ULONG)STATUS_CANCELLED ||
10405 olp->Internal == (ULONG)STATUS_CONNECTION_ABORTED ||
10406 olp->Internal == (ULONG)STATUS_PIPE_DISCONNECTED /* win 2000 */),
10407 "Internal status is %lx\n", olp ? olp->Internal : 0);
10409 SetLastError(0xdeadbeef);
10410 key = 0xdeadbeef;
10411 num_bytes = 0xdeadbeef;
10412 olp = (WSAOVERLAPPED *)0xdeadbeef;
10413 bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
10414 ok(bret == FALSE, "failed to get completion status %u\n", bret);
10415 ok(GetLastError() == WAIT_TIMEOUT, "Last error was %d\n", GetLastError());
10416 ok(key == 0xdeadbeef, "Key is %lu\n", key);
10417 ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes);
10418 ok(!olp, "Overlapped structure is at %p\n", olp);
10421 end:
10422 if (dest != INVALID_SOCKET)
10423 closesocket(dest);
10424 if (src != INVALID_SOCKET)
10425 closesocket(src);
10426 if (connector != INVALID_SOCKET)
10427 closesocket(connector);
10428 CloseHandle(previous_port);
10431 static void test_address_list_query(void)
10433 SOCKET_ADDRESS_LIST *address_list;
10434 DWORD bytes_returned, size;
10435 unsigned int i;
10436 SOCKET s;
10437 int ret;
10439 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
10440 ok(s != INVALID_SOCKET, "Failed to create socket, error %d.\n", WSAGetLastError());
10442 bytes_returned = 0;
10443 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, 0, &bytes_returned, NULL, NULL);
10444 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10445 if(WSAGetLastError() == WSAEINVAL)
10447 win_skip("Windows <= NT4 is not supported in this test\n");
10448 closesocket(s);
10449 return;
10451 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10452 ok(bytes_returned >= FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]),
10453 "Got unexpected bytes_returned %u.\n", bytes_returned);
10455 size = bytes_returned;
10456 bytes_returned = 0;
10457 address_list = HeapAlloc(GetProcessHeap(), 0, size * 2);
10458 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size * 2, &bytes_returned, NULL, NULL);
10459 ok(!ret, "Got unexpected ret %d, error %d.\n", ret, WSAGetLastError());
10460 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10462 bytes_returned = FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[address_list->iAddressCount]);
10463 for (i = 0; i < address_list->iAddressCount; ++i)
10465 bytes_returned += address_list->Address[i].iSockaddrLength;
10467 ok(size == bytes_returned, "Got unexpected size %u, expected %u.\n", size, bytes_returned);
10469 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, size, NULL, NULL, NULL);
10470 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10471 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10473 bytes_returned = 0xdeadbeef;
10474 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, NULL, size, &bytes_returned, NULL, NULL);
10475 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10476 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10477 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10479 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list, 1, &bytes_returned, NULL, NULL);
10480 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10481 ok(WSAGetLastError() == WSAEINVAL, "Got unexpected error %d.\n", WSAGetLastError());
10482 ok(bytes_returned == 0, "Got unexpected bytes_returned %u.\n", bytes_returned);
10484 ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, address_list,
10485 FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]), &bytes_returned, NULL, NULL);
10486 ok(ret == SOCKET_ERROR, "Got unexpected ret %d.\n", ret);
10487 ok(WSAGetLastError() == WSAEFAULT, "Got unexpected error %d.\n", WSAGetLastError());
10488 ok(bytes_returned == size, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned, size);
10490 HeapFree(GetProcessHeap(), 0, address_list);
10491 closesocket(s);
10494 static DWORD WINAPI inet_ntoa_thread_proc(void *param)
10496 ULONG addr;
10497 const char *str;
10498 HANDLE *event = param;
10500 addr = inet_addr("4.3.2.1");
10501 ok(addr == htonl(0x04030201), "expected 0x04030201, got %08x\n", addr);
10502 str = inet_ntoa(*(struct in_addr *)&addr);
10503 ok(!strcmp(str, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str);
10505 SetEvent(event[0]);
10506 WaitForSingleObject(event[1], 3000);
10508 return 0;
10511 static void test_inet_ntoa(void)
10513 ULONG addr;
10514 const char *str;
10515 HANDLE thread, event[2];
10516 DWORD tid;
10518 addr = inet_addr("1.2.3.4");
10519 ok(addr == htonl(0x01020304), "expected 0x01020304, got %08x\n", addr);
10520 str = inet_ntoa(*(struct in_addr *)&addr);
10521 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10523 event[0] = CreateEventW(NULL, TRUE, FALSE, NULL);
10524 event[1] = CreateEventW(NULL, TRUE, FALSE, NULL);
10526 thread = CreateThread(NULL, 0, inet_ntoa_thread_proc, event, 0, &tid);
10527 WaitForSingleObject(event[0], 3000);
10529 ok(!strcmp(str, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str);
10531 SetEvent(event[1]);
10532 WaitForSingleObject(thread, 3000);
10534 CloseHandle(event[0]);
10535 CloseHandle(event[1]);
10536 CloseHandle(thread);
10539 static void test_WSALookupService(void)
10541 char buffer[4096], strbuff[128];
10542 WSAQUERYSETW *qs = NULL;
10543 HANDLE hnd;
10544 PNLA_BLOB netdata;
10545 int ret;
10546 DWORD error, offset, bsize;
10548 if (!pWSALookupServiceBeginW || !pWSALookupServiceEnd || !pWSALookupServiceNextW)
10550 win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n");
10551 return;
10554 qs = (WSAQUERYSETW *)buffer;
10555 memset(qs, 0, sizeof(*qs));
10557 /* invalid parameter tests */
10558 ret = pWSALookupServiceBeginW(NULL, 0, &hnd);
10559 error = WSAGetLastError();
10560 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10561 todo_wine
10562 ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10564 ret = pWSALookupServiceBeginW(qs, 0, NULL);
10565 error = WSAGetLastError();
10566 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10567 todo_wine
10568 ok(error == WSAEFAULT, "expected 10014, got %d\n", error);
10570 ret = pWSALookupServiceBeginW(qs, 0, &hnd);
10571 error = WSAGetLastError();
10572 ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n");
10573 todo_wine
10574 ok(error == WSAEINVAL
10575 || broken(error == ERROR_INVALID_PARAMETER) /* == XP */
10576 || broken(error == WSAEFAULT) /* == NT */
10577 || broken(error == WSASERVICE_NOT_FOUND) /* == 2000 */,
10578 "expected 10022, got %d\n", error);
10580 ret = pWSALookupServiceEnd(NULL);
10581 error = WSAGetLastError();
10582 todo_wine
10583 ok(ret == SOCKET_ERROR, "WSALookupServiceEnd should have failed\n");
10584 todo_wine
10585 ok(error == ERROR_INVALID_HANDLE, "expected 6, got %d\n", error);
10587 /* standard network list query */
10588 qs->dwSize = sizeof(*qs);
10589 hnd = (HANDLE)0xdeadbeef;
10590 ret = pWSALookupServiceBeginW(qs, LUP_RETURN_ALL | LUP_DEEP, &hnd);
10591 error = WSAGetLastError();
10592 if(ret && error == ERROR_INVALID_PARAMETER)
10594 win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n");
10595 return;
10598 todo_wine
10599 ok(!ret, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error);
10600 todo_wine
10601 ok(hnd != (HANDLE)0xdeadbeef, "Handle was not filled\n");
10603 offset = 0;
10606 memset(qs, 0, sizeof(*qs));
10607 bsize = sizeof(buffer);
10609 if (pWSALookupServiceNextW(hnd, 0, &bsize, qs) == SOCKET_ERROR)
10611 error = WSAGetLastError();
10612 if (error == WSA_E_NO_MORE) break;
10613 ok(0, "Error %d happened while listing services\n", error);
10614 break;
10617 WideCharToMultiByte(CP_ACP, 0, qs->lpszServiceInstanceName, -1,
10618 strbuff, sizeof(strbuff), NULL, NULL);
10619 trace("Network Name: %s\n", strbuff);
10621 /* network data is written in the blob field */
10622 if (qs->lpBlob)
10624 /* each network may have multiple NLA_BLOB information structures */
10627 netdata = (PNLA_BLOB) &qs->lpBlob->pBlobData[offset];
10628 switch (netdata->header.type)
10630 case NLA_RAW_DATA:
10631 trace("\tNLA Data Type: NLA_RAW_DATA\n");
10632 break;
10633 case NLA_INTERFACE:
10634 trace("\tNLA Data Type: NLA_INTERFACE\n");
10635 trace("\t\tType: %d\n", netdata->data.interfaceData.dwType);
10636 trace("\t\tSpeed: %d\n", netdata->data.interfaceData.dwSpeed);
10637 trace("\t\tAdapter Name: %s\n", netdata->data.interfaceData.adapterName);
10638 break;
10639 case NLA_802_1X_LOCATION:
10640 trace("\tNLA Data Type: NLA_802_1X_LOCATION\n");
10641 trace("\t\tInformation: %s\n", netdata->data.locationData.information);
10642 break;
10643 case NLA_CONNECTIVITY:
10644 switch (netdata->data.connectivity.type)
10646 case NLA_NETWORK_AD_HOC:
10647 trace("\t\tNetwork Type: AD HOC\n");
10648 break;
10649 case NLA_NETWORK_MANAGED:
10650 trace("\t\tNetwork Type: Managed\n");
10651 break;
10652 case NLA_NETWORK_UNMANAGED:
10653 trace("\t\tNetwork Type: Unmanaged\n");
10654 break;
10655 case NLA_NETWORK_UNKNOWN:
10656 trace("\t\tNetwork Type: Unknown\n");
10658 switch (netdata->data.connectivity.internet)
10660 case NLA_INTERNET_NO:
10661 trace("\t\tInternet connectivity: No\n");
10662 break;
10663 case NLA_INTERNET_YES:
10664 trace("\t\tInternet connectivity: Yes\n");
10665 break;
10666 case NLA_INTERNET_UNKNOWN:
10667 trace("\t\tInternet connectivity: Unknown\n");
10668 break;
10670 break;
10671 case NLA_ICS:
10672 trace("\tNLA Data Type: NLA_ICS\n");
10673 trace("\t\tSpeed: %d\n",
10674 netdata->data.ICS.remote.speed);
10675 trace("\t\tType: %d\n",
10676 netdata->data.ICS.remote.type);
10677 trace("\t\tState: %d\n",
10678 netdata->data.ICS.remote.state);
10679 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.machineName, -1,
10680 strbuff, sizeof(strbuff), NULL, NULL);
10681 trace("\t\tMachine Name: %s\n", strbuff);
10682 WideCharToMultiByte(CP_ACP, 0, netdata->data.ICS.remote.sharedAdapterName, -1,
10683 strbuff, sizeof(strbuff), NULL, NULL);
10684 trace("\t\tShared Adapter Name: %s\n", strbuff);
10685 break;
10686 default:
10687 trace("\tNLA Data Type: Unknown\n");
10688 break;
10691 while (offset);
10694 while (1);
10696 ret = pWSALookupServiceEnd(hnd);
10697 ok(!ret, "WSALookupServiceEnd failed unexpectedly\n");
10700 static void test_WSAEnumNameSpaceProvidersA(void)
10702 LPWSANAMESPACE_INFOA name = NULL;
10703 DWORD ret, error, blen = 0, i;
10704 if (!pWSAEnumNameSpaceProvidersA)
10706 win_skip("WSAEnumNameSpaceProvidersA not found\n");
10707 return;
10710 SetLastError(0xdeadbeef);
10711 ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10712 error = WSAGetLastError();
10713 todo_wine
10714 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10715 todo_wine
10716 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10718 /* Invalid parameter tests */
10719 SetLastError(0xdeadbeef);
10720 ret = pWSAEnumNameSpaceProvidersA(NULL, name);
10721 error = WSAGetLastError();
10722 todo_wine
10723 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10724 todo_wine
10725 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10727 SetLastError(0xdeadbeef);
10728 ret = pWSAEnumNameSpaceProvidersA(NULL, NULL);
10729 error = WSAGetLastError();
10730 todo_wine
10731 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10732 todo_wine
10733 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10735 SetLastError(0xdeadbeef);
10736 ret = pWSAEnumNameSpaceProvidersA(&blen, NULL);
10737 error = WSAGetLastError();
10738 todo_wine
10739 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10740 todo_wine
10741 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10743 name = HeapAlloc(GetProcessHeap(), 0, blen);
10744 if (!name)
10746 skip("Failed to alloc memory\n");
10747 return;
10750 ret = pWSAEnumNameSpaceProvidersA(&blen, name);
10751 todo_wine
10752 ok(ret > 0, "Expected more than zero name space providers\n");
10754 for (i = 0;i < ret; i++)
10756 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10757 name[i].lpszIdentifier);
10758 switch (name[i].dwNameSpace)
10760 case NS_DNS:
10761 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10762 break;
10763 case NS_NLA:
10764 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10765 break;
10766 default:
10767 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10768 break;
10770 trace("\tActive: %d\n", name[i].fActive);
10771 trace("\tVersion: %d\n", name[i].dwVersion);
10774 HeapFree(GetProcessHeap(), 0, name);
10777 static void test_WSAEnumNameSpaceProvidersW(void)
10779 LPWSANAMESPACE_INFOW name = NULL;
10780 DWORD ret, error, blen = 0, i;
10781 if (!pWSAEnumNameSpaceProvidersW)
10783 win_skip("WSAEnumNameSpaceProvidersW not found\n");
10784 return;
10787 SetLastError(0xdeadbeef);
10788 ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10789 error = WSAGetLastError();
10790 todo_wine
10791 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10792 todo_wine
10793 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10795 /* Invalid parameter tests */
10796 SetLastError(0xdeadbeef);
10797 ret = pWSAEnumNameSpaceProvidersW(NULL, name);
10798 error = WSAGetLastError();
10799 todo_wine
10800 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10801 todo_wine
10802 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10804 SetLastError(0xdeadbeef);
10805 ret = pWSAEnumNameSpaceProvidersW(NULL, NULL);
10806 error = WSAGetLastError();
10807 todo_wine
10808 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10809 todo_wine
10810 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10812 SetLastError(0xdeadbeef);
10813 ret = pWSAEnumNameSpaceProvidersW(&blen, NULL);
10814 error = WSAGetLastError();
10815 todo_wine
10816 ok(ret == SOCKET_ERROR, "Expected failure, got %u\n", ret);
10817 todo_wine
10818 ok(error == WSAEFAULT, "Expected 10014, got %u\n", error);
10820 name = HeapAlloc(GetProcessHeap(), 0, blen);
10821 if (!name)
10823 skip("Failed to alloc memory\n");
10824 return;
10827 ret = pWSAEnumNameSpaceProvidersW(&blen, name);
10828 todo_wine
10829 ok(ret > 0, "Expected more than zero name space providers\n");
10831 for (i = 0;i < ret; i++)
10833 trace("Name space Identifier (%p): %s\n", name[i].lpszIdentifier,
10834 wine_dbgstr_w(name[i].lpszIdentifier));
10835 switch (name[i].dwNameSpace)
10837 case NS_DNS:
10838 trace("\tName space ID: NS_DNS (%u)\n", name[i].dwNameSpace);
10839 break;
10840 case NS_NLA:
10841 trace("\tName space ID: NS_NLA (%u)\n", name[i].dwNameSpace);
10842 break;
10843 default:
10844 trace("\tName space ID: Unknown (%u)\n", name[i].dwNameSpace);
10845 break;
10847 trace("\tActive: %d\n", name[i].fActive);
10848 trace("\tVersion: %d\n", name[i].dwVersion);
10851 HeapFree(GetProcessHeap(), 0, name);
10854 static void sync_read(SOCKET src, SOCKET dst)
10856 int ret;
10857 char data[512];
10859 ret = send(dst, "Hello World!", 12, 0);
10860 ok(ret == 12, "send returned %d\n", ret);
10862 memset(data, 0, sizeof(data));
10863 ret = recv(src, data, sizeof(data), 0);
10864 ok(ret == 12, "expected 12, got %d\n", ret);
10865 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", ret, ret, data);
10868 static void iocp_async_read(SOCKET src, SOCKET dst)
10870 HANDLE port;
10871 WSAOVERLAPPED ovl, *ovl_iocp;
10872 WSABUF buf;
10873 int ret;
10874 char data[512];
10875 DWORD flags, bytes;
10876 ULONG_PTR key;
10878 memset(data, 0, sizeof(data));
10879 memset(&ovl, 0, sizeof(ovl));
10881 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
10882 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
10884 buf.len = sizeof(data);
10885 buf.buf = data;
10886 bytes = 0xdeadbeef;
10887 flags = 0;
10888 SetLastError(0xdeadbeef);
10889 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
10890 ok(ret == SOCKET_ERROR, "got %d\n", ret);
10891 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
10892 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10894 bytes = 0xdeadbeef;
10895 key = 0xdeadbeef;
10896 ovl_iocp = (void *)0xdeadbeef;
10897 SetLastError(0xdeadbeef);
10898 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10899 ok(!ret, "got %d\n", ret);
10900 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10901 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10902 ok(key == 0xdeadbeef, "got key %#lx\n", key);
10903 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
10905 ret = send(dst, "Hello World!", 12, 0);
10906 ok(ret == 12, "send returned %d\n", ret);
10908 bytes = 0xdeadbeef;
10909 key = 0xdeadbeef;
10910 ovl_iocp = NULL;
10911 SetLastError(0xdeadbeef);
10912 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10913 ok(ret, "got %d\n", ret);
10914 ok(bytes == 12, "got bytes %u\n", bytes);
10915 ok(key == 0x12345678, "got key %#lx\n", key);
10916 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
10917 if (ovl_iocp)
10919 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
10920 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
10921 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
10924 bytes = 0xdeadbeef;
10925 key = 0xdeadbeef;
10926 ovl_iocp = (void *)0xdeadbeef;
10927 SetLastError(0xdeadbeef);
10928 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10929 ok(!ret, "got %d\n", ret);
10930 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10931 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10932 ok(key == 0xdeadbeef, "got key %#lx\n", key);
10933 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
10935 CloseHandle(port);
10938 static void iocp_async_read_closesocket(SOCKET src, int how_to_close)
10940 HANDLE port;
10941 WSAOVERLAPPED ovl, *ovl_iocp;
10942 WSABUF buf;
10943 int ret;
10944 char data[512];
10945 DWORD flags, bytes;
10946 ULONG_PTR key;
10947 HWND hwnd;
10948 MSG msg;
10950 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
10951 0, 0, 0, 0, NULL, NULL, 0, NULL);
10952 ok(hwnd != 0, "CreateWindowEx failed\n");
10954 ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
10955 ok(!ret, "got %d\n", ret);
10957 Sleep(100);
10958 memset(&msg, 0, sizeof(msg));
10959 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
10960 ok(ret, "got %d\n", ret);
10961 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
10962 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
10963 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
10964 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
10966 memset(data, 0, sizeof(data));
10967 memset(&ovl, 0, sizeof(ovl));
10969 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
10970 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
10972 Sleep(100);
10973 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
10974 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
10976 buf.len = sizeof(data);
10977 buf.buf = data;
10978 bytes = 0xdeadbeef;
10979 flags = 0;
10980 SetLastError(0xdeadbeef);
10981 ret = WSARecv(src, &buf, 1, &bytes, &flags, &ovl, NULL);
10982 ok(ret == SOCKET_ERROR, "got %d\n", ret);
10983 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
10984 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10986 Sleep(100);
10987 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
10988 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
10990 bytes = 0xdeadbeef;
10991 key = 0xdeadbeef;
10992 ovl_iocp = (void *)0xdeadbeef;
10993 SetLastError(0xdeadbeef);
10994 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
10995 ok(!ret, "got %d\n", ret);
10996 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
10997 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
10998 ok(key == 0xdeadbeef, "got key %#lx\n", key);
10999 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11001 Sleep(100);
11002 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11003 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11005 switch (how_to_close)
11007 case 0:
11008 closesocket(src);
11009 break;
11010 case 1:
11011 CloseHandle((HANDLE)src);
11012 break;
11013 case 2:
11014 pNtClose((HANDLE)src);
11015 break;
11016 default:
11017 ok(0, "wrong value %d\n", how_to_close);
11018 break;
11021 Sleep(200);
11022 memset(&msg, 0, sizeof(msg));
11023 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11024 switch (how_to_close)
11026 case 0:
11027 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11028 break;
11029 case 1:
11030 case 2:
11031 todo_wine
11033 ok(ret, "got %d\n", ret);
11034 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11035 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11036 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11037 ok(msg.lParam == 0x20, "got %08lx\n", msg.lParam);
11039 break;
11040 default:
11041 ok(0, "wrong value %d\n", how_to_close);
11042 break;
11045 bytes = 0xdeadbeef;
11046 key = 0xdeadbeef;
11047 ovl_iocp = NULL;
11048 SetLastError(0xdeadbeef);
11049 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11050 ok(!ret, "got %d\n", ret);
11051 todo_wine
11052 ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError());
11053 ok(!bytes, "got bytes %u\n", bytes);
11054 ok(key == 0x12345678, "got key %#lx\n", key);
11055 ok(ovl_iocp == &ovl, "got ovl %p\n", ovl_iocp);
11056 if (ovl_iocp)
11058 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11059 todo_wine
11060 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11063 bytes = 0xdeadbeef;
11064 key = 0xdeadbeef;
11065 ovl_iocp = (void *)0xdeadbeef;
11066 SetLastError(0xdeadbeef);
11067 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11068 ok(!ret, "got %d\n", ret);
11069 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11070 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11071 ok(key == 0xdeadbeef, "got key %#lx\n", key);
11072 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11074 CloseHandle(port);
11076 DestroyWindow(hwnd);
11079 static void iocp_async_closesocket(SOCKET src)
11081 HANDLE port;
11082 WSAOVERLAPPED *ovl_iocp;
11083 int ret;
11084 DWORD bytes;
11085 ULONG_PTR key;
11086 HWND hwnd;
11087 MSG msg;
11089 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11090 0, 0, 0, 0, NULL, NULL, 0, NULL);
11091 ok(hwnd != 0, "CreateWindowEx failed\n");
11093 ret = WSAAsyncSelect(src, hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
11094 ok(!ret, "got %d\n", ret);
11096 Sleep(100);
11097 memset(&msg, 0, sizeof(msg));
11098 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11099 ok(ret, "got %d\n", ret);
11100 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11101 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11102 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11103 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11105 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11106 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11108 Sleep(100);
11109 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11110 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11112 bytes = 0xdeadbeef;
11113 key = 0xdeadbeef;
11114 ovl_iocp = (void *)0xdeadbeef;
11115 SetLastError(0xdeadbeef);
11116 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11117 ok(!ret, "got %d\n", ret);
11118 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11119 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11120 ok(key == 0xdeadbeef, "got key %lu\n", key);
11121 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11123 Sleep(100);
11124 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11125 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11127 closesocket(src);
11129 Sleep(100);
11130 memset(&msg, 0, sizeof(msg));
11131 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11132 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11134 bytes = 0xdeadbeef;
11135 key = 0xdeadbeef;
11136 ovl_iocp = (void *)0xdeadbeef;
11137 SetLastError(0xdeadbeef);
11138 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11139 ok(!ret, "got %d\n", ret);
11140 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11141 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11142 ok(key == 0xdeadbeef, "got key %lu\n", key);
11143 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11145 CloseHandle(port);
11147 DestroyWindow(hwnd);
11150 struct wsa_async_select_info
11152 SOCKET sock;
11153 HWND hwnd;
11156 static DWORD WINAPI wsa_async_select_thread(void *param)
11158 struct wsa_async_select_info *info = param;
11159 int ret;
11161 ret = WSAAsyncSelect(info->sock, info->hwnd, WM_SOCKET, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
11162 ok(!ret, "got %d\n", ret);
11164 return 0;
11167 struct wsa_recv_info
11169 SOCKET sock;
11170 WSABUF wsa_buf;
11171 WSAOVERLAPPED ovl;
11174 static DWORD WINAPI wsa_recv_thread(void *param)
11176 struct wsa_recv_info *info = param;
11177 int ret;
11178 DWORD flags, bytes;
11180 bytes = 0xdeadbeef;
11181 flags = 0;
11182 SetLastError(0xdeadbeef);
11183 ret = WSARecv(info->sock, &info->wsa_buf, 1, &bytes, &flags, &info->ovl, NULL);
11184 ok(ret == SOCKET_ERROR, "got %d\n", ret);
11185 ok(GetLastError() == ERROR_IO_PENDING, "got %u\n", GetLastError());
11186 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11188 return 0;
11191 static void iocp_async_read_thread_closesocket(SOCKET src)
11193 struct wsa_async_select_info select_info;
11194 struct wsa_recv_info recv_info;
11195 HANDLE port, thread;
11196 WSAOVERLAPPED *ovl_iocp;
11197 int ret;
11198 char data[512];
11199 DWORD bytes, tid;
11200 ULONG_PTR key;
11201 HWND hwnd;
11202 MSG msg;
11204 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11205 0, 0, 0, 0, NULL, NULL, 0, NULL);
11206 ok(hwnd != 0, "CreateWindowEx failed\n");
11208 select_info.sock = src;
11209 select_info.hwnd = hwnd;
11210 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11211 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11212 ret = WaitForSingleObject(thread, 10000);
11213 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11215 Sleep(100);
11216 memset(&msg, 0, sizeof(msg));
11217 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11218 ok(ret, "got %d\n", ret);
11219 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11220 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11221 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11222 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11224 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11225 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11227 Sleep(100);
11228 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11229 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11231 memset(data, 0, sizeof(data));
11232 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11233 recv_info.sock = src;
11234 recv_info.wsa_buf.len = sizeof(data);
11235 recv_info.wsa_buf.buf = data;
11236 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11237 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11238 ret = WaitForSingleObject(thread, 10000);
11239 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11241 Sleep(100);
11242 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11243 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11245 bytes = 0xdeadbeef;
11246 key = 0xdeadbeef;
11247 ovl_iocp = (void *)0xdeadbeef;
11248 SetLastError(0xdeadbeef);
11249 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11250 ok(!ret, "got %d\n", ret);
11251 ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */,
11252 "got %u\n", GetLastError());
11253 if (GetLastError() == WAIT_TIMEOUT)
11255 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11256 ok(key == 0xdeadbeef, "got key %lx\n", key);
11257 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11259 else /* document XP behaviour */
11261 ok(!bytes, "got bytes %u\n", bytes);
11262 ok(key == 0x12345678, "got key %#lx\n", key);
11263 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11264 if (ovl_iocp)
11266 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11267 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11270 closesocket(src);
11271 goto xp_is_broken;
11274 Sleep(100);
11275 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11276 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11278 closesocket(src);
11280 Sleep(100);
11281 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11282 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11284 bytes = 0xdeadbeef;
11285 key = 0xdeadbeef;
11286 ovl_iocp = NULL;
11287 SetLastError(0xdeadbeef);
11288 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11289 ok(!ret, "got %d\n", ret);
11290 todo_wine
11291 ok(GetLastError() == ERROR_CONNECTION_ABORTED || GetLastError() == ERROR_NETNAME_DELETED /* XP */, "got %u\n", GetLastError());
11292 todo_wine
11293 ok(!bytes, "got bytes %u\n", bytes);
11294 todo_wine
11295 ok(key == 0x12345678, "got key %#lx\n", key);
11296 todo_wine
11297 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11298 if (ovl_iocp)
11300 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11301 ok(ovl_iocp->Internal == (ULONG)STATUS_CONNECTION_ABORTED || ovl_iocp->Internal == (ULONG)STATUS_LOCAL_DISCONNECT /* XP */, "got %#lx\n", ovl_iocp->Internal);
11304 xp_is_broken:
11305 bytes = 0xdeadbeef;
11306 key = 0xdeadbeef;
11307 ovl_iocp = (void *)0xdeadbeef;
11308 SetLastError(0xdeadbeef);
11309 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11310 ok(!ret, "got %d\n", ret);
11311 ok(GetLastError() == WAIT_TIMEOUT, "got %u\n", GetLastError());
11312 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11313 ok(key == 0xdeadbeef, "got key %lu\n", key);
11314 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11316 CloseHandle(port);
11318 DestroyWindow(hwnd);
11321 static void iocp_async_read_thread(SOCKET src, SOCKET dst)
11323 struct wsa_async_select_info select_info;
11324 struct wsa_recv_info recv_info;
11325 HANDLE port, thread;
11326 WSAOVERLAPPED *ovl_iocp;
11327 int ret;
11328 char data[512];
11329 DWORD bytes, tid;
11330 ULONG_PTR key;
11331 HWND hwnd;
11332 MSG msg;
11334 hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
11335 0, 0, 0, 0, NULL, NULL, 0, NULL);
11336 ok(hwnd != 0, "CreateWindowEx failed\n");
11338 select_info.sock = src;
11339 select_info.hwnd = hwnd;
11340 thread = CreateThread(NULL, 0, wsa_async_select_thread, &select_info, 0, &tid);
11341 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11342 ret = WaitForSingleObject(thread, 10000);
11343 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11345 Sleep(100);
11346 memset(&msg, 0, sizeof(msg));
11347 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11348 ok(ret, "got %d\n", ret);
11349 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11350 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11351 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11352 ok(msg.lParam == 2, "got %08lx\n", msg.lParam);
11354 port = CreateIoCompletionPort((HANDLE)src, 0, 0x12345678, 0);
11355 ok(port != 0, "CreateIoCompletionPort error %u\n", GetLastError());
11357 Sleep(100);
11358 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11359 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11361 memset(data, 0, sizeof(data));
11362 memset(&recv_info.ovl, 0, sizeof(recv_info.ovl));
11363 recv_info.sock = src;
11364 recv_info.wsa_buf.len = sizeof(data);
11365 recv_info.wsa_buf.buf = data;
11366 thread = CreateThread(NULL, 0, wsa_recv_thread, &recv_info, 0, &tid);
11367 ok(thread != 0, "CreateThread error %u\n", GetLastError());
11368 ret = WaitForSingleObject(thread, 10000);
11369 ok(ret == WAIT_OBJECT_0, "thread failed to terminate\n");
11371 Sleep(100);
11372 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11373 ok(!ret, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11375 bytes = 0xdeadbeef;
11376 key = 0xdeadbeef;
11377 ovl_iocp = (void *)0xdeadbeef;
11378 SetLastError(0xdeadbeef);
11379 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11380 ok(!ret, "got %d\n", ret);
11381 ok(GetLastError() == WAIT_TIMEOUT || broken(GetLastError() == ERROR_OPERATION_ABORTED) /* XP */, "got %u\n", GetLastError());
11382 if (GetLastError() == WAIT_TIMEOUT)
11384 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11385 ok(key == 0xdeadbeef, "got key %lu\n", key);
11386 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11388 else /* document XP behaviour */
11390 ok(bytes == 0, "got bytes %u\n", bytes);
11391 ok(key == 0x12345678, "got key %#lx\n", key);
11392 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11393 if (ovl_iocp)
11395 ok(!ovl_iocp->InternalHigh, "got %#lx\n", ovl_iocp->InternalHigh);
11396 ok(ovl_iocp->Internal == STATUS_CANCELLED, "got %#lx\n", ovl_iocp->Internal);
11400 Sleep(100);
11401 memset(&msg, 0, sizeof(msg));
11402 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11403 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11404 if (ret) /* document XP behaviour */
11406 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11407 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11408 ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11411 ret = send(dst, "Hello World!", 12, 0);
11412 ok(ret == 12, "send returned %d\n", ret);
11414 Sleep(100);
11415 memset(&msg, 0, sizeof(msg));
11416 ret = PeekMessageA(&msg, hwnd, WM_SOCKET, WM_SOCKET, PM_REMOVE);
11417 todo_wine
11418 ok(!ret || broken(msg.hwnd == hwnd) /* XP */, "got %04x,%08lx,%08lx\n", msg.message, msg.wParam, msg.lParam);
11419 if (ret) /* document XP behaviour */
11421 ok(msg.hwnd == hwnd, "got %p\n", msg.hwnd);
11422 ok(msg.message == WM_SOCKET, "got %04x\n", msg.message);
11423 ok(msg.wParam == src, "got %08lx\n", msg.wParam);
11424 ok(msg.lParam == 1, "got %08lx\n", msg.lParam);
11427 bytes = 0xdeadbeef;
11428 key = 0xdeadbeef;
11429 ovl_iocp = (void *)0xdeadbeef;
11430 SetLastError(0xdeadbeef);
11431 ret = GetQueuedCompletionStatus(port, &bytes, &key, &ovl_iocp, 100);
11432 todo_wine
11433 ok(ret || broken(GetLastError() == WAIT_TIMEOUT) /* XP */, "got %u\n", GetLastError());
11434 if (ret)
11436 ok(bytes == 12, "got bytes %u\n", bytes);
11437 ok(key == 0x12345678, "got key %#lx\n", key);
11438 ok(ovl_iocp == &recv_info.ovl, "got ovl %p\n", ovl_iocp);
11439 if (ovl_iocp)
11441 ok(ovl_iocp->InternalHigh == 12, "got %#lx\n", ovl_iocp->InternalHigh);
11442 ok(!ovl_iocp->Internal , "got %#lx\n", ovl_iocp->Internal);
11443 ok(!memcmp(data, "Hello World!", 12), "got %u bytes (%*s)\n", bytes, bytes, data);
11446 else /* document XP behaviour */
11448 ok(bytes == 0xdeadbeef, "got bytes %u\n", bytes);
11449 ok(key == 0xdeadbeef, "got key %lu\n", key);
11450 ok(!ovl_iocp, "got ovl %p\n", ovl_iocp);
11453 CloseHandle(port);
11455 DestroyWindow(hwnd);
11458 static void test_iocp(void)
11460 SOCKET src, dst;
11461 int i, ret;
11463 ret = tcp_socketpair_ovl(&src, &dst);
11464 ok(!ret, "creating socket pair failed\n");
11465 sync_read(src, dst);
11466 iocp_async_read(src, dst);
11467 closesocket(src);
11468 closesocket(dst);
11470 ret = tcp_socketpair_ovl(&src, &dst);
11471 ok(!ret, "creating socket pair failed\n");
11472 iocp_async_read_thread(src, dst);
11473 closesocket(src);
11474 closesocket(dst);
11476 for (i = 0; i <= 2; i++)
11478 ret = tcp_socketpair_ovl(&src, &dst);
11479 ok(!ret, "creating socket pair failed\n");
11480 iocp_async_read_closesocket(src, i);
11481 closesocket(dst);
11484 ret = tcp_socketpair_ovl(&src, &dst);
11485 ok(!ret, "creating socket pair failed\n");
11486 iocp_async_closesocket(src);
11487 closesocket(dst);
11489 ret = tcp_socketpair_ovl(&src, &dst);
11490 ok(!ret, "creating socket pair failed\n");
11491 iocp_async_read_thread_closesocket(src);
11492 closesocket(dst);
11495 START_TEST( sock )
11497 int i;
11499 /* Leave these tests at the beginning. They depend on WSAStartup not having been
11500 * called, which is done by Init() below. */
11501 test_WithoutWSAStartup();
11502 test_WithWSAStartup();
11504 Init();
11506 test_inet_ntoa();
11507 test_inet_pton();
11508 test_set_getsockopt();
11509 test_so_reuseaddr();
11510 test_ip_pktinfo();
11511 test_extendedSocketOptions();
11513 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
11515 trace ( " **** STARTING TEST %d ****\n", i );
11516 do_test ( &tests[i] );
11517 trace ( " **** TEST %d COMPLETE ****\n", i );
11520 test_UDP();
11522 test_getservbyname();
11523 test_WSASocket();
11524 test_WSADuplicateSocket();
11525 test_WSAEnumNetworkEvents();
11527 test_WSAAddressToStringA();
11528 test_WSAAddressToStringW();
11530 test_WSAStringToAddressA();
11531 test_WSAStringToAddressW();
11533 test_errors();
11534 test_listen();
11535 test_select();
11536 test_accept();
11537 test_getpeername();
11538 test_getsockname();
11539 test_inet_addr();
11540 test_addr_to_print();
11541 test_ioctlsocket();
11542 test_dns();
11543 test_gethostbyname();
11544 test_gethostbyname_hack();
11545 test_gethostname();
11547 test_WSASendMsg();
11548 test_WSASendTo();
11549 test_WSARecv();
11550 test_WSAPoll();
11551 test_write_watch();
11552 test_iocp();
11554 test_events(0);
11555 test_events(1);
11557 test_ipv6only();
11558 test_TransmitFile();
11559 test_GetAddrInfoW();
11560 test_GetAddrInfoExW();
11561 test_getaddrinfo();
11562 test_AcceptEx();
11563 test_ConnectEx();
11564 test_DisconnectEx();
11566 test_sioRoutingInterfaceQuery();
11567 test_sioAddressListChange();
11569 test_WSALookupService();
11570 test_WSAEnumNameSpaceProvidersA();
11571 test_WSAEnumNameSpaceProvidersW();
11573 test_WSAAsyncGetServByPort();
11574 test_WSAAsyncGetServByName();
11576 test_completion_port();
11577 test_address_list_query();
11579 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
11580 test_send();
11581 test_synchronous_WSAIoctl();
11583 Exit();