2 * Unit test suite for winsock functions
4 * Copyright 2002 Martin Wilck
5 * Copyright 2005 Thomas Kho
6 * Copyright 2008 Jeff Zaroyko
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #define WIN32_NO_STATUS
35 #include "wine/test.h"
37 #define MAX_CLIENTS 4 /* Max number of clients */
38 #define FIRST_CHAR 'A' /* First character in transferred pattern */
39 #define BIND_SLEEP 10 /* seconds to wait between attempts to bind() */
40 #define BIND_TRIES 6 /* Number of bind() attempts */
41 #define TEST_TIMEOUT 30 /* seconds to wait before killing child threads
42 after server initialization, if something hangs */
44 #define NUM_UDP_PEERS 3 /* Number of UDP sockets to create and test > 1 */
46 #define NUM_THREADS 3 /* Number of threads to run getservbyname */
47 #define NUM_QUERIES 250 /* Number of getservbyname queries per thread */
49 #define SERVERIP "127.0.0.1" /* IP to bind to */
50 #define SERVERPORT 9374 /* Port number to bind to */
52 #define wsa_ok(op, cond, msg) \
56 if ( !(cond tmp) ) err = WSAGetLastError(); \
57 ok ( cond tmp, msg, GetCurrentThreadId(), err); \
60 #define make_keepalive(k, enable, time, interval) \
62 k.keepalivetime = time; \
63 k.keepaliveinterval = interval;
65 /* Function pointers */
66 static void (WINAPI
*pfreeaddrinfo
)(struct addrinfo
*);
67 static int (WINAPI
*pgetaddrinfo
)(LPCSTR
,LPCSTR
,const struct addrinfo
*,struct addrinfo
**);
68 static void (WINAPI
*pFreeAddrInfoW
)(PADDRINFOW
);
69 static int (WINAPI
*pGetAddrInfoW
)(LPCWSTR
,LPCWSTR
,const ADDRINFOW
*,PADDRINFOW
*);
70 static PCSTR (WINAPI
*pInetNtop
)(INT
,LPVOID
,LPSTR
,ULONG
);
71 static int (WINAPI
*pInetPtonA
)(INT
,LPCSTR
,LPVOID
);
72 static int (WINAPI
*pInetPtonW
)(INT
,LPWSTR
,LPVOID
);
73 static int (WINAPI
*pWSALookupServiceBeginW
)(LPWSAQUERYSETW
,DWORD
,LPHANDLE
);
74 static int (WINAPI
*pWSALookupServiceEnd
)(HANDLE
);
75 static int (WINAPI
*pWSALookupServiceNextW
)(HANDLE
,DWORD
,LPDWORD
,LPWSAQUERYSETW
);
76 static int (WINAPI
*pWSAEnumNameSpaceProvidersA
)(LPDWORD
,LPWSANAMESPACE_INFOA
);
77 static int (WINAPI
*pWSAEnumNameSpaceProvidersW
)(LPDWORD
,LPWSANAMESPACE_INFOW
);
78 static int (WINAPI
*pWSAPoll
)(WSAPOLLFD
*,ULONG
,INT
);
80 /* Function pointers from iphlpapi */
81 static DWORD (WINAPI
*pGetAdaptersInfo
)(PIP_ADAPTER_INFO
,PULONG
);
82 static DWORD (WINAPI
*pGetIpForwardTable
)(PMIB_IPFORWARDTABLE
,PULONG
,BOOL
);
84 /**************** Structs and typedefs ***************/
86 typedef struct thread_info
92 /* Information in the server about open client connections */
93 typedef struct sock_info
96 struct sockaddr_in addr
;
97 struct sockaddr_in peer
;
103 /* Test parameters for both server & client */
104 typedef struct test_params
108 const char *inet_addr
;
115 /* server-specific test parameters */
116 typedef struct server_params
118 test_params
*general
;
123 /* client-specific test parameters */
124 typedef struct client_params
126 test_params
*general
;
131 /* This type combines all information for setting up a test scenario */
132 typedef struct test_setup
136 server_params srv_params
;
138 client_params clt_params
;
141 /* Thread local storage for server */
142 typedef struct server_memory
145 struct sockaddr_in addr
;
146 sock_info sock
[MAX_CLIENTS
];
149 /* Thread local storage for client */
150 typedef struct client_memory
153 struct sockaddr_in addr
;
158 /* SelectReadThread thread parameters */
159 typedef struct select_thread_params
163 } select_thread_params
;
165 /* Tests used in both getaddrinfo and GetAddrInfoW */
166 static const struct addr_hint_tests
168 int family
, socktype
, protocol
;
171 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_TCP
, 0 },
172 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_UDP
, 0 },
173 {AF_UNSPEC
, SOCK_DGRAM
, IPPROTO_TCP
, 0 },
174 {AF_UNSPEC
, SOCK_DGRAM
, IPPROTO_UDP
, 0 },
175 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, 0 },
176 {AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, 0 },
177 {AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, 0 },
178 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, 0 },
179 {AF_UNSPEC
, 0, IPPROTO_TCP
, 0 },
180 {AF_UNSPEC
, 0, IPPROTO_UDP
, 0 },
181 {AF_UNSPEC
, SOCK_STREAM
, 0, 0 },
182 {AF_UNSPEC
, SOCK_DGRAM
, 0, 0 },
183 {AF_INET
, 0, IPPROTO_TCP
, 0 },
184 {AF_INET
, 0, IPPROTO_UDP
, 0 },
185 {AF_INET
, SOCK_STREAM
, 0, 0 },
186 {AF_INET
, SOCK_DGRAM
, 0, 0 },
187 {AF_UNSPEC
, 999, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
188 {AF_UNSPEC
, 999, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
189 {AF_INET
, 999, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
190 {AF_INET
, 999, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
191 {AF_UNSPEC
, SOCK_STREAM
, 999, 0 },
192 {AF_UNSPEC
, SOCK_STREAM
, 999, 0 },
193 {AF_INET
, SOCK_DGRAM
, 999, 0 },
194 {AF_INET
, SOCK_DGRAM
, 999, 0 },
197 /**************** Static variables ***************/
199 static DWORD tls
; /* Thread local storage index */
200 static HANDLE thread
[1+MAX_CLIENTS
];
201 static DWORD thread_id
[1+MAX_CLIENTS
];
202 static HANDLE server_ready
;
203 static HANDLE client_ready
[MAX_CLIENTS
];
204 static int client_id
;
206 /**************** General utility functions ***************/
208 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
);
209 static SOCKET
setup_connector_socket(struct sockaddr_in
*addr
, int len
, BOOL nonblock
);
211 static int tcp_socketpair(SOCKET
*src
, SOCKET
*dst
)
213 SOCKET server
= INVALID_SOCKET
;
214 struct sockaddr_in addr
;
218 *src
= INVALID_SOCKET
;
219 *dst
= INVALID_SOCKET
;
221 *src
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
222 if (*src
== INVALID_SOCKET
)
225 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
226 if (server
== INVALID_SOCKET
)
229 memset(&addr
, 0, sizeof(addr
));
230 addr
.sin_family
= AF_INET
;
231 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
232 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
237 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
241 ret
= listen(server
, 1);
245 ret
= connect(*src
, (struct sockaddr
*)&addr
, sizeof(addr
));
250 *dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
253 if (server
!= INVALID_SOCKET
)
255 if (*src
!= INVALID_SOCKET
&& *dst
!= INVALID_SOCKET
)
262 static void set_so_opentype ( BOOL overlapped
)
264 int optval
= !overlapped
, newval
, len
= sizeof (int);
266 ok ( setsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
267 (LPVOID
) &optval
, sizeof (optval
) ) == 0,
268 "setting SO_OPENTYPE failed\n" );
269 ok ( getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
270 (LPVOID
) &newval
, &len
) == 0,
271 "getting SO_OPENTYPE failed\n" );
272 ok ( optval
== newval
, "failed to set SO_OPENTYPE\n" );
275 static int set_blocking ( SOCKET s
, BOOL blocking
)
277 u_long val
= !blocking
;
278 return ioctlsocket ( s
, FIONBIO
, &val
);
281 static void fill_buffer ( char *buf
, int chunk_size
, int n_chunks
)
284 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
285 memset ( p
, c
, chunk_size
);
288 static int test_buffer ( char *buf
, int chunk_size
, int n_chunks
)
292 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
294 for ( i
= 0; i
< chunk_size
; i
++ )
295 if ( p
[i
] != c
) return i
;
301 * This routine is called when a client / server does not expect any more data,
302 * but needs to acknowledge the closing of the connection (by reading 0 bytes).
304 static void read_zero_bytes ( SOCKET s
)
308 while ( ( tmp
= recv ( s
, buf
, 256, 0 ) ) > 0 )
310 ok ( n
<= 0, "garbage data received: %d bytes\n", n
);
313 static int do_synchronous_send ( SOCKET s
, char *buf
, int buflen
, int flags
, int sendlen
)
315 char* last
= buf
+ buflen
, *p
;
317 for ( p
= buf
; n
> 0 && p
< last
; )
319 n
= send ( s
, p
, min ( sendlen
, last
- p
), flags
);
322 wsa_ok ( n
, 0 <=, "do_synchronous_send (%x): error %d\n" );
326 static int do_synchronous_recv ( SOCKET s
, char *buf
, int buflen
, int flags
, int recvlen
)
328 char* last
= buf
+ buflen
, *p
;
330 for ( p
= buf
; n
> 0 && p
< last
; )
332 n
= recv ( s
, p
, min ( recvlen
, last
- p
), flags
);
335 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
339 static int do_synchronous_recvfrom ( SOCKET s
, char *buf
, int buflen
, int flags
, struct sockaddr
*from
, int *fromlen
, int recvlen
)
341 char* last
= buf
+ buflen
, *p
;
343 for ( p
= buf
; n
> 0 && p
< last
; )
345 n
= recvfrom ( s
, p
, min ( recvlen
, last
- p
), flags
, from
, fromlen
);
348 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
353 * Call this routine right after thread startup.
354 * SO_OPENTYPE must by 0, regardless what the server did.
356 static void check_so_opentype (void)
360 getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
, (LPVOID
) &tmp
, &len
);
361 ok ( tmp
== 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp
);
364 static void compare_addrinfo (ADDRINFO
*a
, ADDRINFO
*b
)
366 for (; a
&& b
; a
= a
->ai_next
, b
= b
->ai_next
)
368 ok(a
->ai_flags
== b
->ai_flags
,
369 "Wrong flags %d != %d\n", a
->ai_flags
, b
->ai_flags
);
370 ok(a
->ai_family
== b
->ai_family
,
371 "Wrong family %d != %d\n", a
->ai_family
, b
->ai_family
);
372 ok(a
->ai_socktype
== b
->ai_socktype
,
373 "Wrong socktype %d != %d\n", a
->ai_socktype
, b
->ai_socktype
);
374 ok(a
->ai_protocol
== b
->ai_protocol
,
375 "Wrong protocol %d != %d\n", a
->ai_protocol
, b
->ai_protocol
);
376 ok(a
->ai_addrlen
== b
->ai_addrlen
,
377 "Wrong addrlen %lu != %lu\n", a
->ai_addrlen
, b
->ai_addrlen
);
378 ok(!memcmp(a
->ai_addr
, b
->ai_addr
, min(a
->ai_addrlen
, b
->ai_addrlen
)),
379 "Wrong address data\n");
380 if (a
->ai_canonname
&& b
->ai_canonname
)
382 ok(!strcmp(a
->ai_canonname
, b
->ai_canonname
), "Wrong canonical name '%s' != '%s'\n",
383 a
->ai_canonname
, b
->ai_canonname
);
386 ok(!a
->ai_canonname
&& !b
->ai_canonname
, "Expected both names absent (%p != %p)\n",
387 a
->ai_canonname
, b
->ai_canonname
);
389 ok(!a
&& !b
, "Expected both addresses null (%p != %p)\n", a
, b
);
392 static void compare_addrinfow (ADDRINFOW
*a
, ADDRINFOW
*b
)
394 for (; a
&& b
; a
= a
->ai_next
, b
= b
->ai_next
)
396 ok(a
->ai_flags
== b
->ai_flags
,
397 "Wrong flags %d != %d\n", a
->ai_flags
, b
->ai_flags
);
398 ok(a
->ai_family
== b
->ai_family
,
399 "Wrong family %d != %d\n", a
->ai_family
, b
->ai_family
);
400 ok(a
->ai_socktype
== b
->ai_socktype
,
401 "Wrong socktype %d != %d\n", a
->ai_socktype
, b
->ai_socktype
);
402 ok(a
->ai_protocol
== b
->ai_protocol
,
403 "Wrong protocol %d != %d\n", a
->ai_protocol
, b
->ai_protocol
);
404 ok(a
->ai_addrlen
== b
->ai_addrlen
,
405 "Wrong addrlen %lu != %lu\n", a
->ai_addrlen
, b
->ai_addrlen
);
406 ok(!memcmp(a
->ai_addr
, b
->ai_addr
, min(a
->ai_addrlen
, b
->ai_addrlen
)),
407 "Wrong address data\n");
408 if (a
->ai_canonname
&& b
->ai_canonname
)
410 ok(!lstrcmpW(a
->ai_canonname
, b
->ai_canonname
), "Wrong canonical name '%s' != '%s'\n",
411 wine_dbgstr_w(a
->ai_canonname
), wine_dbgstr_w(b
->ai_canonname
));
414 ok(!a
->ai_canonname
&& !b
->ai_canonname
, "Expected both names absent (%p != %p)\n",
415 a
->ai_canonname
, b
->ai_canonname
);
417 ok(!a
&& !b
, "Expected both addresses null (%p != %p)\n", a
, b
);
420 /**************** Server utility functions ***************/
423 * Even if we have closed our server socket cleanly,
424 * the OS may mark the address "in use" for some time -
425 * this happens with native Linux apps, too.
427 static void do_bind ( SOCKET s
, struct sockaddr
* addr
, int addrlen
)
429 int err
, wsaerr
= 0, n_try
= BIND_TRIES
;
431 while ( ( err
= bind ( s
, addr
, addrlen
) ) != 0 &&
432 ( wsaerr
= WSAGetLastError () ) == WSAEADDRINUSE
&&
435 trace ( "address in use, waiting ...\n" );
436 Sleep ( 1000 * BIND_SLEEP
);
438 ok ( err
== 0, "failed to bind: %d\n", wsaerr
);
441 static void server_start ( server_params
*par
)
444 test_params
*gen
= par
->general
;
445 server_memory
*mem
= LocalAlloc ( LPTR
, sizeof ( server_memory
) );
447 TlsSetValue ( tls
, mem
);
448 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
449 NULL
, 0, par
->sock_flags
);
450 ok ( mem
->s
!= INVALID_SOCKET
, "Server: WSASocket failed\n" );
452 mem
->addr
.sin_family
= AF_INET
;
453 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
454 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
456 for (i
= 0; i
< MAX_CLIENTS
; i
++)
458 mem
->sock
[i
].s
= INVALID_SOCKET
;
459 mem
->sock
[i
].buf
= LocalAlloc ( LPTR
, gen
->n_chunks
* gen
->chunk_size
);
460 mem
->sock
[i
].n_recvd
= 0;
461 mem
->sock
[i
].n_sent
= 0;
464 if ( gen
->sock_type
== SOCK_STREAM
)
465 do_bind ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof (mem
->addr
) );
468 static void server_stop (void)
471 server_memory
*mem
= TlsGetValue ( tls
);
473 for (i
= 0; i
< MAX_CLIENTS
; i
++ )
475 LocalFree ( mem
->sock
[i
].buf
);
476 if ( mem
->sock
[i
].s
!= INVALID_SOCKET
)
477 closesocket ( mem
->sock
[i
].s
);
479 ok ( closesocket ( mem
->s
) == 0, "closesocket failed\n" );
481 ExitThread ( GetCurrentThreadId () );
484 /**************** Client utilitiy functions ***************/
486 static void client_start ( client_params
*par
)
488 test_params
*gen
= par
->general
;
489 client_memory
*mem
= LocalAlloc (LPTR
, sizeof (client_memory
));
491 TlsSetValue ( tls
, mem
);
493 WaitForSingleObject ( server_ready
, INFINITE
);
495 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
496 NULL
, 0, par
->sock_flags
);
498 mem
->addr
.sin_family
= AF_INET
;
499 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
500 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
502 ok ( mem
->s
!= INVALID_SOCKET
, "Client: WSASocket failed\n" );
504 mem
->send_buf
= LocalAlloc ( LPTR
, 2 * gen
->n_chunks
* gen
->chunk_size
);
505 mem
->recv_buf
= mem
->send_buf
+ gen
->n_chunks
* gen
->chunk_size
;
506 fill_buffer ( mem
->send_buf
, gen
->chunk_size
, gen
->n_chunks
);
508 SetEvent ( client_ready
[client_id
] );
509 /* Wait for the other clients to come up */
510 WaitForMultipleObjects ( min ( gen
->n_clients
, MAX_CLIENTS
), client_ready
, TRUE
, INFINITE
);
513 static void client_stop (void)
515 client_memory
*mem
= TlsGetValue ( tls
);
516 wsa_ok ( closesocket ( mem
->s
), 0 ==, "closesocket error (%x): %d\n" );
517 LocalFree ( mem
->send_buf
);
522 /**************** Servers ***************/
525 * simple_server: A very basic server doing synchronous IO.
527 static VOID WINAPI
simple_server ( server_params
*par
)
529 test_params
*gen
= par
->general
;
531 int pos
, n_recvd
, n_sent
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
532 id
= GetCurrentThreadId();
534 trace ( "simple_server (%x) starting\n", id
);
536 set_so_opentype ( FALSE
); /* non-overlapped */
537 server_start ( par
);
538 mem
= TlsGetValue ( tls
);
540 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
541 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "simple_server (%x): listen failed: %d\n");
543 trace ( "simple_server (%x) ready\n", id
);
544 SetEvent ( server_ready
); /* notify clients */
546 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
548 trace ( "simple_server (%x): waiting for client\n", id
);
550 /* accept a single connection */
551 tmp
= sizeof ( mem
->sock
[0].peer
);
552 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
553 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "simple_server (%x): accept failed: %d\n" );
555 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
556 "simple_server (%x): strange peer address\n", id
);
558 /* Receive data & check it */
559 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
560 ok ( n_recvd
== n_expected
,
561 "simple_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
562 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
563 ok ( pos
== -1, "simple_server (%x): test pattern error: %d\n", id
, pos
);
566 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
567 ok ( n_sent
== n_expected
,
568 "simple_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
571 read_zero_bytes ( mem
->sock
[0].s
);
572 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "simple_server (%x): closesocket error: %d\n" );
573 mem
->sock
[0].s
= INVALID_SOCKET
;
576 trace ( "simple_server (%x) exiting\n", id
);
581 * oob_server: A very basic server receiving out-of-band data.
583 static VOID WINAPI
oob_server ( server_params
*par
)
585 test_params
*gen
= par
->general
;
588 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
,
589 id
= GetCurrentThreadId();
591 trace ( "oob_server (%x) starting\n", id
);
593 set_so_opentype ( FALSE
); /* non-overlapped */
594 server_start ( par
);
595 mem
= TlsGetValue ( tls
);
597 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n");
598 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "oob_server (%x): listen failed: %d\n");
600 trace ( "oob_server (%x) ready\n", id
);
601 SetEvent ( server_ready
); /* notify clients */
603 trace ( "oob_server (%x): waiting for client\n", id
);
605 /* accept a single connection */
606 tmp
= sizeof ( mem
->sock
[0].peer
);
607 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
608 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "oob_server (%x): accept failed: %d\n" );
610 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
611 "oob_server (%x): strange peer address\n", id
);
613 /* check initial atmark state */
614 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
615 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
617 /* Receive normal data */
618 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
619 ok ( n_recvd
== n_expected
,
620 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
621 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
622 ok ( pos
== -1, "oob_server (%x): test pattern error: %d\n", id
, pos
);
624 /* check atmark state */
625 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
626 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
629 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
630 ok ( n_sent
== n_expected
,
631 "oob_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
633 /* Receive a part of the out-of-band data and check atmark state */
634 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, 8, 0, par
->buflen
);
636 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, 8 );
639 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
640 todo_wine
ok ( atmark
== 0, "oob_server (%x): not at the OOB mark: %i\n", id
, atmark
);
642 /* Receive the rest of the out-of-band data and check atmark state */
643 do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
645 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
646 todo_wine
ok ( atmark
== 0, "oob_server (%x): not at the OOB mark: %i\n", id
, atmark
);
649 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "oob_server (%x): closesocket error: %d\n" );
650 mem
->sock
[0].s
= INVALID_SOCKET
;
652 trace ( "oob_server (%x) exiting\n", id
);
657 * select_server: A non-blocking server.
659 static VOID WINAPI
select_server ( server_params
*par
)
661 test_params
*gen
= par
->general
;
663 int n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
664 id
= GetCurrentThreadId(), n_connections
= 0, n_sent
, n_recvd
,
665 n_set
, delta
, n_ready
;
666 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
667 fd_set fds_recv
, fds_send
, fds_openrecv
, fds_opensend
;
669 trace ( "select_server (%x) starting\n", id
);
671 set_so_opentype ( FALSE
); /* non-overlapped */
672 server_start ( par
);
673 mem
= TlsGetValue ( tls
);
675 wsa_ok ( set_blocking ( mem
->s
, FALSE
), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
676 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "select_server (%x): listen failed: %d\n");
678 trace ( "select_server (%x) ready\n", id
);
679 SetEvent ( server_ready
); /* notify clients */
681 FD_ZERO ( &fds_openrecv
);
682 FD_ZERO ( &fds_recv
);
683 FD_ZERO ( &fds_send
);
684 FD_ZERO ( &fds_opensend
);
686 FD_SET ( mem
->s
, &fds_openrecv
);
690 fds_recv
= fds_openrecv
;
691 fds_send
= fds_opensend
;
695 wsa_ok ( ( n_ready
= select ( 0, &fds_recv
, &fds_send
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
696 "select_server (%x): select() failed: %d\n" );
698 /* check for incoming requests */
699 if ( FD_ISSET ( mem
->s
, &fds_recv
) ) {
702 trace ( "select_server (%x): accepting client connection\n", id
);
704 /* accept a single connection */
705 tmp
= sizeof ( mem
->sock
[n_connections
].peer
);
706 mem
->sock
[n_connections
].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[n_connections
].peer
, &tmp
);
707 wsa_ok ( mem
->sock
[n_connections
].s
, INVALID_SOCKET
!=, "select_server (%x): accept() failed: %d\n" );
709 ok ( mem
->sock
[n_connections
].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
710 "select_server (%x): strange peer address\n", id
);
712 /* add to list of open connections */
713 FD_SET ( mem
->sock
[n_connections
].s
, &fds_openrecv
);
714 FD_SET ( mem
->sock
[n_connections
].s
, &fds_opensend
);
719 /* handle open requests */
721 for ( i
= 0; i
< n_connections
; i
++ )
723 if ( FD_ISSET( mem
->sock
[i
].s
, &fds_recv
) ) {
726 if ( mem
->sock
[i
].n_recvd
< n_expected
) {
727 /* Receive data & check it */
728 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 );
729 ok ( n_recvd
!= SOCKET_ERROR
, "select_server (%x): error in recv(): %d\n", id
, WSAGetLastError() );
730 mem
->sock
[i
].n_recvd
+= n_recvd
;
732 if ( mem
->sock
[i
].n_recvd
== n_expected
) {
733 int pos
= test_buffer ( mem
->sock
[i
].buf
, gen
->chunk_size
, gen
->n_chunks
);
734 ok ( pos
== -1, "select_server (%x): test pattern error: %d\n", id
, pos
);
735 FD_CLR ( mem
->sock
[i
].s
, &fds_openrecv
);
738 ok ( mem
->sock
[i
].n_recvd
<= n_expected
, "select_server (%x): received too many bytes: %d\n", id
, mem
->sock
[i
].n_recvd
);
742 /* only echo back what we've received */
743 delta
= mem
->sock
[i
].n_recvd
- mem
->sock
[i
].n_sent
;
745 if ( FD_ISSET ( mem
->sock
[i
].s
, &fds_send
) ) {
748 if ( ( delta
> 0 ) && ( mem
->sock
[i
].n_sent
< n_expected
) ) {
750 n_sent
= send ( mem
->sock
[i
].s
, mem
->sock
[i
].buf
+ mem
->sock
[i
].n_sent
, min ( delta
, par
->buflen
), 0 );
751 ok ( n_sent
!= SOCKET_ERROR
, "select_server (%x): error in send(): %d\n", id
, WSAGetLastError() );
752 mem
->sock
[i
].n_sent
+= n_sent
;
754 if ( mem
->sock
[i
].n_sent
== n_expected
) {
755 FD_CLR ( mem
->sock
[i
].s
, &fds_opensend
);
758 ok ( mem
->sock
[i
].n_sent
<= n_expected
, "select_server (%x): sent too many bytes: %d\n", id
, mem
->sock
[i
].n_sent
);
763 /* check that select returned the correct number of ready sockets */
764 ok ( ( n_set
== n_ready
), "select_server (%x): select() returns wrong number of ready sockets\n", id
);
766 /* check if all clients are done */
767 if ( ( fds_opensend
.fd_count
== 0 )
768 && ( fds_openrecv
.fd_count
== 1 ) /* initial socket that accepts clients */
769 && ( n_connections
== min ( gen
->n_clients
, MAX_CLIENTS
) ) ) {
774 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
777 read_zero_bytes ( mem
->sock
[i
].s
);
778 wsa_ok ( closesocket ( mem
->sock
[i
].s
), 0 ==, "select_server (%x): closesocket error: %d\n" );
779 mem
->sock
[i
].s
= INVALID_SOCKET
;
782 trace ( "select_server (%x) exiting\n", id
);
786 /**************** Clients ***************/
789 * simple_client: A very basic client doing synchronous IO.
791 static VOID WINAPI
simple_client ( client_params
*par
)
793 test_params
*gen
= par
->general
;
795 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
797 id
= GetCurrentThreadId();
798 trace ( "simple_client (%x): starting\n", id
);
799 /* wait here because we want to call set_so_opentype before creating a socket */
800 WaitForSingleObject ( server_ready
, INFINITE
);
801 trace ( "simple_client (%x): server ready\n", id
);
803 check_so_opentype ();
804 set_so_opentype ( FALSE
); /* non-overlapped */
805 client_start ( par
);
806 mem
= TlsGetValue ( tls
);
809 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
810 0 ==, "simple_client (%x): connect error: %d\n" );
811 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
812 "simple_client (%x): failed to set blocking mode\n", id
);
813 trace ( "simple_client (%x) connected\n", id
);
815 /* send data to server */
816 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
817 ok ( n_sent
== n_expected
,
818 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
820 /* shutdown send direction */
821 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
823 /* Receive data echoed back & check it */
824 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
825 ok ( n_recvd
== n_expected
,
826 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
829 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
830 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
833 read_zero_bytes ( mem
->s
);
834 trace ( "simple_client (%x) exiting\n", id
);
839 * oob_client: A very basic client sending out-of-band data.
841 static VOID WINAPI
oob_client ( client_params
*par
)
843 test_params
*gen
= par
->general
;
845 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
847 id
= GetCurrentThreadId();
848 trace ( "oob_client (%x): starting\n", id
);
849 /* wait here because we want to call set_so_opentype before creating a socket */
850 WaitForSingleObject ( server_ready
, INFINITE
);
851 trace ( "oob_client (%x): server ready\n", id
);
853 check_so_opentype ();
854 set_so_opentype ( FALSE
); /* non-overlapped */
855 client_start ( par
);
856 mem
= TlsGetValue ( tls
);
859 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
860 0 ==, "oob_client (%x): connect error: %d\n" );
861 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
862 "oob_client (%x): failed to set blocking mode\n", id
);
863 trace ( "oob_client (%x) connected\n", id
);
865 /* send data to server */
866 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
867 ok ( n_sent
== n_expected
,
868 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
870 /* Receive data echoed back & check it */
871 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
872 ok ( n_recvd
== n_expected
,
873 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
874 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
875 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
877 /* send out-of-band data to server */
878 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, MSG_OOB
, par
->buflen
);
879 ok ( n_sent
== n_expected
,
880 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
882 /* shutdown send direction */
883 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
886 read_zero_bytes ( mem
->s
);
887 trace ( "oob_client (%x) exiting\n", id
);
892 * simple_mixed_client: mixing send and recvfrom
894 static VOID WINAPI
simple_mixed_client ( client_params
*par
)
896 test_params
*gen
= par
->general
;
898 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
899 int fromLen
= sizeof(mem
->addr
);
900 struct sockaddr test
;
902 id
= GetCurrentThreadId();
903 trace ( "simple_client (%x): starting\n", id
);
904 /* wait here because we want to call set_so_opentype before creating a socket */
905 WaitForSingleObject ( server_ready
, INFINITE
);
906 trace ( "simple_client (%x): server ready\n", id
);
908 check_so_opentype ();
909 set_so_opentype ( FALSE
); /* non-overlapped */
910 client_start ( par
);
911 mem
= TlsGetValue ( tls
);
914 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
915 0 ==, "simple_client (%x): connect error: %d\n" );
916 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
917 "simple_client (%x): failed to set blocking mode\n", id
);
918 trace ( "simple_client (%x) connected\n", id
);
920 /* send data to server */
921 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
922 ok ( n_sent
== n_expected
,
923 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
925 /* shutdown send direction */
926 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
928 /* this shouldn't change, since lpFrom, is not updated on
929 connection oriented sockets - exposed by bug 11640
931 ((struct sockaddr_in
*)&test
)->sin_addr
.s_addr
= inet_addr("0.0.0.0");
933 /* Receive data echoed back & check it */
934 n_recvd
= do_synchronous_recvfrom ( mem
->s
,
938 (struct sockaddr
*)&test
,
941 ok ( n_recvd
== n_expected
,
942 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
944 /* check that lpFrom was not updated */
947 inet_ntoa(((struct sockaddr_in
*)&test
)->sin_addr
),
948 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
951 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
952 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
955 read_zero_bytes ( mem
->s
);
956 trace ( "simple_client (%x) exiting\n", id
);
961 * event_client: An event-driven client
963 static void WINAPI
event_client ( client_params
*par
)
965 test_params
*gen
= par
->general
;
967 int id
= GetCurrentThreadId(), n_expected
= gen
->n_chunks
* gen
->chunk_size
,
970 WSANETWORKEVENTS wsa_events
;
971 char *send_last
, *recv_last
, *send_p
, *recv_p
;
972 LONG mask
= FD_READ
| FD_WRITE
| FD_CLOSE
;
974 trace ( "event_client (%x): starting\n", id
);
975 client_start ( par
);
976 trace ( "event_client (%x): server ready\n", id
);
978 mem
= TlsGetValue ( tls
);
980 /* Prepare event notification for connect, makes socket nonblocking */
981 event
= WSACreateEvent ();
982 WSAEventSelect ( mem
->s
, event
, FD_CONNECT
);
983 tmp
= connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) );
985 err
= WSAGetLastError ();
986 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): connect error: %d\n", id
, err
);
987 tmp
= WaitForSingleObject ( event
, INFINITE
);
988 ok ( tmp
== WAIT_OBJECT_0
, "event_client (%x): wait for connect event failed: %d\n", id
, tmp
);
989 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
990 ok ( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
991 err
= wsa_events
.iErrorCode
[ FD_CONNECT_BIT
];
992 ok ( err
== 0, "event_client (%x): connect error: %d\n", id
, err
);
996 trace ( "event_client (%x) connected\n", id
);
998 WSAEventSelect ( mem
->s
, event
, mask
);
1000 recv_p
= mem
->recv_buf
;
1001 recv_last
= mem
->recv_buf
+ n_expected
;
1002 send_p
= mem
->send_buf
;
1003 send_last
= mem
->send_buf
+ n_expected
;
1007 err
= WaitForSingleObject ( event
, INFINITE
);
1008 ok ( err
== WAIT_OBJECT_0
, "event_client (%x): wait failed\n", id
);
1010 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
1011 ok( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
1013 if ( wsa_events
.lNetworkEvents
& FD_WRITE
)
1015 err
= wsa_events
.iErrorCode
[ FD_WRITE_BIT
];
1016 ok ( err
== 0, "event_client (%x): FD_WRITE error code: %d\n", id
, err
);
1021 n
= send ( mem
->s
, send_p
, min ( send_last
- send_p
, par
->buflen
), 0 );
1024 err
= WSAGetLastError ();
1025 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): send error: %d\n", id
, err
);
1030 while ( n
>= 0 && send_p
< send_last
);
1032 if ( send_p
== send_last
)
1034 trace ( "event_client (%x): all data sent - shutdown\n", id
);
1035 shutdown ( mem
->s
, SD_SEND
);
1037 WSAEventSelect ( mem
->s
, event
, mask
);
1040 if ( wsa_events
.lNetworkEvents
& FD_READ
)
1042 err
= wsa_events
.iErrorCode
[ FD_READ_BIT
];
1043 ok ( err
== 0, "event_client (%x): FD_READ error code: %d\n", id
, err
);
1044 if ( err
!= 0 ) break;
1046 /* First read must succeed */
1047 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
1048 wsa_ok ( n
, 0 <=, "event_client (%x): recv error: %d\n" );
1052 if ( recv_p
== recv_last
)
1055 trace ( "event_client (%x): all data received\n", id
);
1056 WSAEventSelect ( mem
->s
, event
, mask
);
1059 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
1060 if ( n
< 0 && ( err
= WSAGetLastError()) != WSAEWOULDBLOCK
)
1061 ok ( 0, "event_client (%x): read error: %d\n", id
, err
);
1065 if ( wsa_events
.lNetworkEvents
& FD_CLOSE
)
1067 trace ( "event_client (%x): close event\n", id
);
1068 err
= wsa_events
.iErrorCode
[ FD_CLOSE_BIT
];
1069 ok ( err
== 0, "event_client (%x): FD_CLOSE error code: %d\n", id
, err
);
1074 n
= send_p
- mem
->send_buf
;
1075 ok ( send_p
== send_last
,
1076 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n
, n_expected
);
1077 n
= recv_p
- mem
->recv_buf
;
1078 ok ( recv_p
== recv_last
,
1079 "simple_client (%x): received less data than expected: %d of %d\n", id
, n
, n_expected
);
1080 n
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
1081 ok ( n
== -1, "event_client (%x): test pattern error: %d\n", id
, n
);
1084 WSACloseEvent ( event
);
1085 trace ( "event_client (%x) exiting\n", id
);
1089 /* Tests for WSAStartup */
1090 static void test_WithoutWSAStartup(void)
1094 WSASetLastError(0xdeadbeef);
1095 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
, "WSASocketA should have failed\n");
1096 err
= WSAGetLastError();
1097 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
1099 WSASetLastError(0xdeadbeef);
1100 ok(gethostbyname("localhost") == NULL
, "gethostbyname() succeeded unexpectedly\n");
1101 err
= WSAGetLastError();
1102 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
1105 static void test_WithWSAStartup(void)
1108 WORD version
= MAKEWORD( 2, 2 );
1109 INT res
, socks
, i
, j
;
1114 SOCKET src
, dst
, dup_src
, dup_dst
;
1118 res
= WSAStartup( version
, &data
);
1119 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1121 ptr
= gethostbyname("localhost");
1122 ok(ptr
!= NULL
, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
1124 /* Alloc some sockets to check if they are destroyed on WSACleanup */
1125 for (socks
= 0; socks
< sizeof(pairs
) / sizeof(pairs
[0]); socks
++)
1127 WSAPROTOCOL_INFOA info
;
1128 if (tcp_socketpair(&pairs
[socks
].src
, &pairs
[socks
].dst
)) break;
1130 memset(&info
, 0, sizeof(info
));
1131 ok(!WSADuplicateSocketA(pairs
[socks
].src
, GetCurrentProcessId(), &info
),
1132 "WSADuplicateSocketA should have worked\n");
1133 pairs
[socks
].dup_src
= WSASocketA(0, 0, 0, &info
, 0, 0);
1134 ok(pairs
[socks
].dup_src
!= SOCKET_ERROR
, "expected != -1\n");
1136 memset(&info
, 0, sizeof(info
));
1137 ok(!WSADuplicateSocketA(pairs
[socks
].dst
, GetCurrentProcessId(), &info
),
1138 "WSADuplicateSocketA should have worked\n");
1139 pairs
[socks
].dup_dst
= WSASocketA(0, 0, 0, &info
, 0, 0);
1140 ok(pairs
[socks
].dup_dst
!= SOCKET_ERROR
, "expected != -1\n");
1143 res
= send(pairs
[0].src
, "TEST", 4, 0);
1144 ok(res
== 4, "send failed with error %d\n", WSAGetLastError());
1148 res
= WSAStartup( version
, &data
);
1149 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1151 /* show that sockets are destroyed automatically after WSACleanup */
1153 SetLastError(0xdeadbeef);
1154 res
= send(pairs
[0].src
, "TEST", 4, 0);
1155 error
= WSAGetLastError();
1156 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1157 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1159 SetLastError(0xdeadbeef);
1160 res
= send(pairs
[0].dst
, "TEST", 4, 0);
1161 error
= WSAGetLastError();
1162 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1163 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1165 /* Check that all sockets were destroyed */
1166 for (i
= 0; i
< socks
; i
++)
1168 for (j
= 0; j
< 4; j
++)
1170 struct sockaddr_in saddr
;
1171 int size
= sizeof(saddr
);
1174 case 0: sock
= pairs
[i
].src
; break;
1175 case 1: sock
= pairs
[i
].dup_src
; break;
1176 case 2: sock
= pairs
[i
].dst
; break;
1177 case 3: sock
= pairs
[i
].dup_dst
; break;
1180 SetLastError(0xdeadbeef);
1181 res
= getsockname(sock
, (struct sockaddr
*)&saddr
, &size
);
1182 error
= WSAGetLastError();
1183 ok(res
== SOCKET_ERROR
, "Test[%d]: getsockname should have failed\n", i
);
1184 ok(error
== WSAENOTSOCK
, "Test[%d]: expected 10038, got %d\n", i
, error
);
1190 /* While wine is not fixed, close all sockets manually */
1191 for (i
= 0; i
< socks
; i
++)
1193 closesocket(pairs
[i
].src
);
1194 closesocket(pairs
[i
].dst
);
1195 closesocket(pairs
[i
].dup_src
);
1196 closesocket(pairs
[i
].dup_dst
);
1200 ok(res
== 0, "expected 0, got %d\n", res
);
1201 WSASetLastError(0xdeadbeef);
1203 error
= WSAGetLastError();
1204 ok ( (res
== SOCKET_ERROR
&& error
== WSANOTINITIALISED
) ||
1205 broken(res
== 0), /* WinME */
1206 "WSACleanup returned %d WSAGetLastError is %d\n", res
, error
);
1209 /**************** Main program utility functions ***************/
1211 static void Init (void)
1213 WORD ver
= MAKEWORD (2, 2);
1215 HMODULE hws2_32
= GetModuleHandleA("ws2_32.dll"), hiphlpapi
;
1217 pfreeaddrinfo
= (void *)GetProcAddress(hws2_32
, "freeaddrinfo");
1218 pgetaddrinfo
= (void *)GetProcAddress(hws2_32
, "getaddrinfo");
1219 pFreeAddrInfoW
= (void *)GetProcAddress(hws2_32
, "FreeAddrInfoW");
1220 pGetAddrInfoW
= (void *)GetProcAddress(hws2_32
, "GetAddrInfoW");
1221 pInetNtop
= (void *)GetProcAddress(hws2_32
, "inet_ntop");
1222 pInetPtonA
= (void *)GetProcAddress(hws2_32
, "inet_pton");
1223 pInetPtonW
= (void *)GetProcAddress(hws2_32
, "InetPtonW");
1224 pWSALookupServiceBeginW
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceBeginW");
1225 pWSALookupServiceEnd
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceEnd");
1226 pWSALookupServiceNextW
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceNextW");
1227 pWSAEnumNameSpaceProvidersA
= (void *)GetProcAddress(hws2_32
, "WSAEnumNameSpaceProvidersA");
1228 pWSAEnumNameSpaceProvidersW
= (void *)GetProcAddress(hws2_32
, "WSAEnumNameSpaceProvidersW");
1229 pWSAPoll
= (void *)GetProcAddress(hws2_32
, "WSAPoll");
1231 hiphlpapi
= LoadLibraryA("iphlpapi.dll");
1234 pGetIpForwardTable
= (void *)GetProcAddress(hiphlpapi
, "GetIpForwardTable");
1235 pGetAdaptersInfo
= (void *)GetProcAddress(hiphlpapi
, "GetAdaptersInfo");
1238 ok ( WSAStartup ( ver
, &data
) == 0, "WSAStartup failed\n" );
1242 static void Exit (void)
1247 err
= WSAGetLastError();
1248 ok ( ret
== 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret
, err
);
1251 static void StartServer (LPTHREAD_START_ROUTINE routine
,
1252 test_params
*general
, server_params
*par
)
1254 par
->general
= general
;
1255 thread
[0] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[0] );
1256 ok ( thread
[0] != NULL
, "Failed to create server thread\n" );
1259 static void StartClients (LPTHREAD_START_ROUTINE routine
,
1260 test_params
*general
, client_params
*par
)
1263 par
->general
= general
;
1264 for ( i
= 1; i
<= min ( general
->n_clients
, MAX_CLIENTS
); i
++ )
1267 thread
[i
] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[i
] );
1268 ok ( thread
[i
] != NULL
, "Failed to create client thread\n" );
1269 /* Make sure the client is up and running */
1270 WaitForSingleObject ( client_ready
[client_id
], INFINITE
);
1274 static void do_test( test_setup
*test
)
1276 DWORD i
, n
= min (test
->general
.n_clients
, MAX_CLIENTS
);
1279 server_ready
= CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1280 for (i
= 0; i
<= n
; i
++)
1281 client_ready
[i
] = CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1283 StartServer ( test
->srv
, &test
->general
, &test
->srv_params
);
1284 StartClients ( test
->clt
, &test
->general
, &test
->clt_params
);
1285 WaitForSingleObject ( server_ready
, INFINITE
);
1287 wait
= WaitForMultipleObjects ( 1 + n
, thread
, TRUE
, 1000 * TEST_TIMEOUT
);
1288 ok ( wait
<= WAIT_OBJECT_0
+ n
,
1289 "some threads have not completed: %x\n", wait
);
1291 if ( ! ( wait
<= WAIT_OBJECT_0
+ n
) )
1293 for (i
= 0; i
<= n
; i
++)
1295 if ( WaitForSingleObject ( thread
[i
], 0 ) != WAIT_OBJECT_0
)
1297 trace ("terminating thread %08x\n", thread_id
[i
]);
1298 TerminateThread ( thread
[i
], 0 );
1302 CloseHandle ( server_ready
);
1303 for (i
= 0; i
<= n
; i
++)
1304 CloseHandle ( client_ready
[i
] );
1307 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1308 /* optname = SO_LINGER */
1309 static const LINGER linger_testvals
[] = {
1316 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1317 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1318 bug in the linux kernel (fixed in 2.6.8) */
1319 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1321 static void test_set_getsockopt(void)
1324 int i
, err
, lasterr
;
1328 WSAPROTOCOL_INFOA infoA
;
1329 WSAPROTOCOL_INFOW infoW
;
1330 char providername
[WSAPROTOCOL_LEN
+ 1];
1333 int family
, type
, proto
;
1335 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
1336 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
1337 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
1338 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
}
1346 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1347 ok(s
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1348 if( s
== INVALID_SOCKET
) return;
1350 timeout
= SOCKTIMEOUT1
;
1351 size
= sizeof(timeout
);
1352 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1354 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1355 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1356 ok( timeout
== SOCKTIMEOUT1
, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1359 size
= sizeof(timeout
);
1360 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1362 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1363 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1364 ok( timeout
== 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1367 timeout
= SOCKTIMEOUT2
; /* 997 seconds. See remark above */
1368 size
= sizeof(timeout
);
1369 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, size
);
1371 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, &size
);
1372 ok( !err
, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1373 ok( timeout
== SOCKTIMEOUT2
, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout
);
1375 for( i
= 0; i
< sizeof(linger_testvals
)/sizeof(LINGER
);i
++) {
1376 size
= sizeof(lingval
);
1377 lingval
= linger_testvals
[i
];
1378 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *) &lingval
, size
);
1380 err
= getsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *) &lingval
, &size
);
1381 ok( !err
, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError());
1382 ok( !lingval
.l_onoff
== !linger_testvals
[i
].l_onoff
&&
1383 (lingval
.l_linger
== linger_testvals
[i
].l_linger
||
1384 (!lingval
.l_linger
&& !linger_testvals
[i
].l_onoff
))
1385 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i
,
1386 lingval
.l_onoff
, lingval
.l_linger
,
1387 linger_testvals
[i
].l_onoff
, linger_testvals
[i
].l_linger
);
1390 size
= sizeof(lingval
);
1391 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, size
);
1392 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1393 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1394 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, 0);
1395 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1396 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1398 size
= sizeof(BOOL
);
1399 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, size
);
1400 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1401 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1402 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, 0);
1403 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1404 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1406 /* Test for erroneously passing a value instead of a pointer as optval */
1407 size
= sizeof(char);
1408 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTROUTE
, (char *)1, size
);
1409 ok(err
== SOCKET_ERROR
, "setsockopt with optval being a value passed "
1410 "instead of failing.\n");
1411 lasterr
= WSAGetLastError();
1412 ok(lasterr
== WSAEFAULT
, "setsockopt with optval being a value "
1413 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1414 lasterr
, WSAEFAULT
);
1416 /* SO_RCVTIMEO with invalid values for level */
1417 size
= sizeof(timeout
);
1418 timeout
= SOCKTIMEOUT1
;
1419 SetLastError(0xdeadbeef);
1420 err
= setsockopt(s
, 0xffffffff, SO_RCVTIMEO
, (char *) &timeout
, size
);
1421 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1422 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1423 err
, WSAGetLastError());
1425 timeout
= SOCKTIMEOUT1
;
1426 SetLastError(0xdeadbeef);
1427 err
= setsockopt(s
, 0x00008000, SO_RCVTIMEO
, (char *) &timeout
, size
);
1428 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1429 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1430 err
, WSAGetLastError());
1432 /* Test SO_ERROR set/get */
1433 SetLastError(0xdeadbeef);
1435 err
= setsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, size
);
1437 ok( !err
&& !WSAGetLastError(),
1438 "got %d with %d (expected 0 with 0)\n",
1439 err
, WSAGetLastError());
1441 SetLastError(0xdeadbeef);
1443 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1445 ok( !err
&& !WSAGetLastError(),
1446 "got %d with %d (expected 0 with 0)\n",
1447 err
, WSAGetLastError());
1449 ok (i
== 1234, "got %d (expected 1234)\n", i
);
1451 /* Test invalid optlen */
1452 SetLastError(0xdeadbeef);
1454 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1456 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEFAULT
),
1457 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1458 err
, WSAGetLastError());
1461 /* Test with the closed socket */
1462 SetLastError(0xdeadbeef);
1465 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1467 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOTSOCK
),
1468 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1469 err
, WSAGetLastError());
1470 ok (i
== 1234, "expected 1234, got %d\n", i
);
1472 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1473 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
1474 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1477 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &i
, size
);
1480 for (i
= 0; i
< 4; i
++)
1483 const int tests
[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1484 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &tests
[i
], i
+ 1);
1485 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1486 err
= getsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &k
, &size
);
1487 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1488 j
= i
!= 3 ? tests
[i
] & ((1 << (i
+ 1) * 8) - 1) : tests
[i
];
1489 ok(k
== j
, "Test [%d] Expected 0x%x, got 0x%x\n", i
, j
, k
);
1493 win_skip("IP_MULTICAST_TTL is unsupported\n");
1496 /* test SO_PROTOCOL_INFOA invalid parameters */
1497 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1498 "getsockopt should have failed\n");
1499 err
= WSAGetLastError();
1500 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1501 size
= sizeof(WSAPROTOCOL_INFOA
);
1502 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1503 "getsockopt should have failed\n");
1504 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1505 err
= WSAGetLastError();
1506 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1507 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1508 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1509 "getsockopt should have failed\n");
1510 err
= WSAGetLastError();
1511 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1512 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, NULL
),
1513 "getsockopt should have failed\n");
1514 err
= WSAGetLastError();
1515 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1516 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, &size
),
1517 "getsockopt should have failed\n");
1518 err
= WSAGetLastError();
1519 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1520 size
= sizeof(WSAPROTOCOL_INFOA
) / 2;
1521 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1522 "getsockopt should have failed\n");
1523 err
= WSAGetLastError();
1524 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1525 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1526 size
= sizeof(WSAPROTOCOL_INFOA
) * 2;
1527 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1528 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1529 ok(size
== sizeof(WSAPROTOCOL_INFOA
) * 2, "got size %d\n", size
);
1533 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1534 for (i
= 0; i
< sizeof(prottest
) / sizeof(prottest
[0]); i
++)
1536 s
= socket(prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1537 if (s
== INVALID_SOCKET
&& prottest
[i
].family
== AF_INET6
) continue;
1539 ok(s
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
1542 /* compare both A and W version */
1543 infoA
.szProtocol
[0] = 0;
1544 size
= sizeof(WSAPROTOCOL_INFOA
);
1545 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1546 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1547 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1549 infoW
.szProtocol
[0] = 0;
1550 size
= sizeof(WSAPROTOCOL_INFOW
);
1551 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOW
, (char *) &infoW
, &size
);
1552 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1553 ok(size
== sizeof(WSAPROTOCOL_INFOW
), "got size %d\n", size
);
1555 trace("provider name '%s', family %d, type %d, proto %d\n",
1556 infoA
.szProtocol
, prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1558 ok(infoA
.szProtocol
[0] || broken(!infoA
.szProtocol
[0]) /* NT4 */,
1559 "WSAPROTOCOL_INFOA was not filled\n");
1560 ok(infoW
.szProtocol
[0] || broken(!infoA
.szProtocol
[0]) /* NT4 */,
1561 "WSAPROTOCOL_INFOW was not filled\n");
1563 WideCharToMultiByte(CP_ACP
, 0, infoW
.szProtocol
, -1,
1564 providername
, sizeof(providername
), NULL
, NULL
);
1565 ok(!strcmp(infoA
.szProtocol
,providername
),
1566 "different provider names '%s' != '%s'\n", infoA
.szProtocol
, providername
);
1568 ok(!memcmp(&infoA
, &infoW
, FIELD_OFFSET(WSAPROTOCOL_INFOA
, szProtocol
)),
1569 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1571 /* Remove IF when WSAEnumProtocols support IPV6 data */
1572 if (prottest
[i
].family
== AF_INET6
)
1575 ok(infoA
.iAddressFamily
== prottest
[i
].family
, "socket family invalid, expected %d received %d\n",
1576 prottest
[i
].family
, infoA
.iAddressFamily
);
1580 ok(infoA
.iAddressFamily
== prottest
[i
].family
, "socket family invalid, expected %d received %d\n",
1581 prottest
[i
].family
, infoA
.iAddressFamily
);
1582 } ok(infoA
.iSocketType
== prottest
[i
].type
, "socket type invalid, expected %d received %d\n",
1583 prottest
[i
].type
, infoA
.iSocketType
);
1584 ok(infoA
.iProtocol
== prottest
[i
].proto
, "socket protocol invalid, expected %d received %d\n",
1585 prottest
[i
].proto
, infoA
.iProtocol
);
1590 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1591 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1592 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1593 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1594 ok(s2
!= INVALID_SOCKET
, "Failed to create socket\n");
1596 SetLastError(0xdeadbeef);
1597 size
= sizeof(csinfoA
);
1598 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1601 struct sockaddr_in saddr
;
1602 memset(&saddr
, 0, sizeof(saddr
));
1603 saddr
.sin_family
= AF_INET
;
1604 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1606 /* Socket is not bound, no information provided */
1607 ok(!csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1608 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1609 /* Socket is not connected, no information provided */
1610 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1611 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1613 err
= bind(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1614 ok(!err
, "Expected 0, got %d\n", err
);
1615 size
= sizeof(csinfoA
);
1616 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1617 ok(!err
, "Expected 0, got %d\n", err
);
1619 /* Socket is bound */
1620 ok(csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected non-zero\n");
1621 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
!= NULL
, "Expected non-null\n");
1622 /* Socket is not connected, no information provided */
1623 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1624 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1626 err
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1627 ok(!err
, "Expected 0, got %d\n", err
);
1628 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1629 ok(!err
, "Expected 0, got %d\n", err
);
1630 err
= listen(s2
, 1);
1631 ok(!err
, "Expected 0, got %d\n", err
);
1632 err
= connect(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1633 ok(!err
, "Expected 0, got %d\n", err
);
1634 size
= sizeof(saddr
);
1635 err
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1636 ok(err
!= INVALID_SOCKET
, "Failed to accept socket\n");
1640 size
= sizeof(csinfoA
);
1641 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1642 ok(!err
, "Expected 0, got %d\n", err
);
1643 err
= getsockopt(s2
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoB
, &size
);
1644 ok(!err
, "Expected 0, got %d\n", err
);
1645 ok(size
== sizeof(csinfoA
), "Got %d\n", size
);
1646 size
= sizeof(saddr
);
1647 ok(size
== csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1648 csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1649 ok(size
== csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1650 csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1651 ok(!memcmp(csinfoA
.cs
.LocalAddr
.lpSockaddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
),
1652 "Expected matching addresses\n");
1653 ok(!memcmp(csinfoB
.cs
.LocalAddr
.lpSockaddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
),
1654 "Expected matching addresses\n");
1655 ok(csinfoA
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1656 ok(csinfoB
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1657 ok(csinfoA
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1658 ok(csinfoB
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1660 err
= getpeername(s
, (struct sockaddr
*)&saddr
, &size
);
1661 ok(!err
, "Expected 0, got %d\n", err
);
1662 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1663 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1664 err
= getpeername(s2
, (struct sockaddr
*)&saddr
, &size
);
1665 ok(!err
, "Expected 0, got %d\n", err
);
1666 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1667 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1668 err
= getsockname(s
, (struct sockaddr
*)&saddr
, &size
);
1669 ok(!err
, "Expected 0, got %d\n", err
);
1670 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1671 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1672 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1673 ok(!err
, "Expected 0, got %d\n", err
);
1674 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1675 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1677 SetLastError(0xdeadbeef);
1678 size
= sizeof(CSADDR_INFO
);
1679 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1680 ok(err
, "Expected non-zero\n");
1681 ok(size
== sizeof(CSADDR_INFO
), "Got %d\n", size
);
1682 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1684 /* At least for IPv4 the size is exactly 56 bytes */
1685 size
= sizeof(*csinfoA
.cs
.LocalAddr
.lpSockaddr
) * 2 + sizeof(csinfoA
.cs
);
1686 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1687 ok(!err
, "Expected 0, got %d\n", err
);
1689 SetLastError(0xdeadbeef);
1690 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1691 ok(err
, "Expected non-zero\n");
1692 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1695 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %d\n", GetLastError());
1701 static void test_so_reuseaddr(void)
1703 struct sockaddr_in saddr
;
1705 unsigned int rc
,reuse
;
1709 saddr
.sin_family
= AF_INET
;
1710 saddr
.sin_port
= htons(9375);
1711 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1713 s1
=socket(AF_INET
, SOCK_STREAM
, 0);
1714 ok(s1
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1715 rc
= bind(s1
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1716 ok(rc
!=SOCKET_ERROR
, "bind(s1) failed error: %d\n", WSAGetLastError());
1718 s2
=socket(AF_INET
, SOCK_STREAM
, 0);
1719 ok(s2
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1723 rc
=getsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, &size
);
1724 ok(rc
==0 && reuse
==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc
,reuse
);
1726 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1727 ok(rc
==SOCKET_ERROR
, "bind() succeeded\n");
1730 rc
= setsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
1731 ok(rc
==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1733 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1734 * a port immediately after closing another socket on that port, so
1735 * basically following the BSD socket semantics here. */
1736 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1739 int s3
=socket(AF_INET
, SOCK_STREAM
, 0), s4
;
1740 trace("<= Win XP behavior of SO_REUSEADDR\n");
1742 /* If we could bind again in the same port this is Windows version <= XP.
1743 * Lets test if we can really connect to one of them. */
1744 set_blocking(s1
, FALSE
);
1745 set_blocking(s2
, FALSE
);
1747 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1749 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1750 rc
= connect(s3
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1751 ok(!rc
, "connecting to accepting socket failed %d\n", WSAGetLastError());
1753 /* the delivery of the connection is random so we need to try on both sockets */
1754 size
= sizeof(saddr
);
1755 s4
= accept(s1
, (struct sockaddr
*)&saddr
, &size
);
1756 if(s4
== INVALID_SOCKET
)
1757 s4
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1758 ok(s4
!= INVALID_SOCKET
, "none of the listening sockets could get the connection\n");
1766 trace(">= Win 2003 behavior of SO_REUSEADDR\n");
1767 err
= WSAGetLastError();
1768 ok(err
==WSAEACCES
, "expected 10013, got %d\n", err
);
1771 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1772 ok(rc
==0, "bind() failed error: %d\n", WSAGetLastError());
1778 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
1780 static void test_ip_pktinfo(void)
1782 ULONG addresses
[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY
)};
1783 char recvbuf
[10], pktbuf
[512], msg
[] = "HELLO";
1784 struct sockaddr_in s1addr
, s2addr
, s3addr
;
1785 GUID WSARecvMsg_GUID
= WSAID_WSARECVMSG
;
1786 LPFN_WSARECVMSG pWSARecvMsg
= NULL
;
1787 unsigned int rc
, yes
= 1;
1789 DWORD dwBytes
, dwSize
, dwFlags
;
1798 memset(&ov
, 0, sizeof(ov
));
1799 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
1800 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
1802 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
1806 memset(&hdr
, 0x00, sizeof(hdr
));
1807 s1addr
.sin_family
= AF_INET
;
1808 s1addr
.sin_port
= htons(0);
1809 /* Note: s1addr.sin_addr is set below */
1810 iovec
[0].buf
= recvbuf
;
1811 iovec
[0].len
= sizeof(recvbuf
);
1812 hdr
.name
= (struct sockaddr
*)&s3addr
;
1813 hdr
.namelen
= sizeof(s3addr
);
1814 hdr
.lpBuffers
= &iovec
[0];
1815 hdr
.dwBufferCount
= 1;
1816 hdr
.Control
.buf
= pktbuf
;
1817 /* Note: hdr.Control.len is set below */
1820 for (i
=0;i
<sizeof(addresses
)/sizeof(UINT32
);i
++)
1822 s1addr
.sin_addr
.s_addr
= addresses
[i
];
1824 /* Build "server" side socket */
1825 s1
=socket(AF_INET
, SOCK_DGRAM
, 0);
1826 if (s1
== INVALID_SOCKET
)
1828 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
1832 /* Obtain the WSARecvMsg function */
1833 WSAIoctl(s1
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
1834 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &dwBytes
, NULL
, NULL
);
1837 win_skip("WSARecvMsg is unsupported, some tests will be skipped.\n");
1842 /* Setup the server side socket */
1843 rc
=bind(s1
, (struct sockaddr
*)&s1addr
, sizeof(s1addr
));
1844 ok(rc
!= SOCKET_ERROR
, "bind() failed error: %d\n", WSAGetLastError());
1845 rc
=setsockopt(s1
, IPPROTO_IP
, IP_PKTINFO
, (const char*)&yes
, sizeof(yes
));
1846 ok(rc
== 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
1848 /* Build "client" side socket */
1849 addrlen
= sizeof(s2addr
);
1850 if (getsockname(s1
, (struct sockaddr
*) &s2addr
, &addrlen
) != 0)
1852 skip("Failed to call getsockname, some tests skipped: %d\n", WSAGetLastError());
1856 s2addr
.sin_addr
.s_addr
= addresses
[0]; /* Always target the local adapter address */
1857 s2
=socket(AF_INET
, SOCK_DGRAM
, 0);
1858 if (s2
== INVALID_SOCKET
)
1860 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
1865 /* Test an empty message header */
1866 rc
=pWSARecvMsg(s1
, NULL
, NULL
, NULL
, NULL
);
1867 err
=WSAGetLastError();
1868 ok(rc
== SOCKET_ERROR
&& err
== WSAEFAULT
, "WSARecvMsg() failed error: %d (ret = %d)\n", err
, rc
);
1871 * Send a packet from the client to the server and test for specifying
1872 * a short control header.
1874 SetLastError(0xdeadbeef);
1875 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1876 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1877 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1878 hdr
.Control
.len
= 1;
1879 rc
=pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
1880 err
=WSAGetLastError();
1881 ok(rc
== SOCKET_ERROR
&& err
== WSAEMSGSIZE
&& (hdr
.dwFlags
& MSG_CTRUNC
),
1882 "WSARecvMsg() failed error: %d (ret: %d, flags: %d)\n", err
, rc
, hdr
.dwFlags
);
1883 hdr
.dwFlags
= 0; /* Reset flags */
1885 /* Perform another short control header test, this time with an overlapped receive */
1886 hdr
.Control
.len
= 1;
1887 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1888 err
=WSAGetLastError();
1889 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1890 SetLastError(0xdeadbeef);
1891 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1892 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1893 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1894 if (WaitForSingleObject(ov
.hEvent
, 100) != WAIT_OBJECT_0
)
1896 skip("Server side did not receive packet, some tests skipped.\n");
1902 WSAGetOverlappedResult(s1
, &ov
, NULL
, FALSE
, &dwFlags
);
1904 "WSAGetOverlappedResult() returned unexpected flags %d!\n", dwFlags
);
1905 ok(hdr
.dwFlags
== MSG_CTRUNC
,
1906 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr
.dwFlags
);
1907 hdr
.dwFlags
= 0; /* Reset flags */
1910 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
1911 * on the server end and check that the returned packet matches what was sent.
1913 hdr
.Control
.len
= sizeof(pktbuf
);
1914 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1915 err
=WSAGetLastError();
1916 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1917 ok(hdr
.Control
.len
== sizeof(pktbuf
),
1918 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr
.Control
.len
);
1919 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1920 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1921 if (WaitForSingleObject(ov
.hEvent
, 100) != WAIT_OBJECT_0
)
1923 skip("Server side did not receive packet, some tests skipped.\n");
1929 WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, NULL
);
1930 ok(dwSize
== sizeof(msg
),
1931 "WSARecvMsg() buffer length does not match transmitted data!\n");
1932 ok(strncmp(iovec
[0].buf
, msg
, sizeof(msg
)) == 0,
1933 "WSARecvMsg() buffer does not match transmitted data!\n");
1934 ok(hdr
.Control
.len
== IP_PKTINFO_LEN
,
1935 "WSARecvMsg() control length mismatch (%d).\n", hdr
.Control
.len
);
1937 /* Test for the expected IP_PKTINFO return information. */
1939 for (cmsg
= WSA_CMSG_FIRSTHDR(&hdr
); cmsg
!= NULL
; cmsg
= WSA_CMSG_NXTHDR(&hdr
, cmsg
))
1941 if (cmsg
->cmsg_level
== IPPROTO_IP
&& cmsg
->cmsg_type
== IP_PKTINFO
)
1943 struct in_pktinfo
*pi
= (struct in_pktinfo
*)WSA_CMSG_DATA(cmsg
);
1945 ok(pi
->ipi_addr
.s_addr
== s2addr
.sin_addr
.s_addr
, "destination ip mismatch!\n");
1949 ok(foundhdr
, "IP_PKTINFO header information was not returned!\n");
1956 CloseHandle(ov
.hEvent
);
1959 /************* Array containing the tests to run **********/
1961 #define STD_STREAM_SOCKET \
1967 static test_setup tests
[] =
1969 /* Test 0: synchronous client and server */
1990 /* Test 1: event-driven client, synchronous server */
2007 WSA_FLAG_OVERLAPPED
,
2011 /* Test 2: synchronous client, non-blocking server via select() */
2032 /* Test 3: OOB client, OOB server */
2053 /* Test 4: synchronous mixed client and server */
2067 simple_mixed_client
,
2076 static void test_UDP(void)
2078 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
2079 possible that this test fails due to dropped packets. */
2081 /* peer 0 receives data from all other peers */
2082 struct sock_info peer
[NUM_UDP_PEERS
];
2084 int ss
, i
, n_recv
, n_sent
;
2086 memset (buf
,0,sizeof(buf
));
2087 for ( i
= NUM_UDP_PEERS
- 1; i
>= 0; i
-- ) {
2088 ok ( ( peer
[i
].s
= socket ( AF_INET
, SOCK_DGRAM
, 0 ) ) != INVALID_SOCKET
, "UDP: socket failed\n" );
2090 peer
[i
].addr
.sin_family
= AF_INET
;
2091 peer
[i
].addr
.sin_addr
.s_addr
= inet_addr ( SERVERIP
);
2094 peer
[i
].addr
.sin_port
= htons ( SERVERPORT
);
2096 peer
[i
].addr
.sin_port
= htons ( 0 );
2099 do_bind ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, sizeof( peer
[i
].addr
) );
2101 /* test getsockname() to get peer's port */
2102 ss
= sizeof ( peer
[i
].addr
);
2103 ok ( getsockname ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, &ss
) != SOCKET_ERROR
, "UDP: could not getsockname()\n" );
2104 ok ( peer
[i
].addr
.sin_port
!= htons ( 0 ), "UDP: bind() did not associate port\n" );
2107 /* test getsockname() */
2108 ok ( peer
[0].addr
.sin_port
== htons ( SERVERPORT
), "UDP: getsockname returned incorrect peer port\n" );
2110 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2111 /* send client's ip */
2112 memcpy( buf
, &peer
[i
].addr
.sin_port
, sizeof(peer
[i
].addr
.sin_port
) );
2113 n_sent
= sendto ( peer
[i
].s
, buf
, sizeof(buf
), 0, (struct sockaddr
*) &peer
[0].addr
, sizeof(peer
[0].addr
) );
2114 ok ( n_sent
== sizeof(buf
), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent
);
2117 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2118 n_recv
= recvfrom ( peer
[0].s
, buf
, sizeof(buf
), 0,(struct sockaddr
*) &peer
[0].peer
, &ss
);
2119 ok ( n_recv
== sizeof(buf
), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv
);
2120 ok ( memcmp ( &peer
[0].peer
.sin_port
, buf
, sizeof(peer
[0].addr
.sin_port
) ) == 0, "UDP: port numbers do not match\n" );
2124 static DWORD WINAPI
do_getservbyname( void *param
)
2130 } serv
[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} };
2132 HANDLE
*starttest
= param
;
2134 struct servent
*pserv
[2];
2136 ok ( WaitForSingleObject ( *starttest
, TEST_TIMEOUT
* 1000 ) != WAIT_TIMEOUT
,
2137 "test_getservbyname: timeout waiting for start signal\n" );
2139 /* ensure that necessary buffer resizes are completed */
2140 for ( j
= 0; j
< 2; j
++) {
2141 pserv
[j
] = getservbyname ( serv
[j
].name
, serv
[j
].proto
);
2144 for ( i
= 0; i
< NUM_QUERIES
/ 2; i
++ ) {
2145 for ( j
= 0; j
< 2; j
++ ) {
2146 pserv
[j
] = getservbyname ( serv
[j
].name
, serv
[j
].proto
);
2147 ok ( pserv
[j
] != NULL
|| broken(pserv
[j
] == NULL
) /* win8, fixed in win81 */,
2148 "getservbyname could not retrieve information for %s: %d\n", serv
[j
].name
, WSAGetLastError() );
2149 if ( !pserv
[j
] ) continue;
2150 ok ( pserv
[j
]->s_port
== htons(serv
[j
].port
),
2151 "getservbyname returned the wrong port for %s: %d\n", serv
[j
].name
, ntohs(pserv
[j
]->s_port
) );
2152 ok ( !strcmp ( pserv
[j
]->s_proto
, serv
[j
].proto
),
2153 "getservbyname returned the wrong protocol for %s: %s\n", serv
[j
].name
, pserv
[j
]->s_proto
);
2154 ok ( !strcmp ( pserv
[j
]->s_name
, serv
[j
].name
),
2155 "getservbyname returned the wrong name for %s: %s\n", serv
[j
].name
, pserv
[j
]->s_name
);
2158 ok ( pserv
[0] == pserv
[1] || broken(pserv
[0] != pserv
[1]) /* win8, fixed in win81 */,
2159 "getservbyname: winsock resized servent buffer when not necessary\n" );
2165 static void test_getservbyname(void)
2168 HANDLE starttest
, thread
[NUM_THREADS
];
2169 DWORD thread_id
[NUM_THREADS
];
2171 starttest
= CreateEventA ( NULL
, 1, 0, "test_getservbyname_starttest" );
2173 /* create threads */
2174 for ( i
= 0; i
< NUM_THREADS
; i
++ ) {
2175 thread
[i
] = CreateThread ( NULL
, 0, do_getservbyname
, &starttest
, 0, &thread_id
[i
] );
2178 /* signal threads to start */
2179 SetEvent ( starttest
);
2181 for ( i
= 0; i
< NUM_THREADS
; i
++) {
2182 WaitForSingleObject ( thread
[i
], TEST_TIMEOUT
* 1000 );
2186 static void test_WSASocket(void)
2188 SOCKET sock
= INVALID_SOCKET
;
2189 WSAPROTOCOL_INFOA
*pi
;
2190 int wsaproviders
[] = {IPPROTO_TCP
, IPPROTO_IP
};
2191 int autoprotocols
[] = {IPPROTO_TCP
, IPPROTO_UDP
};
2192 int items
, err
, size
, socktype
, i
, j
;
2195 SetLastError(0xdeadbeef);
2196 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2197 "WSASocketA should have failed\n");
2198 err
= WSAGetLastError();
2199 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2201 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
2202 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2205 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, NULL
, 0, 0);
2206 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2209 SetLastError(0xdeadbeef);
2210 ok(WSASocketA(0, SOCK_STREAM
, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2211 "WSASocketA should have failed\n");
2212 err
= WSAGetLastError();
2213 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2215 SetLastError(0xdeadbeef);
2216 ok(WSASocketA(0, -1, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2217 "WSASocketA should have failed\n");
2218 err
= WSAGetLastError();
2219 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2221 SetLastError(0xdeadbeef);
2222 ok(WSASocketA(0, -1, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2223 "WSASocketA should have failed\n");
2224 err
= WSAGetLastError();
2225 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2227 SetLastError(0xdeadbeef);
2228 ok(WSASocketA(AF_INET
, -1, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2229 "WSASocketA should have failed\n");
2230 err
= WSAGetLastError();
2231 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2233 SetLastError(0xdeadbeef);
2234 ok(WSASocketA(AF_INET
, 0, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2235 "WSASocketA should have failed\n");
2236 err
= WSAGetLastError();
2237 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2239 SetLastError(0xdeadbeef);
2240 ok(WSASocketA(0, -1, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2241 "WSASocketA should have failed\n");
2242 err
= WSAGetLastError();
2243 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2245 SetLastError(0xdeadbeef);
2246 ok(WSASocketA(-1, SOCK_STREAM
, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2247 "WSASocketA should have failed\n");
2248 err
= WSAGetLastError();
2249 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2251 sock
= WSASocketA(AF_INET
, 0, IPPROTO_TCP
, NULL
, 0, 0);
2252 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2255 SetLastError(0xdeadbeef);
2256 ok(WSASocketA(0, SOCK_STREAM
, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2257 "WSASocketA should have failed\n");
2258 err
= WSAGetLastError();
2259 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2261 SetLastError(0xdeadbeef);
2262 ok(WSASocketA(0, 0, 0xdead, NULL
, 0, 0) == INVALID_SOCKET
,
2263 "WSASocketA should have failed\n");
2264 err
= WSAGetLastError();
2265 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2267 SetLastError(0xdeadbeef);
2268 ok(WSASocketA(AF_INET
, 0xdead, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2269 "WSASocketA should have failed\n");
2270 err
= WSAGetLastError();
2271 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2273 SetLastError(0xdeadbeef);
2274 ok(WSASocketA(0, 0xdead, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2275 "WSASocketA should have failed\n");
2276 err
= WSAGetLastError();
2277 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2279 sock
= WSASocketA(0, 0, IPPROTO_TCP
, NULL
, 0, 0);
2280 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2283 /* SOCK_STREAM does not support IPPROTO_UDP */
2284 SetLastError(0xdeadbeef);
2285 ok(WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2286 "WSASocketA should have failed\n");
2287 err
= WSAGetLastError();
2288 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2290 /* SOCK_DGRAM does not support IPPROTO_TCP */
2291 SetLastError(0xdeadbeef);
2292 ok(WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, NULL
, 0, 0) == INVALID_SOCKET
,
2293 "WSASocketA should have failed\n");
2294 err
= WSAGetLastError();
2295 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2297 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
2298 * to avoid a crash on win98.
2301 items
= WSAEnumProtocolsA(wsaproviders
, NULL
, &pi_size
);
2302 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
2304 err
= WSAGetLastError();
2305 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2308 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2309 ok(pi
!= NULL
, "Failed to allocate memory\n");
2311 skip("Can't continue without memory.\n");
2315 items
= WSAEnumProtocolsA(wsaproviders
, pi
, &pi_size
);
2316 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2320 skip("No protocols enumerated.\n");
2321 HeapFree(GetProcessHeap(), 0, pi
);
2325 sock
= WSASocketA(FROM_PROTOCOL_INFO
, FROM_PROTOCOL_INFO
,
2326 FROM_PROTOCOL_INFO
, &pi
[0], 0, 0);
2327 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2331 /* find what parameters are used first: plain parameters or protocol info struct */
2332 pi
[0].iProtocol
= -1;
2333 pi
[0].iSocketType
= -1;
2334 pi
[0].iAddressFamily
= -1;
2335 ok(WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0) == INVALID_SOCKET
,
2336 "WSASocketA should have failed\n");
2337 err
= WSAGetLastError();
2338 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2340 pi
[0].iProtocol
= 0;
2341 pi
[0].iSocketType
= 0;
2342 pi
[0].iAddressFamily
= 0;
2343 sock
= WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0);
2344 if(sock
!= INVALID_SOCKET
)
2346 win_skip("must work only in OS <= 2003\n");
2351 err
= WSAGetLastError();
2352 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2355 pi
[0].iProtocol
= IPPROTO_UDP
;
2356 pi
[0].iSocketType
= SOCK_DGRAM
;
2357 pi
[0].iAddressFamily
= AF_INET
;
2358 sock
= WSASocketA(0, 0, 0, &pi
[0], 0, 0);
2359 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2361 size
= sizeof(socktype
);
2363 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2364 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2365 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2366 SOCK_DGRAM
, socktype
);
2369 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, &pi
[0], 0, 0);
2370 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2372 size
= sizeof(socktype
);
2374 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2375 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2376 ok(socktype
== SOCK_STREAM
, "Wrong socket type, expected %d received %d\n",
2377 SOCK_STREAM
, socktype
);
2380 HeapFree(GetProcessHeap(), 0, pi
);
2383 items
= WSAEnumProtocolsA(NULL
, NULL
, &pi_size
);
2384 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
2386 err
= WSAGetLastError();
2387 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2390 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2391 ok(pi
!= NULL
, "Failed to allocate memory\n");
2393 skip("Can't continue without memory.\n");
2397 items
= WSAEnumProtocolsA(NULL
, pi
, &pi_size
);
2398 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2401 /* when no protocol and socket type are specified the first entry
2402 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
2404 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
2405 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2408 size
= sizeof(socktype
);
2410 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2411 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2412 for(i
= 0; i
< items
; i
++)
2414 if(pi
[i
].dwProviderFlags
& PFL_MATCHES_PROTOCOL_ZERO
)
2416 ok(socktype
== pi
[i
].iSocketType
, "Wrong socket type, expected %d received %d\n",
2417 pi
[i
].iSocketType
, socktype
);
2421 ok(i
!= items
, "Creating a socket without protocol and socket type didn't work\n");
2424 /* when no socket type is specified the first entry from WSAEnumProtocols
2425 * that matches the protocol is returned */
2426 for (i
= 0; i
< sizeof(autoprotocols
) / sizeof(autoprotocols
[0]); i
++)
2428 sock
= WSASocketA(0, 0, autoprotocols
[i
], NULL
, 0, 0);
2429 ok(sock
!= INVALID_SOCKET
, "Failed to create socket for protocol %d, received %d\n",
2430 autoprotocols
[i
], WSAGetLastError());
2432 size
= sizeof(socktype
);
2434 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2435 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2437 for (err
= 1, j
= 0; j
< items
; j
++)
2439 if (pi
[j
].iProtocol
== autoprotocols
[i
])
2441 if (socktype
== pi
[j
].iSocketType
)
2444 ok(0, "Wrong socket type, expected %d received %d\n",
2445 pi
[j
].iSocketType
, socktype
);
2449 ok(!err
, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols
[i
]);
2454 HeapFree(GetProcessHeap(), 0, pi
);
2456 SetLastError(0xdeadbeef);
2457 /* starting on vista the socket function returns error during the socket
2458 creation and no longer in the socket operations (sendto, readfrom) */
2459 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_ICMP
, NULL
, 0, 0);
2460 if (sock
== INVALID_SOCKET
)
2462 err
= WSAGetLastError();
2463 ok(err
== WSAEACCES
, "Expected 10013, received %d\n", err
);
2464 skip("SOCK_RAW is not supported\n");
2468 trace("SOCK_RAW is supported\n");
2470 size
= sizeof(socktype
);
2472 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2473 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2474 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2475 SOCK_RAW
, socktype
);
2479 sock
= WSASocketA(0, 0, IPPROTO_RAW
, NULL
, 0, 0);
2480 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2482 size
= sizeof(socktype
);
2484 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2485 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2486 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2487 SOCK_RAW
, socktype
);
2491 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_TCP
, NULL
, 0, 0);
2492 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2494 size
= sizeof(socktype
);
2496 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2497 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2498 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2499 SOCK_RAW
, socktype
);
2503 /* IPX socket tests */
2505 SetLastError(0xdeadbeef);
2506 sock
= WSASocketA(AF_IPX
, SOCK_DGRAM
, NSPROTO_IPX
, NULL
, 0, 0);
2507 if (sock
== INVALID_SOCKET
)
2509 err
= WSAGetLastError();
2510 ok(err
== WSAEAFNOSUPPORT
|| broken(err
== WSAEPROTONOSUPPORT
), "Expected 10047, received %d\n", err
);
2511 skip("IPX is not supported\n");
2515 WSAPROTOCOL_INFOA info
;
2518 trace("IPX is supported\n");
2520 sock
= WSASocketA(0, 0, NSPROTO_IPX
, NULL
, 0, 0);
2521 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2524 size
= sizeof(socktype
);
2526 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2527 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2528 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2529 SOCK_DGRAM
, socktype
);
2531 /* check socket family, type and protocol */
2532 size
= sizeof(WSAPROTOCOL_INFOA
);
2533 err
= getsockopt(sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &info
, &size
);
2534 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2535 ok(info
.iProtocol
== NSPROTO_IPX
, "expected protocol %d, received %d\n",
2536 NSPROTO_IPX
, info
.iProtocol
);
2537 ok(info
.iAddressFamily
== AF_IPX
, "expected family %d, received %d\n",
2538 AF_IPX
, info
.iProtocol
);
2539 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2540 SOCK_DGRAM
, info
.iSocketType
);
2543 /* SOCK_STREAM does not support NSPROTO_IPX */
2544 SetLastError(0xdeadbeef);
2545 ok(WSASocketA(AF_IPX
, SOCK_STREAM
, NSPROTO_IPX
, NULL
, 0, 0) == INVALID_SOCKET
,
2546 "WSASocketA should have failed\n");
2547 err
= WSAGetLastError();
2548 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2550 /* test extended IPX support - that is adding any number between 0 and 255
2551 * to the IPX protocol value will make it be used as IPX packet type */
2552 for(i
= 0;i
<= 255;i
+= 17)
2554 SetLastError(0xdeadbeef);
2555 sock
= WSASocketA(0, 0, NSPROTO_IPX
+ i
, NULL
, 0, 0);
2556 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2561 err
= getsockopt(sock
, NSPROTO_IPX
, IPX_PTYPE
, (char *) &socktype
, &size
);
2562 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2563 ok(socktype
== i
, "Wrong IPX packet type, expected %d received %d\n",
2571 static void test_WSADuplicateSocket(void)
2573 SOCKET source
, dupsock
;
2574 WSAPROTOCOL_INFOA info
;
2576 struct sockaddr_in addr
;
2577 int socktype
, size
, addrsize
, ret
;
2578 char teststr
[] = "TEST", buffer
[16];
2580 source
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
2581 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2583 /* test invalid parameters */
2584 SetLastError(0xdeadbeef);
2585 ok(WSADuplicateSocketA(0, 0, NULL
), "WSADuplicateSocketA should have failed\n");
2586 err
= WSAGetLastError();
2587 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2589 SetLastError(0xdeadbeef);
2590 ok(WSADuplicateSocketA(source
, 0, NULL
),
2591 "WSADuplicateSocketA should have failed\n");
2592 err
= WSAGetLastError();
2593 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2595 SetLastError(0xdeadbeef);
2596 ok(WSADuplicateSocketA(source
, ~0, &info
),
2597 "WSADuplicateSocketA should have failed\n");
2598 err
= WSAGetLastError();
2599 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2601 SetLastError(0xdeadbeef);
2602 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info
),
2603 "WSADuplicateSocketA should have failed\n");
2604 err
= WSAGetLastError();
2605 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2607 SetLastError(0xdeadbeef);
2608 ok(WSADuplicateSocketA(source
, GetCurrentProcessId(), NULL
),
2609 "WSADuplicateSocketA should have failed\n");
2610 err
= WSAGetLastError();
2611 ok(err
== WSAEFAULT
, "expected 10014, received %d\n", err
);
2613 /* test returned structure */
2614 memset(&info
, 0, sizeof(info
));
2615 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2616 "WSADuplicateSocketA should have worked\n");
2618 ok(info
.iProtocol
== IPPROTO_TCP
, "expected protocol %d, received %d\n",
2619 IPPROTO_TCP
, info
.iProtocol
);
2620 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2621 AF_INET
, info
.iProtocol
);
2622 ok(info
.iSocketType
== SOCK_STREAM
, "expected type %d, received %d\n",
2623 SOCK_STREAM
, info
.iSocketType
);
2625 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2626 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2628 closesocket(dupsock
);
2629 closesocket(source
);
2631 /* create a socket, bind it, duplicate it then send data on source and
2632 * receve in the duplicated socket */
2633 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2634 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2636 memset(&info
, 0, sizeof(info
));
2637 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2638 "WSADuplicateSocketA should have worked\n");
2640 ok(info
.iProtocol
== IPPROTO_UDP
, "expected protocol %d, received %d\n",
2641 IPPROTO_UDP
, info
.iProtocol
);
2642 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2643 AF_INET
, info
.iProtocol
);
2644 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2645 SOCK_DGRAM
, info
.iSocketType
);
2647 memset(&addr
, 0, sizeof(addr
));
2648 addr
.sin_family
= AF_INET
;
2649 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2650 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2651 "bind should have worked\n");
2653 /* read address to find out the port number to be used in sendto */
2654 memset(&addr
, 0, sizeof(addr
));
2655 addrsize
= sizeof(addr
);
2656 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2657 "getsockname should have worked\n");
2658 ok(addr
.sin_port
, "socket port should be != 0\n");
2660 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2661 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2664 ret
= getsockopt(dupsock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2665 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
2666 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2667 SOCK_DGRAM
, socktype
);
2669 set_blocking(source
, TRUE
);
2671 /* send data on source socket */
2672 addrsize
= sizeof(addr
);
2673 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2674 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2676 /* receive on duplicated socket */
2677 addrsize
= sizeof(addr
);
2678 memset(buffer
, 0, sizeof(buffer
));
2679 size
= recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
);
2680 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2681 buffer
[sizeof(teststr
) - 1] = 0;
2682 ok(!strcmp(buffer
, teststr
), "expected '%s', received '%s'\n", teststr
, buffer
);
2684 closesocket(dupsock
);
2685 closesocket(source
);
2687 /* show that the source socket need to be bound before the duplicated
2688 * socket is created */
2689 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2690 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2692 memset(&info
, 0, sizeof(info
));
2693 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2694 "WSADuplicateSocketA should have worked\n");
2696 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2697 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2699 memset(&addr
, 0, sizeof(addr
));
2700 addr
.sin_family
= AF_INET
;
2701 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2702 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2703 "bind should have worked\n");
2705 /* read address to find out the port number to be used in sendto */
2706 memset(&addr
, 0, sizeof(addr
));
2707 addrsize
= sizeof(addr
);
2708 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2709 "getsockname should have worked\n");
2710 ok(addr
.sin_port
, "socket port should be != 0\n");
2712 set_blocking(source
, TRUE
);
2714 addrsize
= sizeof(addr
);
2715 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2716 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2718 SetLastError(0xdeadbeef);
2719 addrsize
= sizeof(addr
);
2720 memset(buffer
, 0, sizeof(buffer
));
2722 ok(recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
) == -1,
2723 "recvfrom should have failed\n");
2724 err
= WSAGetLastError();
2725 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2728 closesocket(dupsock
);
2729 closesocket(source
);
2732 static void test_WSAEnumNetworkEvents(void)
2735 int sock_type
[] = {SOCK_STREAM
, SOCK_DGRAM
, SOCK_STREAM
}, i
, j
, k
, l
;
2736 struct sockaddr_in address
;
2738 WSANETWORKEVENTS net_events
;
2739 /* Windows 2000 Pro without SP installed (testbot) will crash if
2740 * WSAEnumNetworkEvents have a NULL event, so skip this test in <= 2000 */
2741 DWORD ver
= GetVersion() & 0xFFFF;
2742 BOOL supports_null
= ((ver
& 0xFF) << 8 | (ver
>> 8)) > 0x0500;
2744 memset(&address
, 0, sizeof(address
));
2745 address
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
2746 address
.sin_family
= AF_INET
;
2748 /* This test follows the steps from bugs 10204 and 24946 */
2749 for (l
= 0; l
< 2; l
++)
2751 if (l
== 1 && !supports_null
&& broken(1)) continue;
2753 for (i
= 0; i
< sizeof(sock_type
) / sizeof(sock_type
[0]); i
++)
2756 ok(!tcp_socketpair(&s
, &s2
), "Test[%d]: creating socket pair failed\n", i
);
2759 s
= socket(AF_INET
, sock_type
[i
], 0);
2760 ok (s
!= SOCKET_ERROR
, "Test[%d]: failed to create socket\n", i
);
2761 ok (!bind(s
, (struct sockaddr
*) &address
, sizeof(address
)), "Test[%d]: bind failed\n", i
);
2763 event
= WSACreateEvent();
2764 ok (event
!= NULL
, "Test[%d]: failed to create event\n", i
);
2765 for (j
= 0; j
< 5; j
++) /* Repeat sometimes and the result must be the same */
2767 /* When the TCP socket is not connected NO events will be returned.
2768 * When connected and no data pending it will get the write event.
2769 * UDP sockets don't have connections so as soon as they are bound
2770 * they can read/write data. Since nobody is sendind us data only
2771 * the write event will be returned and ONLY once.
2773 ok (!WSAEventSelect(s
, event
, FD_READ
| FD_WRITE
), "Test[%d]: WSAEventSelect failed\n", i
);
2774 memset(&net_events
, 0xAB, sizeof(net_events
));
2775 ok (!WSAEnumNetworkEvents(s
, l
== 0 ? event
: NULL
, &net_events
),
2776 "Test[%d]: WSAEnumNetworkEvents failed\n", i
);
2777 if (i
>= 1 && j
== 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
2779 if (i
== 0) /* Remove when fixed */
2782 ok (net_events
.lNetworkEvents
== FD_WRITE
, "Test[%d]: expected 2, got %d\n",
2783 i
, net_events
.lNetworkEvents
);
2786 ok (net_events
.lNetworkEvents
== FD_WRITE
, "Test[%d]: expected 2, got %d\n",
2787 i
, net_events
.lNetworkEvents
);
2791 if (i
!= 0) /* Remove when fixed */
2794 ok (net_events
.lNetworkEvents
== 0, "Test[%d]: expected 0, got %d\n",
2795 i
, net_events
.lNetworkEvents
);
2798 ok (net_events
.lNetworkEvents
== 0, "Test[%d]: expected 0, got %d\n",
2799 i
, net_events
.lNetworkEvents
);
2801 for (k
= 0; k
< FD_MAX_EVENTS
; k
++)
2803 if (i
>= 1 && j
== 0 && k
== 1) /* first UDP and connected TCP test, FD_WRITE bit no error*/
2805 ok (net_events
.iErrorCode
[k
] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
2806 i
, k
, net_events
.iErrorCode
[k
]);
2810 /* Bits that are not set in lNetworkEvents MUST not be changed */
2812 ok (net_events
.iErrorCode
[k
] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
2813 i
, k
, net_events
.iErrorCode
[k
]);
2818 WSACloseEvent(event
);
2819 if (i
== 2) closesocket(s2
);
2824 static void test_WSAAddressToStringA(void)
2826 SOCKET v6
= INVALID_SOCKET
;
2830 SOCKADDR_IN sockaddr
;
2831 CHAR address
[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
2833 CHAR expect1
[] = "0.0.0.0";
2834 CHAR expect2
[] = "255.255.255.255";
2835 CHAR expect3
[] = "0.0.0.0:65535";
2836 CHAR expect4
[] = "255.255.255.255:65535";
2838 SOCKADDR_IN6 sockaddr6
;
2839 CHAR address6
[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
2841 CHAR addr6_1
[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
2842 CHAR addr6_2
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
2843 CHAR addr6_3
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
2845 CHAR expect6_1
[] = "::1";
2846 CHAR expect6_2
[] = "20ab::1";
2847 CHAR expect6_3
[] = "[20ab::2001]:33274";
2848 CHAR expect6_3_nt
[] = "20ab::2001@33274";
2849 CHAR expect6_3_w2k
[] = "20ab::2001";
2850 CHAR expect6_3_2
[] = "[20ab::2001%4660]:33274";
2851 CHAR expect6_3_2_nt
[] = "4660/20ab::2001@33274";
2852 CHAR expect6_3_2_w2k
[] = "20ab::2001%4660";
2853 CHAR expect6_3_3
[] = "20ab::2001%4660";
2854 CHAR expect6_3_3_nt
[] = "4660/20ab::2001";
2858 sockaddr
.sin_family
= AF_INET
;
2859 sockaddr
.sin_port
= 0;
2860 sockaddr
.sin_addr
.s_addr
= 0;
2862 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2863 GLE
= WSAGetLastError();
2864 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEFAULT
) || (ret
== 0),
2865 "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
2868 len
= sizeof(address
);
2870 sockaddr
.sin_family
= AF_INET
;
2871 sockaddr
.sin_port
= 0;
2872 sockaddr
.sin_addr
.s_addr
= 0;
2874 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2875 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2877 ok( !strcmp( address
, expect1
), "Expected: %s, got: %s\n", expect1
, address
);
2878 ok( len
== sizeof( expect1
), "Got size %d\n", len
);
2880 len
= sizeof(address
);
2882 sockaddr
.sin_family
= AF_INET
;
2883 sockaddr
.sin_port
= 0;
2884 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
2886 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2887 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2889 ok( !strcmp( address
, expect2
), "Expected: %s, got: %s\n", expect2
, address
);
2891 len
= sizeof(address
);
2893 sockaddr
.sin_family
= AF_INET
;
2894 sockaddr
.sin_port
= 0xffff;
2895 sockaddr
.sin_addr
.s_addr
= 0;
2897 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2898 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2900 ok( !strcmp( address
, expect3
), "Expected: %s, got: %s\n", expect3
, address
);
2902 len
= sizeof(address
);
2904 sockaddr
.sin_family
= AF_INET
;
2905 sockaddr
.sin_port
= 0xffff;
2906 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
2908 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2909 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2911 ok( !strcmp( address
, expect4
), "Expected: %s, got: %s\n", expect4
, address
);
2912 ok( len
== sizeof( expect4
), "Got size %d\n", len
);
2914 /*check to see it IPv6 is available */
2915 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
2916 if (v6
== INVALID_SOCKET
) {
2917 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
2918 WSAGetLastError(), WSAEAFNOSUPPORT
);
2921 /* Test a short IPv6 address */
2922 len
= sizeof(address6
);
2924 sockaddr6
.sin6_family
= AF_INET6
;
2925 sockaddr6
.sin6_port
= 0x0000;
2926 sockaddr6
.sin6_scope_id
= 0;
2927 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_1
, sizeof(addr6_1
));
2929 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2930 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2931 ok( !strcmp( address6
, expect6_1
), "Expected: %s, got: %s\n", expect6_1
, address6
);
2932 ok( len
== sizeof(expect6_1
), "Got size %d\n", len
);
2934 /* Test a longer IPv6 address */
2935 len
= sizeof(address6
);
2937 sockaddr6
.sin6_family
= AF_INET6
;
2938 sockaddr6
.sin6_port
= 0x0000;
2939 sockaddr6
.sin6_scope_id
= 0;
2940 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_2
, sizeof(addr6_2
));
2942 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2943 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2944 ok( !strcmp( address6
, expect6_2
), "Expected: %s, got: %s\n", expect6_2
, address6
);
2945 ok( len
== sizeof(expect6_2
), "Got size %d\n", len
);
2947 /* Test IPv6 address and port number */
2948 len
= sizeof(address6
);
2950 sockaddr6
.sin6_family
= AF_INET6
;
2951 sockaddr6
.sin6_port
= 0xfa81;
2952 sockaddr6
.sin6_scope_id
= 0;
2953 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
2955 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2956 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2957 ok( !strcmp( address6
, expect6_3
) ||
2958 broken( !strcmp( address6
, expect6_3_nt
) ) || /* NT4 */
2959 broken( !strcmp( address6
, expect6_3_w2k
) ), /* Win2000 */
2960 "Expected: %s, got: %s\n", expect6_3
, address6
);
2961 ok( len
== sizeof(expect6_3
) ||
2962 broken( len
== sizeof(expect6_3_nt
) ) || /* NT4 */
2963 broken( len
== sizeof(expect6_3_w2k
) ), /* Win2000 */
2964 "Got size %d\n", len
);
2966 /* Test IPv6 address, port number and scope_id */
2967 len
= sizeof(address6
);
2969 sockaddr6
.sin6_family
= AF_INET6
;
2970 sockaddr6
.sin6_port
= 0xfa81;
2971 sockaddr6
.sin6_scope_id
= 0x1234;
2972 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
2974 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2975 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2976 ok( !strcmp( address6
, expect6_3_2
) ||
2977 broken( !strcmp( address6
, expect6_3_2_nt
) ) || /* NT4 */
2978 broken( !strcmp( address6
, expect6_3_2_w2k
) ), /* Win2000 */
2979 "Expected: %s, got: %s\n", expect6_3_2
, address6
);
2980 ok( len
== sizeof(expect6_3_2
) ||
2981 broken( len
== sizeof(expect6_3_2_nt
) ) || /* NT4 */
2982 broken( len
== sizeof(expect6_3_2_w2k
) ), /* Win2000 */
2983 "Got size %d\n", len
);
2985 /* Test IPv6 address and scope_id */
2986 len
= sizeof(address6
);
2988 sockaddr6
.sin6_family
= AF_INET6
;
2989 sockaddr6
.sin6_port
= 0x0000;
2990 sockaddr6
.sin6_scope_id
= 0x1234;
2991 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
2993 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2994 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2995 ok( !strcmp( address6
, expect6_3_3
) ||
2996 broken( !strcmp( address6
, expect6_3_3_nt
) ), /* NT4 */
2997 "Expected: %s, got: %s\n", expect6_3_3
, address6
);
2998 ok( len
== sizeof(expect6_3_3
) ||
2999 broken( len
== sizeof(expect6_3_3_nt
) ), /* NT4 */
3000 "Got size %d\n", len
);
3003 if (v6
!= INVALID_SOCKET
)
3007 static void test_WSAAddressToStringW(void)
3009 SOCKET v6
= INVALID_SOCKET
;
3013 SOCKADDR_IN sockaddr
;
3014 WCHAR address
[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3016 WCHAR expect1
[] = { '0','.','0','.','0','.','0', 0 };
3017 WCHAR expect2
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3018 WCHAR expect3
[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
3019 WCHAR expect4
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3020 '6', '5', '5', '3', '5', 0 };
3022 SOCKADDR_IN6 sockaddr6
;
3023 WCHAR address6
[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3025 CHAR addr6_1
[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3026 CHAR addr6_2
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3027 CHAR addr6_3
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3029 WCHAR expect6_1
[] = {':',':','1',0};
3030 WCHAR expect6_2
[] = {'2','0','a','b',':',':','1',0};
3031 WCHAR expect6_3
[] = {'[','2','0','a','b',':',':','2','0','0','1',']',':','3','3','2','7','4',0};
3032 WCHAR expect6_3_nt
[] = {'2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3033 WCHAR expect6_3_w2k
[] = {'2','0','a','b',':',':','2','0','0','1',0};
3034 WCHAR expect6_3_2
[] = {'[','2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',']',':','3','3','2','7','4',0};
3035 WCHAR expect6_3_2_nt
[] = {'4','6','6','0','/','2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3036 WCHAR expect6_3_2_w2k
[] = {'2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',0};
3037 WCHAR expect6_3_3
[] = {'2','0','a','b',':',':','2','0','0','1','%','6','5','5','3','4',0};
3038 WCHAR expect6_3_3_nt
[] = {'6','5','5','3','4','/','2','0','a','b',':',':','2','0','0','1',0};
3042 sockaddr
.sin_family
= AF_INET
;
3043 sockaddr
.sin_port
= 0;
3044 sockaddr
.sin_addr
.s_addr
= 0;
3046 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3047 GLE
= WSAGetLastError();
3048 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEFAULT
) || (ret
== 0),
3049 "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3052 len
= sizeof(address
);
3054 sockaddr
.sin_family
= AF_INET
;
3055 sockaddr
.sin_port
= 0;
3056 sockaddr
.sin_addr
.s_addr
= 0;
3058 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3059 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3061 ok( !lstrcmpW( address
, expect1
), "Expected different address string\n" );
3062 ok( len
== sizeof( expect1
)/sizeof( WCHAR
), "Got size %d\n", len
);
3064 len
= sizeof(address
);
3066 sockaddr
.sin_family
= AF_INET
;
3067 sockaddr
.sin_port
= 0;
3068 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
3070 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3071 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3073 ok( !lstrcmpW( address
, expect2
), "Expected different address string\n" );
3075 len
= sizeof(address
);
3077 sockaddr
.sin_family
= AF_INET
;
3078 sockaddr
.sin_port
= 0xffff;
3079 sockaddr
.sin_addr
.s_addr
= 0;
3081 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3082 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3084 ok( !lstrcmpW( address
, expect3
), "Expected different address string\n" );
3086 len
= sizeof(address
);
3088 sockaddr
.sin_family
= AF_INET
;
3089 sockaddr
.sin_port
= 0xffff;
3090 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
3092 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3093 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3095 ok( !lstrcmpW( address
, expect4
), "Expected different address string\n" );
3096 ok( len
== sizeof( expect4
)/sizeof( WCHAR
), "Got %d\n", len
);
3098 /*check to see it IPv6 is available */
3099 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
3100 if (v6
== INVALID_SOCKET
) {
3101 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3102 WSAGetLastError(), WSAEAFNOSUPPORT
);
3106 /* Test a short IPv6 address */
3107 len
= sizeof(address6
)/sizeof(WCHAR
);
3109 sockaddr6
.sin6_family
= AF_INET6
;
3110 sockaddr6
.sin6_port
= 0x0000;
3111 sockaddr6
.sin6_scope_id
= 0;
3112 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_1
, sizeof(addr6_1
));
3114 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3115 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3116 ok( !lstrcmpW( address6
, expect6_1
), "Wrong string returned\n" );
3117 ok( len
== sizeof(expect6_1
)/sizeof(WCHAR
), "Got %d\n", len
);
3119 /* Test a longer IPv6 address */
3120 len
= sizeof(address6
)/sizeof(WCHAR
);
3122 sockaddr6
.sin6_family
= AF_INET6
;
3123 sockaddr6
.sin6_port
= 0x0000;
3124 sockaddr6
.sin6_scope_id
= 0;
3125 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_2
, sizeof(addr6_2
));
3127 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3128 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3130 ok( !lstrcmpW( address6
, expect6_2
), "Wrong string returned\n" );
3131 ok( len
== sizeof(expect6_2
)/sizeof(WCHAR
), "Got %d\n", len
);
3133 /* Test IPv6 address and port number */
3134 len
= sizeof(address6
)/sizeof(WCHAR
);
3136 sockaddr6
.sin6_family
= AF_INET6
;
3137 sockaddr6
.sin6_port
= 0xfa81;
3138 sockaddr6
.sin6_scope_id
= 0;
3139 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3141 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3142 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3143 ok( !lstrcmpW( address6
, expect6_3
) ||
3144 broken( !lstrcmpW( address6
, expect6_3_nt
) ) || /* NT4 */
3145 broken( !lstrcmpW( address6
, expect6_3_w2k
) ), /* Win2000 */
3146 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3
),
3147 wine_dbgstr_w(address6
) );
3148 ok( len
== sizeof(expect6_3
)/sizeof(WCHAR
) ||
3149 broken(len
== sizeof(expect6_3_nt
)/sizeof(WCHAR
) ) || /* NT4 */
3150 broken(len
== sizeof(expect6_3_w2k
)/sizeof(WCHAR
) ), /* Win2000 */
3153 /* Test IPv6 address, port number and scope_id */
3154 len
= sizeof(address6
)/sizeof(WCHAR
);
3156 sockaddr6
.sin6_family
= AF_INET6
;
3157 sockaddr6
.sin6_port
= 0xfa81;
3158 sockaddr6
.sin6_scope_id
= 0x1234;
3159 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3161 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3162 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3163 ok( !lstrcmpW( address6
, expect6_3_2
) ||
3164 broken( !lstrcmpW( address6
, expect6_3_2_nt
) ) || /* NT4 */
3165 broken( !lstrcmpW( address6
, expect6_3_2_w2k
) ), /* Win2000 */
3166 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_2
),
3167 wine_dbgstr_w(address6
) );
3168 ok( len
== sizeof(expect6_3_2
)/sizeof(WCHAR
) ||
3169 broken( len
== sizeof(expect6_3_2_nt
)/sizeof(WCHAR
) ) || /* NT4 */
3170 broken( len
== sizeof(expect6_3_2_w2k
)/sizeof(WCHAR
) ), /* Win2000 */
3173 /* Test IPv6 address and scope_id */
3174 len
= sizeof(address6
)/sizeof(WCHAR
);
3176 sockaddr6
.sin6_family
= AF_INET6
;
3177 sockaddr6
.sin6_port
= 0x0000;
3178 sockaddr6
.sin6_scope_id
= 0xfffe;
3179 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3181 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3182 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3183 ok( !lstrcmpW( address6
, expect6_3_3
) ||
3184 broken( !lstrcmpW( address6
, expect6_3_3_nt
) ), /* NT4 */
3185 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_3
),
3186 wine_dbgstr_w(address6
) );
3187 ok( len
== sizeof(expect6_3_3
)/sizeof(WCHAR
) ||
3188 broken( len
== sizeof(expect6_3_3_nt
)/sizeof(WCHAR
) ), /* NT4 */
3192 if (v6
!= INVALID_SOCKET
)
3196 static void test_WSAStringToAddressA(void)
3199 SOCKADDR_IN sockaddr
;
3200 SOCKADDR_IN6 sockaddr6
;
3203 CHAR address1
[] = "0.0.0.0";
3204 CHAR address2
[] = "127.127.127.127";
3205 CHAR address3
[] = "255.255.255.255";
3206 CHAR address4
[] = "127.127.127.127:65535";
3207 CHAR address5
[] = "255.255.255.255:65535";
3208 CHAR address6
[] = "::1";
3209 CHAR address7
[] = "[::1]";
3210 CHAR address8
[] = "[::1]:65535";
3211 CHAR address9
[] = "2001::1";
3214 sockaddr
.sin_family
= AF_INET
;
3216 ret
= WSAStringToAddressA( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3217 ok( ret
== SOCKET_ERROR
, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
3218 WSAGetLastError() );
3220 len
= sizeof(sockaddr
);
3221 sockaddr
.sin_port
= 0;
3222 sockaddr
.sin_addr
.s_addr
= 0;
3224 ret
= WSAStringToAddressA( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3225 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0,
3226 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3228 len
= sizeof(sockaddr
);
3229 sockaddr
.sin_port
= 0;
3230 sockaddr
.sin_addr
.s_addr
= 0;
3232 ret
= WSAStringToAddressA( address2
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3233 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f,
3234 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3236 len
= sizeof(sockaddr
);
3237 sockaddr
.sin_port
= 0;
3238 sockaddr
.sin_addr
.s_addr
= 0;
3240 ret
= WSAStringToAddressA( address3
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3241 GLE
= WSAGetLastError();
3242 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff) ||
3243 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3244 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE
);
3246 len
= sizeof(sockaddr
);
3247 sockaddr
.sin_port
= 0;
3248 sockaddr
.sin_addr
.s_addr
= 0;
3250 ret
= WSAStringToAddressA( address4
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3251 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f && sockaddr
.sin_port
== 0xffff,
3252 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3254 len
= sizeof(sockaddr
);
3255 sockaddr
.sin_port
= 0;
3256 sockaddr
.sin_addr
.s_addr
= 0;
3258 ret
= WSAStringToAddressA( address5
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3259 GLE
= WSAGetLastError();
3260 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff && sockaddr
.sin_port
== 0xffff) ||
3261 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3262 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE
);
3264 len
= sizeof(sockaddr6
);
3265 memset(&sockaddr6
, 0, len
);
3266 sockaddr6
.sin6_family
= AF_INET6
;
3268 ret
= WSAStringToAddressA( address6
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3270 GLE
= WSAGetLastError();
3271 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3272 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3274 len
= sizeof(sockaddr6
);
3275 memset(&sockaddr6
, 0, len
);
3276 sockaddr6
.sin6_family
= AF_INET6
;
3278 ret
= WSAStringToAddressA( address7
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3280 GLE
= WSAGetLastError();
3281 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3282 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3284 len
= sizeof(sockaddr6
);
3285 memset(&sockaddr6
, 0, len
);
3286 sockaddr6
.sin6_family
= AF_INET6
;
3288 ret
= WSAStringToAddressA( address8
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3290 GLE
= WSAGetLastError();
3291 ok( (ret
== 0 && sockaddr6
.sin6_port
== 0xffff) ||
3292 (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3293 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3295 len
= sizeof(sockaddr
);
3297 ret
= WSAStringToAddressA( address9
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3298 GLE
= WSAGetLastError();
3299 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3300 "WSAStringToAddressA() should have failed with %d\n", GLE
);
3303 static void test_WSAStringToAddressW(void)
3306 SOCKADDR_IN sockaddr
, *sin
;
3307 SOCKADDR_IN6 sockaddr6
;
3308 SOCKADDR_STORAGE sockaddr_storage
;
3311 WCHAR address1
[] = { '0','.','0','.','0','.','0', 0 };
3312 WCHAR address2
[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
3313 WCHAR address3
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3314 WCHAR address4
[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
3315 ':', '6', '5', '5', '3', '5', 0 };
3316 WCHAR address5
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3317 '6', '5', '5', '3', '5', 0 };
3318 WCHAR address6
[] = {':',':','1','\0'};
3319 WCHAR address7
[] = {'[',':',':','1',']','\0'};
3320 WCHAR address8
[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
3321 WCHAR address9
[] = {'2','0','0','1',':',':','1','\0'};
3324 sockaddr
.sin_family
= AF_INET
;
3326 ret
= WSAStringToAddressW( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3327 ok( ret
== SOCKET_ERROR
, "WSAStringToAddressW() failed unexpectedly: %d\n",
3328 WSAGetLastError() );
3330 len
= sizeof(sockaddr
);
3331 sockaddr
.sin_port
= 0;
3332 sockaddr
.sin_addr
.s_addr
= 0;
3334 ret
= WSAStringToAddressW( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3335 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0,
3336 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3338 len
= sizeof(sockaddr
);
3339 sockaddr
.sin_port
= 0;
3340 sockaddr
.sin_addr
.s_addr
= 0;
3342 ret
= WSAStringToAddressW( address2
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3343 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f,
3344 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3346 len
= sizeof(sockaddr
);
3347 sockaddr
.sin_port
= 0;
3348 sockaddr
.sin_addr
.s_addr
= 0;
3350 ret
= WSAStringToAddressW( address3
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3351 GLE
= WSAGetLastError();
3352 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff) ||
3353 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3354 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3356 len
= sizeof(sockaddr
);
3357 sockaddr
.sin_port
= 0;
3358 sockaddr
.sin_addr
.s_addr
= 0;
3360 ret
= WSAStringToAddressW( address4
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3361 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f && sockaddr
.sin_port
== 0xffff,
3362 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3364 len
= sizeof(sockaddr
);
3365 sockaddr
.sin_port
= 0;
3366 sockaddr
.sin_addr
.s_addr
= 0;
3368 ret
= WSAStringToAddressW( address5
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3369 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff && sockaddr
.sin_port
== 0xffff) ||
3370 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3371 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3373 /* Test with a larger buffer than necessary */
3374 len
= sizeof(sockaddr_storage
);
3375 sin
= (SOCKADDR_IN
*)&sockaddr_storage
;
3377 sin
->sin_addr
.s_addr
= 0;
3379 ret
= WSAStringToAddressW( address5
, AF_INET
, NULL
, (SOCKADDR
*)sin
, &len
);
3380 ok( (ret
== 0 && sin
->sin_addr
.s_addr
== 0xffffffff && sin
->sin_port
== 0xffff) ||
3381 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3382 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3383 ok( len
== sizeof(SOCKADDR_IN
) ||
3384 broken(len
== sizeof(SOCKADDR_STORAGE
)) /* NT4/2k */,
3385 "unexpected length %d\n", len
);
3387 len
= sizeof(sockaddr6
);
3388 memset(&sockaddr6
, 0, len
);
3389 sockaddr6
.sin6_family
= AF_INET6
;
3391 ret
= WSAStringToAddressW( address6
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3393 GLE
= WSAGetLastError();
3394 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3395 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3397 len
= sizeof(sockaddr6
);
3398 memset(&sockaddr6
, 0, len
);
3399 sockaddr6
.sin6_family
= AF_INET6
;
3401 ret
= WSAStringToAddressW( address7
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3403 GLE
= WSAGetLastError();
3404 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3405 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3407 len
= sizeof(sockaddr6
);
3408 memset(&sockaddr6
, 0, len
);
3409 sockaddr6
.sin6_family
= AF_INET6
;
3411 ret
= WSAStringToAddressW( address8
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3413 GLE
= WSAGetLastError();
3414 ok( (ret
== 0 && sockaddr6
.sin6_port
== 0xffff) ||
3415 (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3416 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3418 len
= sizeof(sockaddr
);
3420 ret
= WSAStringToAddressW( address9
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3421 GLE
= WSAGetLastError();
3422 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3423 "WSAStringToAddressW() should have failed with %d\n", GLE
);
3426 static DWORD WINAPI
SelectReadThread(void *param
)
3428 select_thread_params
*par
= param
;
3431 struct sockaddr_in addr
;
3432 struct timeval select_timeout
;
3435 FD_SET(par
->s
, &readfds
);
3436 select_timeout
.tv_sec
=5;
3437 select_timeout
.tv_usec
=0;
3438 addr
.sin_family
= AF_INET
;
3439 addr
.sin_addr
.s_addr
= inet_addr(SERVERIP
);
3440 addr
.sin_port
= htons(SERVERPORT
);
3442 do_bind(par
->s
, (struct sockaddr
*)&addr
, sizeof(addr
));
3443 wsa_ok(listen(par
->s
, SOMAXCONN
), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
3445 SetEvent(server_ready
);
3446 ret
= select(par
->s
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3447 par
->ReadKilled
= (ret
== 1);
3452 static DWORD WINAPI
SelectCloseThread(void *param
)
3454 SOCKET s
= *(SOCKET
*)param
;
3460 static void test_errors(void)
3463 SOCKADDR_IN SockAddr
;
3466 WSASetLastError(NO_ERROR
);
3467 sock
= socket(PF_INET
, SOCK_STREAM
, 0);
3468 ok( (sock
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3469 memset(&SockAddr
, 0, sizeof(SockAddr
));
3470 SockAddr
.sin_family
= AF_INET
;
3471 SockAddr
.sin_port
= htons(6924);
3472 SockAddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3474 ret
= connect(sock
, (PSOCKADDR
)&SockAddr
, sizeof(SockAddr
));
3475 ok( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got: %d\n", ret
);
3476 if (ret
== SOCKET_ERROR
)
3478 err
= WSAGetLastError();
3479 ok( (err
== WSAECONNREFUSED
), "expected WSAECONNREFUSED, got: %d\n", err
);
3484 fd_set set
= {1, {sock
}};
3487 timeval
.tv_usec
= 50000;
3489 ret
= select(1, NULL
, &set
, NULL
, &timeval
);
3490 ok( (ret
== 0), "expected 0 (timeout), got: %d\n", ret
);
3493 ret
= closesocket(sock
);
3494 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
3497 static void test_listen(void)
3500 int ret
, acceptc
, olen
= sizeof(acceptc
);
3501 struct sockaddr_in address
;
3503 memset(&address
, 0, sizeof(address
));
3504 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3505 address
.sin_family
= AF_INET
;
3506 address
.sin_port
= htons(SERVERPORT
);
3508 /* invalid socket tests */
3509 SetLastError(0xdeadbeef);
3510 ok ((listen(0, 0) == SOCKET_ERROR
), "listen did not fail\n");
3511 ret
= WSAGetLastError();
3512 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3514 SetLastError(0xdeadbeef);
3515 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR
), "listen did not fail\n");
3516 ret
= WSAGetLastError();
3517 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3520 fdA
= socket(AF_INET
, SOCK_STREAM
, 0);
3521 ok ((fdA
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3523 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3524 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3526 SetLastError(0xdeadbeef);
3527 ok ((listen(fdA
, -2) == SOCKET_ERROR
), "listen did not fail\n");
3528 ret
= WSAGetLastError();
3529 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3531 SetLastError(0xdeadbeef);
3532 ok ((listen(fdA
, 1) == SOCKET_ERROR
), "listen did not fail\n");
3533 ret
= WSAGetLastError();
3534 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3536 SetLastError(0xdeadbeef);
3537 ok ((listen(fdA
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3538 ret
= WSAGetLastError();
3539 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3541 ok (!bind(fdA
, (struct sockaddr
*) &address
, sizeof(address
)), "bind failed\n");
3543 SetLastError(0xdeadbeef);
3544 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3545 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3548 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3549 ok (!ret
, "getsockopt failed\n");
3550 ok (acceptc
== 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc
);
3552 ok (!listen(fdA
, 0), "listen failed\n");
3553 ok (!listen(fdA
, SOMAXCONN
), "double listen failed\n");
3556 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3557 ok (!ret
, "getsockopt failed\n");
3558 ok (acceptc
== 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc
);
3560 SetLastError(0xdeadbeef);
3561 ok ((listen(fdB
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3562 ret
= WSAGetLastError();
3563 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3565 ret
= closesocket(fdB
);
3566 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3568 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3569 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3571 SetLastError(0xdeadbeef);
3572 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3573 ret
= WSAGetLastError();
3574 ok (ret
== WSAEADDRINUSE
, "expected 10048, received %d\n", ret
);
3576 ret
= closesocket(fdA
);
3577 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3578 ret
= closesocket(fdB
);
3579 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3582 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
3583 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
3584 static void test_select(void)
3586 static char tmp_buf
[1024];
3588 SOCKET fdListen
, fdRead
, fdWrite
;
3589 fd_set readfds
, writefds
, exceptfds
;
3593 struct timeval select_timeout
;
3594 struct sockaddr_in address
;
3595 select_thread_params thread_params
;
3596 HANDLE thread_handle
;
3599 fdRead
= socket(AF_INET
, SOCK_STREAM
, 0);
3600 ok( (fdRead
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3601 fdWrite
= socket(AF_INET
, SOCK_STREAM
, 0);
3602 ok( (fdWrite
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3605 if (fdWrite
> maxfd
)
3610 FD_SET_ALL(fdWrite
);
3611 select_timeout
.tv_sec
=0;
3612 select_timeout
.tv_usec
=0;
3614 ticks
= GetTickCount();
3615 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3616 ticks
= GetTickCount() - ticks
;
3617 ok(ret
== 0, "select should not return any socket handles\n");
3618 ok(ticks
< 10, "select was blocking for %u ms, expected < 10 ms\n", ticks
);
3619 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3620 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
3621 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3622 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
3626 FD_SET_ALL(fdWrite
);
3627 select_timeout
.tv_sec
=0;
3628 select_timeout
.tv_usec
=500;
3630 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3631 ok(ret
== 0, "select should not return any socket handles\n");
3632 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3633 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
3634 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3635 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
3637 ok ((listen(fdWrite
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3638 ret
= closesocket(fdWrite
);
3639 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3641 thread_params
.s
= fdRead
;
3642 thread_params
.ReadKilled
= FALSE
;
3643 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
3644 thread_handle
= CreateThread (NULL
, 0, SelectReadThread
, &thread_params
, 0, &id
);
3645 ok ( (thread_handle
!= NULL
), "CreateThread failed unexpectedly: %d\n", GetLastError());
3647 WaitForSingleObject (server_ready
, INFINITE
);
3649 ret
= closesocket(fdRead
);
3650 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3652 WaitForSingleObject (thread_handle
, 1000);
3653 ok ( (thread_params
.ReadKilled
) ||
3654 broken(thread_params
.ReadKilled
== 0), /*Win98*/
3655 "closesocket did not wakeup select\n");
3656 ret
= recv(fdRead
, &buffer
, 1, MSG_PEEK
);
3657 ok( (ret
== -1), "peek at closed socket expected -1 got %d\n", ret
);
3659 /* Test selecting invalid handles */
3663 ret
= select(maxfd
+1, 0, 0, 0, &select_timeout
);
3664 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3665 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3668 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3669 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3670 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3672 FD_SET(INVALID_SOCKET
, &readfds
);
3674 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3675 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3676 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3677 ok ( !FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3680 FD_SET(INVALID_SOCKET
, &writefds
);
3682 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3683 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3684 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3685 ok ( !FD_ISSET(fdRead
, &writefds
), "FD should not be set\n");
3688 FD_SET(INVALID_SOCKET
, &exceptfds
);
3690 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3691 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3692 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3693 ok ( !FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3695 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3697 if(fdWrite
> maxfd
) maxfd
= fdWrite
;
3700 FD_SET(fdRead
, &readfds
);
3701 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3702 ok(!ret
, "select returned %d\n", ret
);
3705 FD_SET(fdWrite
, &writefds
);
3706 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3707 ok(ret
== 1, "select returned %d\n", ret
);
3708 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3710 /* tests for overlapping fd_set pointers */
3712 FD_SET(fdWrite
, &readfds
);
3713 ret
= select(fdWrite
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3714 ok(ret
== 1, "select returned %d\n", ret
);
3715 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3718 FD_SET(fdWrite
, &readfds
);
3719 FD_SET(fdRead
, &readfds
);
3720 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3721 ok(ret
== 2, "select returned %d\n", ret
);
3722 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3723 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3725 ok(send(fdWrite
, "test", 4, 0) == 4, "failed to send data\n");
3727 FD_SET(fdRead
, &readfds
);
3728 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3729 ok(ret
== 1, "select returned %d\n", ret
);
3730 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3733 FD_SET(fdWrite
, &readfds
);
3734 FD_SET(fdRead
, &readfds
);
3735 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3736 ok(ret
== 2, "select returned %d\n", ret
);
3737 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3738 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3742 FD_SET(fdWrite
, &writefds
);
3743 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3745 ok(send(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0) > 0, "failed to send data\n");
3748 FD_SET(fdWrite
, &readfds
);
3749 FD_SET(fdRead
, &readfds
);
3750 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3751 ok(ret
== 1, "select returned %d\n", ret
);
3752 ok(!FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is in the set\n");
3753 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3755 ok(send(fdRead
, "test", 4, 0) == 4, "failed to send data\n");
3758 FD_SET(fdWrite
, &readfds
);
3759 FD_SET(fdRead
, &readfds
);
3760 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3761 ok(ret
== 2, "select returned %d\n", ret
);
3762 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3763 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3765 closesocket(fdRead
);
3766 closesocket(fdWrite
);
3768 /* select() works in 3 distinct states:
3769 * - to check if a connection attempt ended with success or error;
3770 * - to check if a pending connection is waiting for acceptance;
3771 * - to check for data to read, availability for write and OOB data
3773 * The tests below ensure that all conditions are tested.
3775 memset(&address
, 0, sizeof(address
));
3776 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3777 address
.sin_family
= AF_INET
;
3778 len
= sizeof(address
);
3779 fdListen
= setup_server_socket(&address
, &len
);
3780 select_timeout
.tv_sec
= 1;
3781 select_timeout
.tv_usec
= 250000;
3783 /* When no events are pending select returns 0 with no error */
3785 FD_SET_ALL(fdListen
);
3786 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3787 ok(ret
== 0, "expected 0, got %d\n", ret
);
3789 /* When a socket is attempting to connect the listening socket receives the read descriptor */
3790 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
3792 FD_SET_ALL(fdListen
);
3793 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3794 ok(ret
== 1, "expected 1, got %d\n", ret
);
3795 ok(FD_ISSET(fdListen
, &readfds
), "fdListen socket is not in the set\n");
3796 len
= sizeof(address
);
3797 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
3798 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
3800 /* The connector is signaled through the write descriptor */
3802 FD_SET_ALL(fdListen
);
3804 FD_SET_ALL(fdWrite
);
3805 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3806 ok(ret
== 2, "expected 2, got %d\n", ret
);
3807 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3808 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
3811 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
3812 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3813 ok(id
== 0, "expected 0, got %d\n", id
);
3815 /* When data is received the receiver gets the read descriptor */
3816 ret
= send(fdWrite
, "1234", 4, 0);
3817 ok(ret
== 4, "expected 4, got %d\n", ret
);
3819 FD_SET_ALL(fdListen
);
3820 FD_SET(fdRead
, &readfds
);
3821 FD_SET(fdRead
, &exceptfds
);
3822 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3823 ok(ret
== 1, "expected 1, got %d\n", ret
);
3824 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3825 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3826 ok(ret
== 4, "expected 4, got %d\n", ret
);
3827 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
3829 /* When OOB data is received the socket is set in the except descriptor */
3830 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3831 ok(ret
== 1, "expected 1, got %d\n", ret
);
3833 FD_SET_ALL(fdListen
);
3834 FD_SET(fdRead
, &readfds
);
3835 FD_SET(fdRead
, &exceptfds
);
3836 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3837 ok(ret
== 1, "expected 1, got %d\n", ret
);
3838 ok(FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is not in the set\n");
3840 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3841 ok(ret
== 1, "expected 1, got %d\n", ret
);
3842 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3844 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
3846 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
3847 ok(ret
== 0, "expected 0, got %d\n", ret
);
3848 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3849 ok(ret
== 1, "expected 1, got %d\n", ret
);
3851 FD_SET_ALL(fdListen
);
3852 FD_SET(fdRead
, &readfds
);
3853 FD_SET(fdRead
, &exceptfds
);
3854 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3855 ok(ret
== 1, "expected 1, got %d\n", ret
);
3856 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3858 SetLastError(0xdeadbeef);
3859 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3860 if (ret
== SOCKET_ERROR
) /* can't recv with MSG_OOB if OOBINLINED */
3862 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %d\n", GetLastError());
3863 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3864 ok(ret
== 1, "expected 1, got %d\n", ret
);
3865 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3867 else ok(broken(ret
== 1) /* <= NT4 */, "expected error, got 1\n");
3869 /* When the connection is closed the socket is set in the read descriptor */
3870 ret
= closesocket(fdRead
);
3871 ok(ret
== 0, "expected 0, got %d\n", ret
);
3873 FD_SET_ALL(fdListen
);
3874 FD_SET(fdWrite
, &readfds
);
3875 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3876 ok(ret
== 1, "expected 1, got %d\n", ret
);
3877 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3878 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
3879 ok(ret
== 0, "expected 0, got %d\n", ret
);
3881 /* When a connection is attempted to a non-listening socket it will get to the except descriptor */
3882 ret
= closesocket(fdWrite
);
3883 ok(ret
== 0, "expected 0, got %d\n", ret
);
3884 ret
= closesocket(fdListen
);
3885 ok(ret
== 0, "expected 0, got %d\n", ret
);
3886 len
= sizeof(address
);
3887 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
3889 FD_SET(fdWrite
, &writefds
);
3890 FD_SET(fdWrite
, &exceptfds
);
3891 select_timeout
.tv_sec
= 2; /* requires more time to realize it will not connect */
3892 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3893 ok(ret
== 1, "expected 1, got %d\n", ret
);
3896 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
3897 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3898 ok(id
== WSAECONNREFUSED
, "expected 10061, got %d\n", id
);
3899 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3900 ok(select_timeout
.tv_usec
== 250000, "select timeout should not have changed\n");
3901 closesocket(fdWrite
);
3903 /* Try select() on a closed socket after connection */
3904 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3905 closesocket(fdRead
);
3907 FD_SET_ALL(fdWrite
);
3909 SetLastError(0xdeadbeef);
3910 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3911 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3913 ok(GetLastError() == WSAENOTSOCK
, "expected 10038, got %d\n", GetLastError());
3914 /* descriptor sets are unchanged */
3915 ok(readfds
.fd_count
== 2, "expected 2, got %d\n", readfds
.fd_count
);
3916 ok(exceptfds
.fd_count
== 2, "expected 2, got %d\n", exceptfds
.fd_count
);
3917 closesocket(fdWrite
);
3919 /* Close the socket currently being selected in a thread - bug 38399 */
3920 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3921 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3922 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3924 FD_SET_ALL(fdWrite
);
3925 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3926 ok(ret
== 1, "expected 1, got %d\n", ret
);
3927 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3928 WaitForSingleObject (thread_handle
, 1000);
3929 closesocket(fdRead
);
3930 /* test again with only the except descriptor */
3931 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3932 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3933 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3935 FD_SET(fdWrite
, &exceptfds
);
3936 SetLastError(0xdeadbeef);
3937 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
3939 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3941 ok(GetLastError() == WSAENOTSOCK
, "expected 10038, got %d\n", GetLastError());
3942 WaitForSingleObject (thread_handle
, 1000);
3943 closesocket(fdRead
);
3945 /* test UDP behavior of unbound sockets */
3946 select_timeout
.tv_sec
= 0;
3947 select_timeout
.tv_usec
= 250000;
3948 fdWrite
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
3949 ok(fdWrite
!= INVALID_SOCKET
, "socket call failed\n");
3951 FD_SET_ALL(fdWrite
);
3952 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3953 ok(ret
== 1, "expected 1, got %d\n", ret
);
3954 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3955 closesocket(fdWrite
);
3960 static DWORD WINAPI
AcceptKillThread(void *param
)
3962 select_thread_params
*par
= param
;
3963 struct sockaddr_in address
;
3964 int len
= sizeof(address
);
3965 SOCKET client_socket
;
3967 SetEvent(server_ready
);
3968 client_socket
= accept(par
->s
, (struct sockaddr
*) &address
, &len
);
3969 if (client_socket
!= INVALID_SOCKET
)
3970 closesocket(client_socket
);
3971 par
->ReadKilled
= (client_socket
== INVALID_SOCKET
);
3976 static int CALLBACK
AlwaysDeferConditionFunc(LPWSABUF lpCallerId
, LPWSABUF lpCallerData
, LPQOS pQos
,
3977 LPQOS lpGQOS
, LPWSABUF lpCalleeId
, LPWSABUF lpCalleeData
,
3978 GROUP
*g
, DWORD_PTR dwCallbackData
)
3983 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
)
3986 SOCKET server_socket
;
3988 server_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
3989 if (server_socket
== INVALID_SOCKET
)
3991 trace("error creating server socket: %d\n", WSAGetLastError());
3992 return INVALID_SOCKET
;
3996 ret
= setsockopt(server_socket
, SOL_SOCKET
, SO_REUSEADDR
, (char *)&val
, sizeof(val
));
3999 trace("error setting SO_REUSEADDR: %d\n", WSAGetLastError());
4000 closesocket(server_socket
);
4001 return INVALID_SOCKET
;
4004 ret
= bind(server_socket
, (struct sockaddr
*)addr
, *len
);
4007 trace("error binding server socket: %d\n", WSAGetLastError());
4010 ret
= getsockname(server_socket
, (struct sockaddr
*)addr
, len
);
4013 skip("failed to lookup bind address: %d\n", WSAGetLastError());
4014 closesocket(server_socket
);
4015 return INVALID_SOCKET
;
4018 ret
= listen(server_socket
, 5);
4021 trace("error making server socket listen: %d\n", WSAGetLastError());
4022 closesocket(server_socket
);
4023 return INVALID_SOCKET
;
4026 return server_socket
;
4029 static SOCKET
setup_connector_socket(struct sockaddr_in
*addr
, int len
, BOOL nonblock
)
4034 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
4035 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket %d\n", WSAGetLastError());
4038 set_blocking(connector
, !nonblock
);
4040 ret
= connect(connector
, (struct sockaddr
*)addr
, len
);
4042 ok(!ret
, "connecting to accepting socket failed %d\n", WSAGetLastError());
4043 else if (ret
== SOCKET_ERROR
)
4045 DWORD error
= WSAGetLastError();
4046 ok(error
== WSAEWOULDBLOCK
|| error
== WSAEINPROGRESS
,
4047 "expected 10035 or 10036, got %d\n", error
);
4053 static void test_accept(void)
4056 SOCKET server_socket
, accepted
= INVALID_SOCKET
, connector
;
4057 struct sockaddr_in address
;
4058 SOCKADDR_STORAGE ss
;
4060 select_thread_params thread_params
;
4061 HANDLE thread_handle
= NULL
;
4064 memset(&address
, 0, sizeof(address
));
4065 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
4066 address
.sin_family
= AF_INET
;
4068 socklen
= sizeof(address
);
4069 server_socket
= setup_server_socket(&address
, &socklen
);
4070 if (server_socket
== INVALID_SOCKET
)
4072 trace("error creating server socket: %d\n", WSAGetLastError());
4076 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4077 if (connector
== INVALID_SOCKET
) goto done
;
4079 trace("Blocking accept next\n");
4081 accepted
= WSAAccept(server_socket
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
4082 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
4084 accepted
= accept(server_socket
, NULL
, 0);
4085 ok(accepted
!= INVALID_SOCKET
, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4087 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
4088 if (server_ready
== INVALID_HANDLE_VALUE
)
4090 trace("error creating event: %d\n", GetLastError());
4094 thread_params
.s
= server_socket
;
4095 thread_params
.ReadKilled
= FALSE
;
4096 thread_handle
= CreateThread(NULL
, 0, AcceptKillThread
, &thread_params
, 0, &id
);
4097 if (thread_handle
== NULL
)
4099 trace("error creating thread: %d\n", GetLastError());
4103 WaitForSingleObject(server_ready
, INFINITE
);
4105 ret
= closesocket(server_socket
);
4108 trace("closesocket failed: %d\n", WSAGetLastError());
4112 WaitForSingleObject(thread_handle
, 1000);
4113 ok(thread_params
.ReadKilled
|| broken(!thread_params
.ReadKilled
) /* Win98/ME, after accept */,
4114 "closesocket did not wakeup accept\n");
4116 closesocket(accepted
);
4117 closesocket(connector
);
4118 accepted
= connector
= INVALID_SOCKET
;
4120 socklen
= sizeof(address
);
4121 server_socket
= setup_server_socket(&address
, &socklen
);
4122 if (server_socket
== INVALID_SOCKET
) goto done
;
4124 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4125 if (connector
== INVALID_SOCKET
) goto done
;
4128 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4129 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4130 ok(!socklen
, "got %d\n", socklen
);
4131 closesocket(connector
);
4132 connector
= INVALID_SOCKET
;
4134 socklen
= sizeof(address
);
4135 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4136 if (connector
== INVALID_SOCKET
) goto done
;
4138 accepted
= WSAAccept(server_socket
, NULL
, NULL
, NULL
, 0);
4139 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4140 closesocket(accepted
);
4141 closesocket(connector
);
4142 accepted
= connector
= INVALID_SOCKET
;
4144 socklen
= sizeof(address
);
4145 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4146 if (connector
== INVALID_SOCKET
) goto done
;
4148 socklen
= sizeof(ss
);
4149 memset(&ss
, 0, sizeof(ss
));
4150 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4151 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4152 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4153 ok(ss
.ss_family
, "family not set\n");
4154 closesocket(accepted
);
4155 closesocket(connector
);
4156 accepted
= connector
= INVALID_SOCKET
;
4158 socklen
= sizeof(address
);
4159 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4160 if (connector
== INVALID_SOCKET
) goto done
;
4163 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4164 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4165 ok(!socklen
, "got %d\n", socklen
);
4166 closesocket(connector
);
4167 accepted
= connector
= INVALID_SOCKET
;
4169 socklen
= sizeof(address
);
4170 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4171 if (connector
== INVALID_SOCKET
) goto done
;
4173 accepted
= accept(server_socket
, NULL
, NULL
);
4174 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4175 closesocket(accepted
);
4176 closesocket(connector
);
4177 accepted
= connector
= INVALID_SOCKET
;
4179 socklen
= sizeof(address
);
4180 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4181 if (connector
== INVALID_SOCKET
) goto done
;
4183 socklen
= sizeof(ss
);
4184 memset(&ss
, 0, sizeof(ss
));
4185 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4186 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4187 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4188 ok(ss
.ss_family
, "family not set\n");
4191 if (accepted
!= INVALID_SOCKET
)
4192 closesocket(accepted
);
4193 if (connector
!= INVALID_SOCKET
)
4194 closesocket(connector
);
4195 if (thread_handle
!= NULL
)
4196 CloseHandle(thread_handle
);
4197 if (server_ready
!= INVALID_HANDLE_VALUE
)
4198 CloseHandle(server_ready
);
4199 if (server_socket
!= INVALID_SOCKET
)
4200 closesocket(server_socket
);
4203 static void test_extendedSocketOptions(void)
4207 struct sockaddr_in sa
;
4208 int sa_len
= sizeof(struct sockaddr_in
);
4209 int optval
, optlen
= sizeof(int), ret
;
4213 if(WSAStartup(MAKEWORD(2,0), &wsa
)){
4214 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4218 memset(&sa
, 0, sa_len
);
4220 sa
.sin_family
= AF_INET
;
4221 sa
.sin_port
= htons(0);
4222 sa
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
4224 if((sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4225 trace("Creating the socket failed: %d\n", WSAGetLastError());
4230 if(bind(sock
, (struct sockaddr
*) &sa
, sa_len
) < 0){
4231 trace("Failed to bind socket: %d\n", WSAGetLastError());
4237 ret
= getsockopt(sock
, SOL_SOCKET
, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4239 ok(ret
== 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret
);
4240 ok((optval
== 65507) || (optval
== 65527),
4241 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval
);
4243 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
4244 SetLastError(0xdeadbeef);
4245 optval
= 0xdeadbeef;
4246 optlen
= sizeof(int);
4247 ret
= getsockopt(sock
, 0xffffffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4248 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4249 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4250 ret
, WSAGetLastError(), optval
, optval
);
4252 /* more invalid values for level */
4253 SetLastError(0xdeadbeef);
4254 optval
= 0xdeadbeef;
4255 optlen
= sizeof(int);
4256 ret
= getsockopt(sock
, 0x1234ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4257 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4258 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4259 ret
, WSAGetLastError(), optval
, optval
);
4261 SetLastError(0xdeadbeef);
4262 optval
= 0xdeadbeef;
4263 optlen
= sizeof(int);
4264 ret
= getsockopt(sock
, 0x8000ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4265 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4266 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4267 ret
, WSAGetLastError(), optval
, optval
);
4269 SetLastError(0xdeadbeef);
4270 optval
= 0xdeadbeef;
4271 optlen
= sizeof(int);
4272 ret
= getsockopt(sock
, 0x00008000, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4273 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4274 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4275 ret
, WSAGetLastError(), optval
, optval
);
4277 SetLastError(0xdeadbeef);
4278 optval
= 0xdeadbeef;
4279 optlen
= sizeof(int);
4280 ret
= getsockopt(sock
, 0x00000800, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4281 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4282 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4283 ret
, WSAGetLastError(), optval
, optval
);
4285 SetLastError(0xdeadbeef);
4286 optlen
= sizeof(LINGER
);
4287 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
4288 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOPROTOOPT
),
4289 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
4290 ret
, WSAGetLastError());
4293 if((sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4294 trace("Creating the socket failed: %d\n", WSAGetLastError());
4299 if(bind(sock
, (struct sockaddr
*) &sa
, sa_len
) < 0){
4300 trace("Failed to bind socket: %d\n", WSAGetLastError());
4306 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
4307 ok(ret
== 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret
);
4309 optlen
= sizeof(BOOL
);
4310 ret
= getsockopt(sock
, SOL_SOCKET
, SO_DONTLINGER
, (char *)&bool_opt_val
, &optlen
);
4311 ok(ret
== 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret
);
4312 ok((linger_val
.l_onoff
&& !bool_opt_val
) || (!linger_val
.l_onoff
&& bool_opt_val
),
4313 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
4314 bool_opt_val
, linger_val
.l_onoff
);
4320 static void test_getsockname(void)
4324 struct sockaddr_in sa_set
, sa_get
;
4325 int sa_set_len
= sizeof(struct sockaddr_in
);
4326 int sa_get_len
= sa_set_len
;
4327 static const unsigned char null_padding
[] = {0,0,0,0,0,0,0,0};
4331 if(WSAStartup(MAKEWORD(2,0), &wsa
)){
4332 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4336 memset(&sa_set
, 0, sa_set_len
);
4338 sa_set
.sin_family
= AF_INET
;
4339 sa_set
.sin_port
= htons(0);
4340 sa_set
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
4342 if((sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4343 trace("Creating the socket failed: %d\n", WSAGetLastError());
4349 if (getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
) == 0)
4350 ok(0, "getsockname on unbound socket should fail\n");
4352 ok(WSAGetLastError() == WSAEINVAL
, "getsockname on unbound socket "
4353 "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL
);
4354 ok(memcmp(&sa_get
, &sa_set
, sizeof(sa_get
)) == 0,
4355 "failed getsockname modified sockaddr when it shouldn't\n");
4358 if(bind(sock
, (struct sockaddr
*) &sa_set
, sa_set_len
) < 0){
4359 trace("Failed to bind socket: %d\n", WSAGetLastError());
4365 if(getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
) != 0){
4366 trace("Failed to call getsockname: %d\n", WSAGetLastError());
4372 ret
= memcmp(sa_get
.sin_zero
, null_padding
, 8);
4373 ok(ret
== 0 || broken(ret
!= 0), /* NT4 */
4374 "getsockname did not zero the sockaddr_in structure\n");
4378 h
= gethostbyname("");
4379 if (h
&& h
->h_length
== 4) /* this test is only meaningful in IPv4 */
4382 for (i
= 0; h
->h_addr_list
[i
]; i
++)
4386 ip
.s_addr
= *(ULONG
*) h
->h_addr_list
[i
];
4388 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
4389 ok(sock
!= INVALID_SOCKET
, "socket failed with %d\n", GetLastError());
4391 memset(&sa_set
, 0, sizeof(sa_set
));
4392 sa_set
.sin_family
= AF_INET
;
4393 sa_set
.sin_addr
.s_addr
= ip
.s_addr
;
4394 /* The same address we bind must be the same address we get */
4395 ret
= bind(sock
, (struct sockaddr
*)&sa_set
, sizeof(sa_set
));
4396 ok(ret
== 0, "bind failed with %d\n", GetLastError());
4397 sa_get_len
= sizeof(sa_get
);
4398 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
4399 ok(ret
== 0, "getsockname failed with %d\n", GetLastError());
4400 strcpy(ipstr
, inet_ntoa(sa_get
.sin_addr
));
4401 trace("testing bind on interface %s\n", ipstr
);
4402 ok(sa_get
.sin_addr
.s_addr
== sa_set
.sin_addr
.s_addr
,
4403 "address does not match: %s != %s\n", ipstr
, inet_ntoa(sa_set
.sin_addr
));
4412 static void test_dns(void)
4423 h
= gethostbyname("");
4424 ok(h
!= NULL
, "gethostbyname(\"\") failed with %d\n", h_errno
);
4426 /* Use an address with valid alias names if possible */
4427 h
= gethostbyname("source.winehq.org");
4430 skip("Can't test the hostent structure because gethostbyname failed\n");
4434 /* The returned struct must be allocated in a very strict way. First we need to
4435 * count how many aliases there are because they must be located right after
4436 * the struct hostent size. Knowing the amount of aliases we know the exact
4437 * location of the first IP returned. Rule valid for >= XP, for older OS's
4438 * it's somewhat the opposite. */
4440 if(h
->h_addr_list
== addr
.mem
) /* <= W2K */
4442 win_skip("Skipping hostent tests since this OS is unsupported\n");
4446 ok(h
->h_aliases
== addr
.mem
,
4447 "hostent->h_aliases should be in %p, it is in %p\n", addr
.mem
, h
->h_aliases
);
4449 for(ptr
= h
->h_aliases
, acount
= 1; *ptr
; ptr
++) acount
++;
4450 addr
.chr
+= sizeof(*ptr
) * acount
;
4451 ok(h
->h_addr_list
== addr
.mem
,
4452 "hostent->h_addr_list should be in %p, it is in %p\n", addr
.mem
, h
->h_addr_list
);
4454 for(ptr
= h
->h_addr_list
, acount
= 1; *ptr
; ptr
++) acount
++;
4456 addr
.chr
+= sizeof(*ptr
) * acount
;
4457 ok(h
->h_addr_list
[0] == addr
.mem
,
4458 "hostent->h_addr_list[0] should be in %p, it is in %p\n", addr
.mem
, h
->h_addr_list
[0]);
4461 /* Our winsock headers don't define gethostname because it conflicts with the
4462 * definition in unistd.h. Define it here to get rid of the warning. */
4464 int WINAPI
gethostname(char *name
, int namelen
);
4466 static void test_gethostbyname(void)
4469 struct in_addr
**addr_list
;
4470 char name
[256], first_ip
[16];
4472 PMIB_IPFORWARDTABLE routes
= NULL
;
4473 PIP_ADAPTER_INFO adapters
= NULL
, k
;
4474 DWORD adap_size
= 0, route_size
= 0;
4475 BOOL found_default
= FALSE
;
4476 BOOL local_ip
= FALSE
;
4478 ret
= gethostname(name
, sizeof(name
));
4479 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4481 he
= gethostbyname(name
);
4482 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4483 addr_list
= (struct in_addr
**)he
->h_addr_list
;
4484 strcpy(first_ip
, inet_ntoa(*addr_list
[0]));
4486 trace("List of local IPs:\n");
4487 for(count
= 0; addr_list
[count
] != NULL
; count
++)
4489 char *ip
= inet_ntoa(*addr_list
[count
]);
4490 if (!strcmp(ip
, "127.0.0.1"))
4497 ok (count
== 1, "expected 127.0.0.1 to be the only IP returned\n");
4498 skip("Only the loopback address is present, skipping tests\n");
4502 if (!pGetAdaptersInfo
|| !pGetIpForwardTable
)
4504 win_skip("GetAdaptersInfo and/or GetIpForwardTable not found, skipping tests\n");
4508 ret
= pGetAdaptersInfo(NULL
, &adap_size
);
4509 ok (ret
== ERROR_BUFFER_OVERFLOW
, "GetAdaptersInfo failed with a different error: %d\n", ret
);
4510 ret
= pGetIpForwardTable(NULL
, &route_size
, FALSE
);
4511 ok (ret
== ERROR_INSUFFICIENT_BUFFER
, "GetIpForwardTable failed with a different error: %d\n", ret
);
4513 adapters
= HeapAlloc(GetProcessHeap(), 0, adap_size
);
4514 routes
= HeapAlloc(GetProcessHeap(), 0, route_size
);
4516 ret
= pGetAdaptersInfo(adapters
, &adap_size
);
4517 ok (ret
== NO_ERROR
, "GetAdaptersInfo failed, error: %d\n", ret
);
4518 ret
= pGetIpForwardTable(routes
, &route_size
, FALSE
);
4519 ok (ret
== NO_ERROR
, "GetIpForwardTable failed, error: %d\n", ret
);
4521 /* This test only has meaning if there is more than one IP configured */
4522 if (adapters
->Next
== NULL
&& count
== 1)
4524 skip("Only one IP is present, skipping tests\n");
4528 for (i
= 0; !found_default
&& i
< routes
->dwNumEntries
; i
++)
4530 /* default route (ip 0.0.0.0) ? */
4531 if (routes
->table
[i
].dwForwardDest
) continue;
4533 for (k
= adapters
; k
!= NULL
; k
= k
->Next
)
4537 if (k
->Index
!= routes
->table
[i
].dwForwardIfIndex
) continue;
4539 /* the first IP returned from gethostbyname must be a default route */
4540 ip
= k
->IpAddressList
.IpAddress
.String
;
4541 if (!strcmp(first_ip
, ip
))
4543 found_default
= TRUE
;
4549 ok (found_default
, "failed to find the first IP from gethostbyname!\n");
4552 HeapFree(GetProcessHeap(), 0, adapters
);
4553 HeapFree(GetProcessHeap(), 0, routes
);
4556 static void test_gethostbyname_hack(void)
4560 static BYTE loopback
[] = {127, 0, 0, 1};
4561 static BYTE magic_loopback
[] = {127, 12, 34, 56};
4564 ret
= gethostname(name
, 256);
4565 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4567 he
= gethostbyname("localhost");
4568 ok(he
!= NULL
, "gethostbyname(\"localhost\") failed: %d\n", h_errno
);
4571 if(he
->h_length
!= 4)
4573 skip("h_length is %d, not IPv4, skipping test.\n", he
->h_length
);
4577 ok(memcmp(he
->h_addr_list
[0], loopback
, he
->h_length
) == 0,
4578 "gethostbyname(\"localhost\") returned %d.%d.%d.%d\n",
4579 he
->h_addr_list
[0][0], he
->h_addr_list
[0][1], he
->h_addr_list
[0][2],
4580 he
->h_addr_list
[0][3]);
4583 if(strcmp(name
, "localhost") == 0)
4585 skip("hostname seems to be \"localhost\", skipping test.\n");
4589 he
= gethostbyname(name
);
4590 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, h_errno
);
4593 if(he
->h_length
!= 4)
4595 skip("h_length is %d, not IPv4, skipping test.\n", he
->h_length
);
4599 if (he
->h_addr_list
[0][0] == 127)
4601 ok(memcmp(he
->h_addr_list
[0], magic_loopback
, he
->h_length
) == 0,
4602 "gethostbyname(\"%s\") returned %d.%d.%d.%d not 127.12.34.56\n",
4603 name
, he
->h_addr_list
[0][0], he
->h_addr_list
[0][1],
4604 he
->h_addr_list
[0][2], he
->h_addr_list
[0][3]);
4608 gethostbyname("nonexistent.winehq.org");
4609 /* Don't check for the return value, as some braindead ISPs will kindly
4610 * resolve nonexistent host names to addresses of the ISP's spam pages. */
4613 static void test_gethostname(void)
4619 WSASetLastError(0xdeadbeef);
4620 ret
= gethostname(NULL
, 256);
4621 ok(ret
== -1, "gethostname() returned %d\n", ret
);
4622 ok(WSAGetLastError() == WSAEFAULT
, "gethostname with null buffer "
4623 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT
);
4625 ret
= gethostname(name
, sizeof(name
));
4626 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4627 he
= gethostbyname(name
);
4628 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4631 WSASetLastError(0xdeadbeef);
4632 strcpy(name
, "deadbeef");
4633 ret
= gethostname(name
, len
);
4634 ok(ret
== -1, "gethostname() returned %d\n", ret
);
4635 ok(!strcmp(name
, "deadbeef"), "name changed unexpected!\n");
4636 ok(WSAGetLastError() == WSAEFAULT
, "gethostname with insufficient length "
4637 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT
);
4640 ret
= gethostname(name
, len
);
4641 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4642 he
= gethostbyname(name
);
4643 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4646 static void test_inet_addr(void)
4650 addr
= inet_addr(NULL
);
4651 ok(addr
== INADDR_NONE
, "inet_addr succeeded unexpectedly\n");
4654 static void test_addr_to_print(void)
4660 struct in6_addr in6
;
4662 u_long addr0_Num
= 0x00000000;
4663 PCSTR addr0_Str
= "0.0.0.0";
4664 u_long addr1_Num
= 0x20201015;
4665 PCSTR addr1_Str
= "21.16.32.32";
4666 u_char addr2_Num
[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74};
4667 PCSTR addr2_Str
= "::fffe:cc98:bd74";
4668 u_char addr3_Num
[16] = {0x20,0x30,0xa4,0xb1};
4669 PCSTR addr3_Str
= "2030:a4b1::";
4670 u_char addr4_Num
[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0xcC,0x98,0xbd,0x74};
4671 PCSTR addr4_Str
= "::204.152.189.116";
4673 /* Test IPv4 addresses */
4674 in
.s_addr
= addr0_Num
;
4676 pdst
= inet_ntoa(*((struct in_addr
*)&in
.s_addr
));
4677 ok(pdst
!= NULL
, "inet_ntoa failed %s\n", dst
);
4678 ok(!strcmp(pdst
, addr0_Str
),"Address %s != %s\n", pdst
, addr0_Str
);
4680 /* Test that inet_ntoa and inet_ntop return the same value */
4681 in
.S_un
.S_addr
= addr1_Num
;
4682 pdst
= inet_ntoa(*((struct in_addr
*)&in
.s_addr
));
4683 ok(pdst
!= NULL
, "inet_ntoa failed %s\n", dst
);
4684 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4686 /* InetNtop became available in Vista and Win2008 */
4689 win_skip("InetNtop not present, not executing tests\n");
4693 /* Second part of test */
4694 pdst
= pInetNtop(AF_INET
,(void*)&in
.s_addr
, dst
, sizeof(dst
));
4695 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst
);
4696 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4698 /* Test invalid parm conditions */
4699 pdst
= pInetNtop(1, (void*)&in
.s_addr
, dst
, sizeof(dst
));
4700 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4701 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "Should be WSAEAFNOSUPPORT\n");
4703 /* Test Null destination */
4705 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, NULL
, sizeof(dst
));
4706 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4707 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4708 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4710 /* Test zero length passed */
4713 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, 0);
4714 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4715 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4716 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4718 /* Test length one shorter than the address length */
4721 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, 6);
4722 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4723 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4724 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4726 /* Test longer length is ok */
4729 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, sizeof(dst
)+1);
4730 ok(pdst
!= NULL
, "The pointer should be returned (%p)\n", pdst
);
4731 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4733 /* Test the IPv6 addresses */
4735 /* Test an zero prefixed IPV6 address */
4736 memcpy(in6
.u
.Byte
, addr2_Num
, sizeof(addr2_Num
));
4737 pdst
= pInetNtop(AF_INET6
,(void*)&in6
.s6_addr
, dst6
, sizeof(dst6
));
4738 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst6
);
4739 ok(!strcmp(pdst
, addr2_Str
),"Address %s != %s\n", pdst
, addr2_Str
);
4741 /* Test an zero suffixed IPV6 address */
4742 memcpy(in6
.s6_addr
, addr3_Num
, sizeof(addr3_Num
));
4743 pdst
= pInetNtop(AF_INET6
,(void*)&in6
.s6_addr
, dst6
, sizeof(dst6
));
4744 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst6
);
4745 ok(!strcmp(pdst
, addr3_Str
),"Address %s != %s\n", pdst
, addr3_Str
);
4747 /* Test the IPv6 address contains the IPv4 address in IPv4 notation */
4748 memcpy(in6
.s6_addr
, addr4_Num
, sizeof(addr4_Num
));
4749 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, sizeof(dst6
));
4750 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst6
);
4751 ok(!strcmp(pdst
, addr4_Str
),"Address %s != %s\n", pdst
, addr4_Str
);
4753 /* Test invalid parm conditions */
4754 memcpy(in6
.u
.Byte
, addr2_Num
, sizeof(addr2_Num
));
4756 /* Test Null destination */
4758 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, NULL
, sizeof(dst6
));
4759 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4760 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4761 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4763 /* Test zero length passed */
4766 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 0);
4767 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4768 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4769 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4771 /* Test length one shorter than the address length */
4774 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 16);
4775 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4776 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4777 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4779 /* Test longer length is ok */
4782 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 18);
4783 ok(pdst
!= NULL
, "The pointer should be returned (%p)\n", pdst
);
4785 static void test_inet_pton(void)
4791 const char *printable
, *collapsed
, *raw_data
;
4793 {AF_UNSPEC
, -1, WSAEFAULT
, /* Test 0 */
4795 {AF_INET
, -1, WSAEFAULT
,
4797 {AF_INET6
, -1, WSAEFAULT
,
4799 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4800 "127.0.0.1", NULL
, NULL
},
4802 "127.0.0.1", "127.0.0.1",
4803 "\x7f\x00\x00\x01"},
4805 "127.0.0.1", "127.0.0.1", NULL
},
4807 "::1/128", NULL
, NULL
},
4809 "::1/128", NULL
, NULL
},
4810 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4811 "broken", NULL
, NULL
},
4813 "broken", NULL
, NULL
},
4814 {AF_INET6
, 0, 0, /* Test 10 */
4815 "broken", NULL
, NULL
},
4816 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4817 "177.32.45.20", NULL
, NULL
},
4819 "177.32.45.20", "177.32.45.20",
4820 "\xb1\x20\x2d\x14"},
4822 "177.32.45.20", NULL
, NULL
},
4824 "2607:f0d0:1002:51::4", NULL
, NULL
},
4826 "2607:f0d0:1002:51::4", "2607:f0d0:1002:51::4",
4827 "\x26\x07\xf0\xd0\x10\x02\x00\x51\x00\x00\x00\x00\x00\x00\x00\x04"},
4829 "::177.32.45.20", NULL
, NULL
},
4831 "::177.32.45.20", "::177.32.45.20",
4832 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x20\x2d\x14"},
4834 "fe80::0202:b3ff:fe1e:8329", NULL
, NULL
},
4836 "fe80::0202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
4837 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
4838 {AF_INET6
, 1, 0, /* Test 20 */
4839 "fe80::202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
4840 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
4846 "a.b.c", NULL
, NULL
},
4848 "a.b.c.d", NULL
, NULL
},
4850 "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba::3257:9652",
4851 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
4853 "2001:cdba::3257:9652", "2001:cdba::3257:9652",
4854 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
4856 "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652",
4857 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}
4861 char buffer
[64],str
[64];
4862 WCHAR printableW
[64];
4865 /* InetNtop and InetPton became available in Vista and Win2008 */
4866 if (!pInetNtop
|| !pInetPtonA
|| !pInetPtonW
)
4868 win_skip("InetNtop and/or InetPton not present, not executing tests\n");
4872 for (i
= 0; i
< sizeof(tests
) / sizeof(tests
[0]); i
++)
4874 WSASetLastError(0xdeadbeef);
4875 ret
= pInetPtonA(tests
[i
].family
, tests
[i
].printable
, buffer
);
4876 ok (ret
== tests
[i
].ret
, "Test [%d]: Expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
4877 if (tests
[i
].ret
== -1)
4879 err
= WSAGetLastError();
4880 ok (tests
[i
].err
== err
, "Test [%d]: Expected 0x%x, got 0x%x\n", i
, tests
[i
].err
, err
);
4882 if (tests
[i
].ret
!= 1) continue;
4883 ok (memcmp(buffer
, tests
[i
].raw_data
,
4884 tests
[i
].family
== AF_INET
? sizeof(struct in_addr
) : sizeof(struct in6_addr
)) == 0,
4885 "Test [%d]: Expected binary data differs\n", i
);
4887 /* Test the result from Pton with Ntop */
4888 strcpy (str
, "deadbeef");
4889 ptr
= pInetNtop(tests
[i
].family
, buffer
, str
, sizeof(str
));
4890 ok (ptr
!= NULL
, "Test [%d]: Failed with NULL\n", i
);
4891 ok (ptr
== str
, "Test [%d]: Pointers differ (%p != %p)\n", i
, ptr
, str
);
4893 ok (strcmp(ptr
, tests
[i
].collapsed
) == 0, "Test [%d]: Expected '%s', got '%s'\n",
4894 i
, tests
[i
].collapsed
, ptr
);
4897 for (i
= 0; i
< sizeof(tests
) / sizeof(tests
[0]); i
++)
4899 if (tests
[i
].printable
)
4900 MultiByteToWideChar(CP_ACP
, 0, tests
[i
].printable
, -1, printableW
,
4901 sizeof(printableW
) / sizeof(printableW
[0]));
4902 WSASetLastError(0xdeadbeef);
4903 ret
= pInetPtonW(tests
[i
].family
, tests
[i
].printable
? printableW
: NULL
, buffer
);
4904 ok(ret
== tests
[i
].ret
, "Test [%d]: Expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
4905 if (tests
[i
].ret
== -1)
4907 err
= WSAGetLastError();
4908 ok(tests
[i
].err
== err
, "Test [%d]: Expected 0x%x, got 0x%x\n", i
, tests
[i
].err
, err
);
4910 if (tests
[i
].ret
!= 1) continue;
4911 ok(memcmp(buffer
, tests
[i
].raw_data
,
4912 tests
[i
].family
== AF_INET
? sizeof(struct in_addr
) : sizeof(struct in6_addr
)) == 0,
4913 "Test [%d]: Expected binary data differs\n", i
);
4917 static void test_ioctlsocket(void)
4919 SOCKET sock
, src
, dst
;
4920 struct tcp_keepalive kalive
;
4922 static const LONG cmds
[] = {FIONBIO
, FIONREAD
, SIOCATMARK
};
4928 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4929 ok(sock
!= INVALID_SOCKET
, "Creating the socket failed: %d\n", WSAGetLastError());
4930 if(sock
== INVALID_SOCKET
)
4932 skip("Can't continue without a socket.\n");
4936 for(i
= 0; i
< sizeof(cmds
)/sizeof(cmds
[0]); i
++)
4938 /* broken apps like defcon pass the argp value directly instead of a pointer to it */
4939 ret
= ioctlsocket(sock
, cmds
[i
], (u_long
*)1);
4940 ok(ret
== SOCKET_ERROR
, "ioctlsocket succeeded unexpectedly\n");
4941 ret
= WSAGetLastError();
4942 ok(ret
== WSAEFAULT
, "expected WSAEFAULT, got %d instead\n", ret
);
4945 /* A fresh and not connected socket has no urgent data, this test shows
4946 * that normal(not urgent) data returns a non-zero value for SIOCATMARK. */
4948 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4949 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4950 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4952 /* when SO_OOBINLINE is set SIOCATMARK must always return TRUE */
4954 ret
= setsockopt(sock
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
4955 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
4957 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4958 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4959 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4961 /* disable SO_OOBINLINE and get the same old behavior */
4963 ret
= setsockopt(sock
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
4964 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
4966 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4967 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4968 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4970 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &arg
, 0, NULL
, 0, &arg
, NULL
, NULL
);
4971 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4972 ret
= WSAGetLastError();
4973 ok(ret
== WSAEFAULT
|| broken(ret
== WSAEINVAL
), "expected WSAEFAULT, got %d instead\n", ret
);
4975 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, NULL
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4976 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4977 ret
= WSAGetLastError();
4978 ok(ret
== WSAEFAULT
|| broken(ret
== WSAEINVAL
), "expected WSAEFAULT, got %d instead\n", ret
);
4980 /* broken used to catch W95, W98, NT4 */
4981 make_keepalive(kalive
, 0, 0, 0);
4982 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4983 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
4985 make_keepalive(kalive
, 1, 0, 0);
4986 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4987 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
4989 make_keepalive(kalive
, 1, 1000, 1000);
4990 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4991 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
4993 make_keepalive(kalive
, 1, 10000, 10000);
4994 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4995 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
4997 make_keepalive(kalive
, 1, 100, 100);
4998 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
4999 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5001 make_keepalive(kalive
, 0, 100, 100);
5002 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5003 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5007 if (tcp_socketpair(&src
, &dst
) != 0)
5009 ok(0, "creating socket pair failed, skipping test\n");
5013 /* test FIONREAD on TCP sockets */
5014 optval
= 0xdeadbeef;
5015 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5016 ok(ret
== 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5017 ok(optval
== 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval
);
5019 optval
= 0xdeadbeef;
5020 ok(send(src
, "TEST", 4, 0) == 4, "failed to send test data\n");
5022 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5023 ok(ret
== 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5024 ok(optval
== 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval
);
5026 /* trying to read from an OOB inlined socket with MSG_OOB results in WSAEINVAL */
5027 set_blocking(dst
, FALSE
);
5029 SetLastError(0xdeadbeef);
5030 ret
= recv(dst
, &data
, 1, i
);
5031 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5032 ret
= GetLastError();
5033 ok(ret
== WSAEWOULDBLOCK
, "expected 10035, got %d\n", ret
);
5034 bufs
.len
= sizeof(char);
5036 ret
= WSARecv(dst
, &bufs
, 1, &bytes_rec
, &i
, NULL
, NULL
);
5037 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5038 ret
= GetLastError();
5039 ok(ret
== WSAEWOULDBLOCK
, "expected 10035, got %d\n", ret
);
5041 ret
= setsockopt(dst
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
5042 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
5044 SetLastError(0xdeadbeef);
5045 ret
= recv(dst
, &data
, 1, i
);
5046 if (ret
== SOCKET_ERROR
)
5048 ret
= GetLastError();
5049 ok(ret
== WSAEINVAL
, "expected 10022, got %d\n", ret
);
5050 bufs
.len
= sizeof(char);
5052 ret
= WSARecv(dst
, &bufs
, 1, &bytes_rec
, &i
, NULL
, NULL
);
5053 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5054 ret
= GetLastError();
5055 ok(ret
== WSAEINVAL
, "expected 10022, got %d\n", ret
);
5057 else ok(broken(ret
== 1) /* <= NT4 */, "expected error, got 1\n");
5060 optval
= 0xdeadbeef;
5061 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5062 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5063 ok(optval
== 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval
);
5067 static BOOL drain_pause
= FALSE
;
5068 static DWORD WINAPI
drain_socket_thread(LPVOID arg
)
5071 SOCKET sock
= *(SOCKET
*)arg
;
5074 while ((ret
= recv(sock
, buffer
, sizeof(buffer
), 0)) != 0)
5078 if (WSAGetLastError() == WSAEWOULDBLOCK
)
5082 FD_SET(sock
, &readset
);
5083 select(sock
+1, &readset
, NULL
, NULL
, NULL
);
5094 static void test_send(void)
5096 SOCKET src
= INVALID_SOCKET
;
5097 SOCKET dst
= INVALID_SOCKET
;
5098 HANDLE hThread
= NULL
;
5099 const int buflen
= 1024*1024;
5100 char *buffer
= NULL
;
5101 int ret
, i
, zero
= 0;
5105 DWORD id
, bytes_sent
, dwRet
;
5107 memset(&ov
, 0, sizeof(ov
));
5109 if (tcp_socketpair(&src
, &dst
) != 0)
5111 ok(0, "creating socket pair failed, skipping test\n");
5115 set_blocking(dst
, FALSE
);
5116 /* force disable buffering so we can get a pending overlapped request */
5117 ret
= setsockopt(dst
, SOL_SOCKET
, SO_SNDBUF
, (char *) &zero
, sizeof(zero
));
5118 ok(!ret
, "setsockopt SO_SNDBUF failed: %d - %d\n", ret
, GetLastError());
5120 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
5121 if (hThread
== NULL
)
5123 ok(0, "CreateThread failed, error %d\n", GetLastError());
5127 buffer
= HeapAlloc(GetProcessHeap(), 0, buflen
);
5130 ok(0, "HeapAlloc failed, error %d\n", GetLastError());
5134 /* fill the buffer with some nonsense */
5135 for (i
= 0; i
< buflen
; ++i
)
5137 buffer
[i
] = (char) i
;
5140 ret
= send(src
, buffer
, buflen
, 0);
5142 ok(ret
== buflen
, "send should have sent %d bytes, but it only sent %d\n", buflen
, ret
);
5144 ok(0, "send failed, error %d\n", WSAGetLastError());
5149 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5150 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
5155 WSASetLastError(12345);
5156 ret
= WSASend(dst
, &buf
, 1, &bytes_sent
, 0, &ov
, NULL
);
5157 ok((ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
) || broken(bytes_sent
== buflen
),
5158 "Failed to start overlapped send %d - %d - %d/%d\n", ret
, WSAGetLastError(), bytes_sent
, buflen
);
5160 /* don't check for completion yet, we may need to drain the buffer while still sending */
5161 set_blocking(src
, FALSE
);
5162 for (i
= 0; i
< buflen
; ++i
)
5166 ret
= recv(src
, buffer
, 1, 0);
5167 while (ret
== SOCKET_ERROR
&& GetLastError() == WSAEWOULDBLOCK
&& j
< 100)
5171 ret
= recv(src
, buffer
, 1, 0);
5174 ok(ret
== 1, "Failed to receive data %d - %d (got %d/%d)\n", ret
, GetLastError(), i
, buflen
);
5178 ok(buffer
[0] == (char) i
, "Received bad data at position %d\n", i
);
5181 dwRet
= WaitForSingleObject(ov
.hEvent
, 1000);
5182 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5183 if (dwRet
== WAIT_OBJECT_0
)
5185 bret
= GetOverlappedResult((HANDLE
)dst
, &ov
, &bytes_sent
, FALSE
);
5186 ok((bret
&& bytes_sent
== buflen
) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5187 "Got %d instead of %d (%d - %d)\n", bytes_sent
, buflen
, bret
, GetLastError());
5190 WSASetLastError(12345);
5191 ret
= WSASend(INVALID_SOCKET
, &buf
, 1, NULL
, 0, &ov
, NULL
);
5192 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
5193 "WSASend failed %d - %d\n", ret
, WSAGetLastError());
5195 WSASetLastError(12345);
5196 ret
= WSASend(dst
, &buf
, 1, NULL
, 0, &ov
, NULL
);
5197 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
,
5198 "Failed to start overlapped send %d - %d\n", ret
, WSAGetLastError());
5201 if (src
!= INVALID_SOCKET
)
5203 if (dst
!= INVALID_SOCKET
)
5205 if (hThread
!= NULL
)
5207 dwRet
= WaitForSingleObject(hThread
, 500);
5208 ok(dwRet
== WAIT_OBJECT_0
, "failed to wait for thread termination: %d\n", GetLastError());
5209 CloseHandle(hThread
);
5212 CloseHandle(ov
.hEvent
);
5213 HeapFree(GetProcessHeap(), 0, buffer
);
5216 typedef struct async_message
5220 struct async_message
*next
;
5223 static struct async_message
*messages_received
;
5225 #define WM_SOCKET (WM_USER+100)
5226 static LRESULT CALLBACK
ws2_test_WndProc(HWND hwnd
, UINT msg
, WPARAM wparam
, LPARAM lparam
)
5228 struct async_message
*message
;
5233 message
= HeapAlloc(GetProcessHeap(), 0, sizeof(*message
));
5234 message
->socket
= (SOCKET
) wparam
;
5235 message
->lparam
= lparam
;
5236 message
->next
= NULL
;
5238 if (messages_received
)
5240 struct async_message
*last
= messages_received
;
5241 while (last
->next
) last
= last
->next
;
5242 last
->next
= message
;
5245 messages_received
= message
;
5249 return DefWindowProcA(hwnd
, msg
, wparam
, lparam
);
5252 static void get_event_details(int event
, int *bit
, char *name
)
5257 if (bit
) *bit
= FD_ACCEPT_BIT
;
5258 if (name
) strcpy(name
, "FD_ACCEPT");
5261 if (bit
) *bit
= FD_CONNECT_BIT
;
5262 if (name
) strcpy(name
, "FD_CONNECT");
5265 if (bit
) *bit
= FD_READ_BIT
;
5266 if (name
) strcpy(name
, "FD_READ");
5269 if (bit
) *bit
= FD_OOB_BIT
;
5270 if (name
) strcpy(name
, "FD_OOB");
5273 if (bit
) *bit
= FD_WRITE_BIT
;
5274 if (name
) strcpy(name
, "FD_WRITE");
5277 if (bit
) *bit
= FD_CLOSE_BIT
;
5278 if (name
) strcpy(name
, "FD_CLOSE");
5282 if (name
) sprintf(name
, "bad%x", event
);
5286 static const char *dbgstr_event_seq(const LPARAM
*seq
)
5288 static char message
[1024];
5296 get_event_details(WSAGETSELECTEVENT(*seq
), NULL
, name
);
5297 len
+= sprintf(message
+ len
, "%s(%d) ", name
, WSAGETSELECTERROR(*seq
));
5301 strcpy( message
+ len
, "]" );
5305 static char *dbgstr_event_seq_result(SOCKET s
, WSANETWORKEVENTS
*netEvents
)
5307 static char message
[1024];
5308 struct async_message
*curr
= messages_received
;
5309 int index
, error
, bit
= 0;
5319 if (bit
>= FD_MAX_EVENTS
) break;
5320 if ( !(netEvents
->lNetworkEvents
& (1 << bit
)) )
5325 get_event_details(1 << bit
, &index
, name
);
5326 error
= netEvents
->iErrorCode
[index
];
5332 if (curr
->socket
!= s
)
5337 get_event_details(WSAGETSELECTEVENT(curr
->lparam
), NULL
, name
);
5338 error
= WSAGETSELECTERROR(curr
->lparam
);
5342 len
+= sprintf(message
+ len
, "%s(%d) ", name
, error
);
5345 strcpy( message
+ len
, "]" );
5349 static void flush_events(SOCKET s
, HANDLE hEvent
)
5351 WSANETWORKEVENTS netEvents
;
5352 struct async_message
*prev
= NULL
, *curr
= messages_received
;
5356 if (hEvent
!= INVALID_HANDLE_VALUE
)
5358 dwRet
= WaitForSingleObject(hEvent
, 100);
5359 if (dwRet
== WAIT_OBJECT_0
)
5361 ret
= WSAEnumNetworkEvents(s
, hEvent
, &netEvents
);
5363 ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret
);
5370 if (curr
->socket
== s
)
5372 if (prev
) prev
->next
= curr
->next
;
5373 else messages_received
= curr
->next
;
5375 HeapFree(GetProcessHeap(), 0, curr
);
5377 if (prev
) curr
= prev
->next
;
5378 else curr
= messages_received
;
5389 static int match_event_sequence(SOCKET s
, WSANETWORKEVENTS
*netEvents
, const LPARAM
*seq
)
5391 int event
, index
, error
, events
;
5392 struct async_message
*curr
;
5396 events
= netEvents
->lNetworkEvents
;
5399 event
= WSAGETSELECTEVENT(*seq
);
5400 error
= WSAGETSELECTERROR(*seq
);
5401 get_event_details(event
, &index
, NULL
);
5403 if (!(events
& event
) && index
!= -1)
5405 if (events
& event
&& index
!= -1)
5407 if (netEvents
->iErrorCode
[index
] != error
)
5418 curr
= messages_received
;
5421 if (curr
->socket
== s
)
5423 if (!*seq
) return 0;
5424 if (*seq
!= curr
->lparam
) return 0;
5435 /* checks for a sequence of events, (order only checked if window is used) */
5436 static void ok_event_sequence(SOCKET s
, HANDLE hEvent
, const LPARAM
*seq
, const LPARAM
**broken_seqs
, int completelyBroken
)
5439 WSANETWORKEVENTS events
, *netEvents
= NULL
;
5443 if (hEvent
!= INVALID_HANDLE_VALUE
)
5445 netEvents
= &events
;
5447 dwRet
= WaitForSingleObject(hEvent
, 200);
5448 if (dwRet
== WAIT_OBJECT_0
)
5450 ret
= WSAEnumNetworkEvents(s
, hEvent
, netEvents
);
5453 winetest_ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret
);
5458 memset(netEvents
, 0, sizeof(*netEvents
));
5463 /* Run the message loop a little */
5464 while (PeekMessageA( &msg
, 0, 0, 0, PM_REMOVE
))
5466 DispatchMessageA(&msg
);
5470 if (match_event_sequence(s
, netEvents
, seq
))
5472 winetest_ok(1, "Sequence matches expected: %s\n", dbgstr_event_seq(seq
));
5473 flush_events(s
, hEvent
);
5479 for (; *broken_seqs
; broken_seqs
++)
5481 if (match_event_sequence(s
, netEvents
, *broken_seqs
))
5483 winetest_ok(broken(1), "Sequence matches broken: %s, expected %s\n", dbgstr_event_seq_result(s
, netEvents
), dbgstr_event_seq(seq
));
5484 flush_events(s
, hEvent
);
5490 winetest_ok(broken(completelyBroken
), "Expected event sequence %s, got %s\n", dbgstr_event_seq(seq
),
5491 dbgstr_event_seq_result(s
, netEvents
));
5492 flush_events(s
, hEvent
);
5495 #define ok_event_seq (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence
5497 static void test_events(int useMessages
)
5499 SOCKET server
= INVALID_SOCKET
;
5500 SOCKET src
= INVALID_SOCKET
, src2
= INVALID_SOCKET
;
5501 SOCKET dst
= INVALID_SOCKET
, dst2
= INVALID_SOCKET
;
5502 struct sockaddr_in addr
;
5503 HANDLE hThread
= NULL
;
5504 HANDLE hEvent
= INVALID_HANDLE_VALUE
, hEvent2
= INVALID_HANDLE_VALUE
;
5505 WNDCLASSEXA wndclass
;
5507 char *buffer
= NULL
;
5508 int bufferSize
= 1024*1024;
5512 DWORD bytesReturned
;
5518 static char szClassName
[] = "wstestclass";
5519 const LPARAM
*broken_seq
[3];
5520 static const LPARAM empty_seq
[] = { 0 };
5521 static const LPARAM close_seq
[] = { WSAMAKESELECTREPLY(FD_CLOSE
, 0), 0 };
5522 static const LPARAM write_seq
[] = { WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5523 static const LPARAM read_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0), 0 };
5524 static const LPARAM oob_seq
[] = { WSAMAKESELECTREPLY(FD_OOB
, 0), 0 };
5525 static const LPARAM connect_seq
[] = { WSAMAKESELECTREPLY(FD_CONNECT
, 0),
5526 WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5527 static const LPARAM read_read_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5528 WSAMAKESELECTREPLY(FD_READ
, 0), 0 };
5529 static const LPARAM read_write_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5530 WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5531 static const LPARAM read_close_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5532 WSAMAKESELECTREPLY(FD_CLOSE
, 0), 0 };
5534 memset(&ov
, 0, sizeof(ov
));
5535 memset(&ov2
, 0, sizeof(ov2
));
5537 /* don't use socketpair, we want connection event */
5538 src
= socket(AF_INET
, SOCK_STREAM
, 0);
5539 if (src
== INVALID_SOCKET
)
5541 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5545 ret
= set_blocking(src
, TRUE
);
5546 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
5548 src2
= socket(AF_INET
, SOCK_STREAM
, 0);
5549 if (src2
== INVALID_SOCKET
)
5551 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5555 ret
= set_blocking(src2
, TRUE
);
5556 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
5559 if (getsockopt(src
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&bret
, &len
) == SOCKET_ERROR
)
5561 ok(0, "failed to get oobinline status, %d\n", GetLastError());
5564 ok(bret
== FALSE
, "OOB not inline\n");
5568 trace("Event test using messages\n");
5570 wndclass
.cbSize
= sizeof(wndclass
);
5571 wndclass
.style
= CS_HREDRAW
| CS_VREDRAW
;
5572 wndclass
.lpfnWndProc
= ws2_test_WndProc
;
5573 wndclass
.cbClsExtra
= 0;
5574 wndclass
.cbWndExtra
= 0;
5575 wndclass
.hInstance
= GetModuleHandleA(NULL
);
5576 wndclass
.hIcon
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
5577 wndclass
.hIconSm
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
5578 wndclass
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_ARROW
);
5579 wndclass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
5580 wndclass
.lpszClassName
= szClassName
;
5581 wndclass
.lpszMenuName
= NULL
;
5582 RegisterClassExA(&wndclass
);
5584 hWnd
= CreateWindowA(szClassName
, "WS2Test", WS_OVERLAPPEDWINDOW
,
5585 0, 0, 500, 500, NULL
, NULL
, GetModuleHandleA(NULL
), NULL
);
5588 ok(0, "failed to create window: %d\n", GetLastError());
5592 ret
= WSAAsyncSelect(src
, hWnd
, WM_SOCKET
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5595 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
5599 ok(set_blocking(src
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5600 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5602 ret
= WSAAsyncSelect(src2
, hWnd
, WM_SOCKET
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5605 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
5609 ok(set_blocking(src2
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5610 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5614 trace("Event test using events\n");
5616 hEvent
= WSACreateEvent();
5617 if (hEvent
== INVALID_HANDLE_VALUE
)
5619 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5623 hEvent2
= WSACreateEvent();
5624 if (hEvent2
== INVALID_HANDLE_VALUE
)
5626 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5630 ret
= WSAEventSelect(src
, hEvent
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5633 ok(0, "WSAEventSelect failed, error %d\n", ret
);
5637 ok(set_blocking(src
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5638 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5640 ret
= WSAEventSelect(src2
, hEvent2
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5643 ok(0, "WSAEventSelect failed, error %d\n", ret
);
5647 ok(set_blocking(src2
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5648 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5651 server
= socket(AF_INET
, SOCK_STREAM
, 0);
5652 if (server
== INVALID_SOCKET
)
5654 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5658 memset(&addr
, 0, sizeof(addr
));
5659 addr
.sin_family
= AF_INET
;
5660 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5661 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
5664 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5669 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
5672 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5676 ret
= listen(server
, 2);
5679 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5683 ret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
5684 if (ret
== SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK
)
5686 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5690 ret
= connect(src2
, (struct sockaddr
*)&addr
, sizeof(addr
));
5691 if (ret
== SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK
)
5693 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5698 dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
5699 if (dst
== INVALID_SOCKET
)
5701 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5706 dst2
= accept(server
, (struct sockaddr
*)&addr
, &len
);
5707 if (dst2
== INVALID_SOCKET
)
5709 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5713 closesocket(server
);
5714 server
= INVALID_SOCKET
;
5716 /* On Windows it seems when a non-blocking socket sends to a
5717 blocking socket on the same host, the send() is BLOCKING,
5718 so make both sockets non-blocking. src is already non-blocking
5719 from the async select */
5721 if (set_blocking(dst
, FALSE
))
5723 ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
5727 buffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, bufferSize
);
5730 ok(0, "could not allocate memory for test\n");
5734 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5735 if (ov
.hEvent
== NULL
)
5737 ok(0, "could not create event object, errno = %d\n", GetLastError());
5741 ov2
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5742 if (ov2
.hEvent
== NULL
)
5744 ok(0, "could not create event object, errno = %d\n", GetLastError());
5748 /* FD_WRITE should be set initially, and allow us to send at least 1 byte */
5749 ok_event_seq(src
, hEvent
, connect_seq
, NULL
, 1);
5750 ok_event_seq(src2
, hEvent2
, connect_seq
, NULL
, 1);
5751 /* broken on all windows - FD_CONNECT error is garbage */
5753 /* Test simple send/recv */
5754 SetLastError(0xdeadbeef);
5755 ret
= send(dst
, buffer
, 100, 0);
5756 ok(ret
== 100, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5757 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5758 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5760 SetLastError(0xdeadbeef);
5761 ret
= recv(src
, buffer
, 1, MSG_PEEK
);
5762 ok(ret
== 1, "Failed to peek at recv buffer %d err %d\n", ret
, GetLastError());
5763 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5764 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5766 SetLastError(0xdeadbeef);
5767 ret
= recv(src
, buffer
, 50, 0);
5768 ok(ret
== 50, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5769 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5770 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5772 ret
= recv(src
, buffer
, 50, 0);
5773 ok(ret
== 50, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5774 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5776 /* fun fact - events are re-enabled even on failure, but only for messages */
5777 ret
= send(dst
, "1", 1, 0);
5778 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5779 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5781 ret
= recv(src
, buffer
, -1, 0);
5782 ok(ret
== SOCKET_ERROR
&& (GetLastError() == WSAEFAULT
|| GetLastError() == WSAENOBUFS
),
5783 "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5786 broken_seq
[0] = empty_seq
; /* win9x */
5787 broken_seq
[1] = NULL
;
5788 todo_wine
ok_event_seq(src
, hEvent
, read_seq
, broken_seq
, 0);
5791 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5793 SetLastError(0xdeadbeef);
5794 ret
= recv(src
, buffer
, 1, 0);
5795 ok(ret
== 1, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5796 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5797 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5799 /* Interaction with overlapped */
5800 bufs
.len
= sizeof(char);
5802 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
5803 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5804 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5806 bufs
.len
= sizeof(char);
5807 bufs
.buf
= buffer
+1;
5808 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov2
, NULL
);
5809 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5810 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5812 ret
= send(dst
, "12", 2, 0);
5813 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5814 broken_seq
[0] = read_read_seq
; /* win9x */
5815 broken_seq
[1] = NULL
;
5816 ok_event_seq(src
, hEvent
, empty_seq
, broken_seq
, 0);
5818 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5819 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5820 if (dwRet
== WAIT_OBJECT_0
)
5822 bret
= GetOverlappedResult((HANDLE
)src
, &ov
, &bytesReturned
, FALSE
);
5823 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5824 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5825 ok(buffer
[0] == '1', "Got %c instead of 1\n", buffer
[0]);
5828 dwRet
= WaitForSingleObject(ov2
.hEvent
, 100);
5829 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5830 if (dwRet
== WAIT_OBJECT_0
)
5832 bret
= GetOverlappedResult((HANDLE
)src
, &ov2
, &bytesReturned
, FALSE
);
5833 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5834 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5835 ok(buffer
[1] == '2', "Got %c instead of 2\n", buffer
[1]);
5838 SetLastError(0xdeadbeef);
5839 ret
= send(dst
, "1", 1, 0);
5840 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5841 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5842 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5844 ret
= recv(src
, buffer
, 1, 0);
5845 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5846 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5848 /* Notifications are delivered as soon as possible, blocked only on
5849 * async requests on the same type */
5850 bufs
.len
= sizeof(char);
5852 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
5853 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5854 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5857 ret
= send(dst
, "1", 1, MSG_OOB
);
5858 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5859 ok_event_seq(src
, hEvent
, oob_seq
, NULL
, 0);
5862 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5863 ok(dwRet
== WAIT_TIMEOUT
, "OOB message activated read?: %d - %d\n", dwRet
, GetLastError());
5865 ret
= send(dst
, "2", 1, 0);
5866 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5867 broken_seq
[0] = read_seq
; /* win98 */
5868 broken_seq
[1] = NULL
;
5869 ok_event_seq(src
, hEvent
, empty_seq
, broken_seq
, 0);
5871 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5872 ok(dwRet
== WAIT_OBJECT_0
|| broken(dwRet
== WAIT_TIMEOUT
),
5873 "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5874 if (dwRet
== WAIT_OBJECT_0
)
5876 bret
= GetOverlappedResult((HANDLE
)src
, &ov
, &bytesReturned
, FALSE
);
5877 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5878 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5879 ok(buffer
[0] == '2', "Got %c instead of 2\n", buffer
[0]);
5881 else if (dwRet
== WAIT_TIMEOUT
)
5883 /* this happens on win98. We get an FD_READ later on the next test */
5884 CancelIo((HANDLE
) src
);
5888 ret
= recv(src
, buffer
, 1, MSG_OOB
);
5889 todo_wine
ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5890 /* We get OOB notification, but no data on wine */
5891 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5894 /* Flood the send queue */
5895 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
5896 if (hThread
== NULL
)
5898 ok(0, "CreateThread failed, error %d\n", GetLastError());
5902 /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */
5903 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5905 /* Now if we send a ton of data and the 'server' does not drain it fast
5906 * enough (set drain_pause to be sure), the socket send buffer will only
5907 * take some of it, and we will get a short write. This will trigger
5908 * another FD_WRITE event as soon as data is sent and more space becomes
5909 * available, but not any earlier. */
5913 ret
= send(src
, buffer
, bufferSize
, 0);
5914 } while (ret
== bufferSize
);
5915 drain_pause
= FALSE
;
5916 if (ret
>= 0 || WSAGetLastError() == WSAEWOULDBLOCK
)
5918 Sleep(400); /* win9x */
5919 broken_seq
[0] = read_write_seq
;
5920 broken_seq
[1] = NULL
;
5921 ok_event_seq(src
, hEvent
, write_seq
, broken_seq
, 0);
5925 ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError());
5928 /* Test how FD_CLOSE is handled */
5929 ret
= send(dst
, "12", 2, 0);
5930 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5932 /* Wait a little and let the send complete */
5935 dst
= INVALID_SOCKET
;
5938 /* We can never implement this in wine, best we can hope for is
5939 sending FD_CLOSE after the reads complete */
5940 broken_seq
[0] = read_seq
; /* win9x */
5941 broken_seq
[1] = NULL
;
5942 todo_wine
ok_event_seq(src
, hEvent
, read_close_seq
, broken_seq
, 0);
5944 ret
= recv(src
, buffer
, 1, 0);
5945 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5946 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5948 ret
= recv(src
, buffer
, 1, 0);
5949 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5950 /* want it? it's here, but you can't have it */
5951 broken_seq
[0] = close_seq
; /* win9x */
5952 broken_seq
[1] = NULL
;
5953 todo_wine
ok_event_seq(src
, hEvent
, empty_seq
, /* wine sends FD_CLOSE here */
5956 /* Test how FD_CLOSE is handled */
5957 ret
= send(dst2
, "12", 2, 0);
5958 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5961 shutdown(dst2
, SD_SEND
);
5964 /* Some of the below are technically todo_wine, but our event sequence is still valid, so to prevent
5965 regressions, don't mark them as todo_wine, and mark windows as broken */
5966 broken_seq
[0] = read_close_seq
;
5967 broken_seq
[1] = close_seq
;
5968 broken_seq
[2] = NULL
;
5969 ok_event_seq(src2
, hEvent2
, read_seq
, broken_seq
, 0);
5971 ret
= recv(src2
, buffer
, 1, 0);
5972 ok(ret
== 1 || broken(!ret
), "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5973 broken_seq
[0] = close_seq
; /* win98 */
5974 broken_seq
[1] = NULL
;
5975 ok_event_seq(src2
, hEvent2
, read_seq
, broken_seq
, 0);
5977 ret
= recv(src2
, buffer
, 1, 0);
5978 ok(ret
== 1 || broken(!ret
), "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5979 broken_seq
[0] = empty_seq
;
5980 broken_seq
[1] = NULL
;
5981 ok_event_seq(src2
, hEvent2
, close_seq
, broken_seq
, 0);
5983 ret
= send(src2
, "1", 1, 0);
5984 ok(ret
== 1, "Sending to half-closed socket failed %d err %d\n", ret
, GetLastError());
5985 ok_event_seq(src2
, hEvent2
, empty_seq
, NULL
, 0);
5987 ret
= send(src2
, "1", 1, 0);
5988 ok(ret
== 1, "Sending to half-closed socket failed %d err %d\n", ret
, GetLastError());
5989 ok_event_seq(src2
, hEvent2
, empty_seq
, NULL
, 0);
5993 ret
= WSAAsyncSelect(src
, hWnd
, WM_SOCKET
, 0);
5996 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6000 ret
= set_blocking(src
, TRUE
);
6001 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6003 ret
= WSAAsyncSelect(src2
, hWnd
, WM_SOCKET
, 0);
6006 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6010 ret
= set_blocking(src2
, TRUE
);
6011 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6015 ret
= WSAEventSelect(src
, hEvent2
, 0);
6018 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6022 ret
= set_blocking(src
, TRUE
);
6023 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6025 ret
= WSAEventSelect(src2
, hEvent2
, 0);
6028 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6032 ret
= set_blocking(src2
, TRUE
);
6033 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6037 if (src
!= INVALID_SOCKET
)
6039 flush_events(src
, hEvent
);
6042 if (src2
!= INVALID_SOCKET
)
6044 flush_events(src2
, hEvent2
);
6047 HeapFree(GetProcessHeap(), 0, buffer
);
6048 if (server
!= INVALID_SOCKET
)
6049 closesocket(server
);
6050 if (dst
!= INVALID_SOCKET
)
6052 if (dst2
!= INVALID_SOCKET
)
6054 if (hThread
!= NULL
)
6055 CloseHandle(hThread
);
6057 DestroyWindow(hWnd
);
6059 CloseHandle(hEvent
);
6060 if (hEvent2
!= NULL
)
6061 CloseHandle(hEvent2
);
6062 if (ov
.hEvent
!= NULL
)
6063 CloseHandle(ov
.hEvent
);
6064 if (ov2
.hEvent
!= NULL
)
6065 CloseHandle(ov2
.hEvent
);
6068 static void test_ipv6only(void)
6070 SOCKET v4
= INVALID_SOCKET
,
6071 v6
= INVALID_SOCKET
;
6072 struct sockaddr_in sin4
;
6073 struct sockaddr_in6 sin6
;
6076 memset(&sin4
, 0, sizeof(sin4
));
6077 sin4
.sin_family
= AF_INET
;
6078 sin4
.sin_port
= htons(SERVERPORT
);
6080 memset(&sin6
, 0, sizeof(sin6
));
6081 sin6
.sin6_family
= AF_INET6
;
6082 sin6
.sin6_port
= htons(SERVERPORT
);
6084 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
6085 if (v6
== INVALID_SOCKET
) {
6086 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
6087 WSAGetLastError(), WSAEAFNOSUPPORT
);
6090 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
6092 skip("Could not bind IPv6 address (LastError: %d).\n",
6097 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6098 if (v4
== INVALID_SOCKET
) {
6099 skip("Could not create IPv4 socket (LastError: %d).\n",
6103 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
6104 ok(!ret
, "Could not bind IPv4 address (LastError: %d; %d expected if IPv6 binds to IPv4 as well).\n",
6105 WSAGetLastError(), WSAEADDRINUSE
);
6108 if (v4
!= INVALID_SOCKET
)
6110 if (v6
!= INVALID_SOCKET
)
6114 static void test_WSASendMsg(void)
6117 struct sockaddr_in sendaddr
, sockaddr
;
6118 GUID WSASendMsg_GUID
= WSAID_WSASENDMSG
;
6119 LPFN_WSASENDMSG pWSASendMsg
= NULL
;
6120 char teststr
[12] = "hello world", buffer
[32];
6123 DWORD bytesSent
, err
;
6126 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
6128 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6129 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6131 /* Obtain the WSASendMsg function */
6132 WSAIoctl(sock
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSASendMsg_GUID
, sizeof(WSASendMsg_GUID
),
6133 &pWSASendMsg
, sizeof(pWSASendMsg
), &err
, NULL
, NULL
);
6137 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
6141 /* fake address for now */
6142 sendaddr
.sin_family
= AF_INET
;
6143 sendaddr
.sin_port
= htons(139);
6144 sendaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6146 memset(&msg
, 0, sizeof(msg
));
6147 iovec
[0].buf
= teststr
;
6148 iovec
[0].len
= sizeof(teststr
);
6149 iovec
[1].buf
= teststr
;
6150 iovec
[1].len
= sizeof(teststr
) / 2;
6151 msg
.name
= (struct sockaddr
*) &sendaddr
;
6152 msg
.namelen
= sizeof(sendaddr
);
6153 msg
.lpBuffers
= iovec
;
6154 msg
.dwBufferCount
= 1; /* send only one buffer for now */
6156 WSASetLastError(0xdeadbeef);
6157 ret
= pWSASendMsg(INVALID_SOCKET
, &msg
, 0, NULL
, NULL
, NULL
);
6158 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6159 err
= WSAGetLastError();
6160 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
6162 WSASetLastError(0xdeadbeef);
6163 ret
= pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
);
6164 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6165 err
= WSAGetLastError();
6166 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6168 WSASetLastError(0xdeadbeef);
6169 ret
= pWSASendMsg(sock
, NULL
, 0, &bytesSent
, NULL
, NULL
);
6170 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6171 err
= WSAGetLastError();
6172 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6174 WSASetLastError(0xdeadbeef);
6175 ret
= pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
);
6176 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6177 err
= WSAGetLastError();
6178 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6182 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6183 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6185 dst
= socket(AF_INET
, SOCK_DGRAM
, 0);
6186 ok(dst
!= INVALID_SOCKET
, "socket() failed\n");
6188 memset(&sockaddr
, 0, sizeof(sockaddr
));
6189 sockaddr
.sin_family
= AF_INET
;
6190 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6191 ok(!bind(dst
, (struct sockaddr
*)&sockaddr
, sizeof(sockaddr
)),
6192 "bind should have worked\n");
6194 /* read address to find out the port number to be used in send */
6195 memset(&sendaddr
, 0, sizeof(sendaddr
));
6196 addrlen
= sizeof(sendaddr
);
6197 ok(!getsockname(dst
, (struct sockaddr
*) &sendaddr
, &addrlen
),
6198 "getsockname should have worked\n");
6199 ok(sendaddr
.sin_port
, "socket port should be != 0\n");
6201 /* ensure the sending socket is not bound */
6202 WSASetLastError(0xdeadbeef);
6203 addrlen
= sizeof(sockaddr
);
6204 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
6205 ok(ret
== SOCKET_ERROR
, "getsockname should have failed\n");
6206 err
= WSAGetLastError();
6207 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
6209 set_blocking(sock
, TRUE
);
6212 SetLastError(0xdeadbeef);
6213 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6214 ok(!ret
, "WSASendMsg should have worked\n");
6215 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6216 "Expected 0, got %d\n", GetLastError());
6217 ok(bytesSent
== iovec
[0].len
, "incorret bytes sent, expected %d, sent %d\n",
6218 iovec
[0].len
, bytesSent
);
6221 addrlen
= sizeof(sockaddr
);
6222 memset(buffer
, 0, sizeof(buffer
));
6223 SetLastError(0xdeadbeef);
6224 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
6225 ok(ret
== bytesSent
, "got %d, expected %d\n",
6227 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6229 /* A successful call to WSASendMsg must have bound the socket */
6230 addrlen
= sizeof(sockaddr
);
6231 sockaddr
.sin_port
= 0;
6232 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6233 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
6234 ok(!ret
, "getsockname should have worked\n");
6235 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
6236 inet_ntoa(sockaddr
.sin_addr
));
6237 ok(sockaddr
.sin_port
, "sin_port should be != 0\n");
6239 msg
.dwBufferCount
= 2; /* send both buffers */
6242 SetLastError(0xdeadbeef);
6243 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6244 ok(!ret
, "WSASendMsg should have worked\n");
6245 ok(bytesSent
== iovec
[0].len
+ iovec
[1].len
, "incorret bytes sent, expected %d, sent %d\n",
6246 iovec
[0].len
+ iovec
[1].len
, bytesSent
);
6247 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6248 "Expected 0, got %d\n", GetLastError());
6251 addrlen
= sizeof(sockaddr
);
6252 memset(buffer
, 0, sizeof(buffer
));
6253 SetLastError(0xdeadbeef);
6254 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
6255 ok(ret
== bytesSent
, "got %d, expected %d\n",
6257 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6262 /* a bad call to WSASendMsg will also bind the socket */
6263 addrlen
= sizeof(sockaddr
);
6264 sockaddr
.sin_port
= 0;
6265 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6266 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6267 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6268 ok(pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
6270 ok(!getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have worked\n");
6271 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
6272 inet_ntoa(sockaddr
.sin_addr
));
6273 ok(sockaddr
.sin_port
, "sin_port should be > 0\n");
6277 /* a bad call without msg parameter will not trigger the auto-bind */
6278 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6279 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6280 ok(pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
6281 ok(getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have failed\n");
6282 err
= WSAGetLastError();
6283 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
6286 /* SOCK_STREAM sockets are not supported */
6288 sock
= socket(AF_INET
, SOCK_STREAM
, 0);
6289 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6290 SetLastError(0xdeadbeef);
6291 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6292 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6293 err
= WSAGetLastError();
6295 ok(err
== WSAEINVAL
, "expected 10014, got %d instead\n", err
);
6299 static void test_WSASendTo(void)
6302 struct sockaddr_in addr
;
6303 char buf
[12] = "hello world";
6308 addr
.sin_family
= AF_INET
;
6309 addr
.sin_port
= htons(139);
6310 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6311 data_buf
.len
= sizeof(buf
);
6314 if( (s
= socket(AF_INET
, SOCK_DGRAM
, 0)) == INVALID_SOCKET
) {
6315 ok(0, "socket() failed error: %d\n", WSAGetLastError());
6319 WSASetLastError(12345);
6320 ret
= WSASendTo(INVALID_SOCKET
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
6321 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
6322 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
6324 WSASetLastError(12345);
6325 ret
= WSASendTo(s
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
6326 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
6327 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
6329 WSASetLastError(12345);
6330 if(WSASendTo(s
, &data_buf
, 1, &bytesSent
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
)) {
6331 ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError());
6334 ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
6335 "a successful call to WSASendTo()\n");
6338 static DWORD WINAPI
recv_thread(LPVOID arg
)
6340 SOCKET sock
= *(SOCKET
*)arg
;
6347 wsa
.len
= sizeof(buffer
);
6348 ov
.hEvent
= WSACreateEvent();
6349 WSARecv(sock
, &wsa
, 1, NULL
, &flags
, &ov
, NULL
);
6351 WaitForSingleObject(ov
.hEvent
, 1000);
6352 WSACloseEvent(ov
.hEvent
);
6356 static void test_WSARecv(void)
6358 SOCKET src
, dest
, server
= INVALID_SOCKET
;
6362 DWORD bytesReturned
, flags
, id
;
6364 struct sockaddr_in addr
;
6370 tcp_socketpair(&src
, &dest
);
6371 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
6373 skip("failed to create sockets\n");
6377 memset(&ov
, 0, sizeof(ov
));
6382 /* Send 4 bytes and receive in two calls of 2 */
6383 SetLastError(0xdeadbeef);
6384 iret
= send(src
, "test", 4, 0);
6385 ok(iret
== 4, "Expected 4, got %d\n", iret
);
6386 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6387 SetLastError(0xdeadbeef);
6388 bytesReturned
= 0xdeadbeef;
6389 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6390 ok(!iret
, "Expected 0, got %d\n", iret
);
6391 ok(bytesReturned
, "Expected 2, got %d\n", bytesReturned
);
6392 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6393 SetLastError(0xdeadbeef);
6394 bytesReturned
= 0xdeadbeef;
6395 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6396 ok(!iret
, "Expected 0, got %d\n", iret
);
6397 ok(bytesReturned
, "Expected 2, got %d\n", bytesReturned
);
6398 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6401 SetLastError(0xdeadbeef);
6402 iret
= send(src
, "test", 4, 0);
6403 ok(iret
== 4, "Expected 4, got %d\n", iret
);
6404 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6405 SetLastError(0xdeadbeef);
6406 bytesReturned
= 0xdeadbeef;
6407 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6408 ok(!iret
, "Expected 0, got %d\n", iret
);
6409 ok(bytesReturned
, "Expected 4, got %d\n", bytesReturned
);
6410 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6412 bufs
.len
= sizeof(buf
);
6414 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6415 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
6421 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
6422 ok(!iret
, "Failed to set linger %d\n", GetLastError());
6424 iret
= WSARecv(dest
, &bufs
, 1, NULL
, &flags
, &ov
, NULL
);
6425 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6427 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
6428 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6431 src
= INVALID_SOCKET
;
6433 dwret
= WaitForSingleObject(ov
.hEvent
, 1000);
6434 ok(dwret
== WAIT_OBJECT_0
, "Waiting for disconnect event failed with %d + errno %d\n", dwret
, GetLastError());
6436 bret
= GetOverlappedResult((HANDLE
)dest
, &ov
, &bytesReturned
, FALSE
);
6437 todo_wine
ok(!bret
&& (GetLastError() == ERROR_NETNAME_DELETED
|| broken(GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */),
6438 "Did not get disconnect event: %d, error %d\n", bret
, GetLastError());
6439 ok(bytesReturned
== 0, "Bytes received is %d\n", bytesReturned
);
6441 dest
= INVALID_SOCKET
;
6443 src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
6444 ok(src
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6445 if (src
== INVALID_SOCKET
) goto end
;
6447 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
6448 ok(server
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6449 if (server
== INVALID_SOCKET
) goto end
;
6451 memset(&addr
, 0, sizeof(addr
));
6452 addr
.sin_family
= AF_INET
;
6453 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6454 iret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
6458 iret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
6461 iret
= listen(server
, 1);
6464 iret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
6468 dest
= accept(server
, (struct sockaddr
*)&addr
, &len
);
6469 ok(dest
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6470 if (dest
== INVALID_SOCKET
) goto end
;
6472 send(src
, "test message", sizeof("test message"), 0);
6473 thread
= CreateThread(NULL
, 0, recv_thread
, &dest
, 0, &id
);
6474 WaitForSingleObject(thread
, 3000);
6475 CloseHandle(thread
);
6478 if (server
!= INVALID_SOCKET
)
6479 closesocket(server
);
6480 if (dest
!= INVALID_SOCKET
)
6482 if (src
!= INVALID_SOCKET
)
6485 WSACloseEvent(ov
.hEvent
);
6488 #define POLL_CLEAR() ix = 0
6489 #define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;}
6490 #define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
6491 static BOOL
poll_isset(WSAPOLLFD
*fds
, int max
, SOCKET s
, int rev
)
6494 for (k
= 0; k
< max
; k
++)
6495 if (fds
[k
].fd
== s
&& (fds
[k
].revents
== rev
)) return TRUE
;
6499 static void test_WSAPoll(void)
6501 int ix
, ret
, err
, poll_timeout
;
6502 SOCKET fdListen
, fdRead
, fdWrite
;
6503 struct sockaddr_in address
;
6505 static char tmp_buf
[1024];
6507 HANDLE thread_handle
;
6510 if (!pWSAPoll
) /* >= Vista */
6512 skip("WSAPoll is unsupported, some tests will be skipped.\n");
6516 /* Invalid parameters test */
6517 SetLastError(0xdeadbeef);
6518 ret
= pWSAPoll(NULL
, 0, 0);
6519 err
= GetLastError();
6520 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6521 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6522 SetLastError(0xdeadbeef);
6523 ret
= pWSAPoll(NULL
, 1, 0);
6524 err
= GetLastError();
6525 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6526 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6527 SetLastError(0xdeadbeef);
6528 ret
= pWSAPoll(NULL
, 0, 1);
6529 err
= GetLastError();
6530 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6531 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6532 SetLastError(0xdeadbeef);
6533 ret
= pWSAPoll(NULL
, 1, 1);
6534 err
= GetLastError();
6535 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6536 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6538 /* WSAPoll() tries to mime the unix poll() call. The following tests do:
6539 * - check if a connection attempt ended with success or error;
6540 * - check if a pending connection is waiting for acceptance;
6541 * - check for data to read, availability for write and OOB data
6543 memset(&address
, 0, sizeof(address
));
6544 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6545 address
.sin_family
= AF_INET
;
6546 len
= sizeof(address
);
6547 fdListen
= setup_server_socket(&address
, &len
);
6550 /* When no events are pending poll returns 0 with no error */
6552 POLL_SET(fdListen
, POLLIN
);
6553 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6554 ok(ret
== 0, "expected 0, got %d\n", ret
);
6556 /* Test listening socket connection attempt notifications */
6557 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
6559 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6560 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6561 ok(ret
== 1, "expected 1, got %d\n", ret
);
6562 ok(POLL_ISSET(fdListen
, POLLRDNORM
), "fdListen socket events incorrect\n");
6563 len
= sizeof(address
);
6564 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
6565 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
6567 /* Test client side connection attempt notifications */
6569 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6570 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6571 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6572 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6573 ok(ret
== 2, "expected 2, got %d\n", ret
);
6574 ok(POLL_ISSET(fdWrite
, POLLWRNORM
), "fdWrite socket events incorrect\n");
6575 ok(POLL_ISSET(fdRead
, POLLWRNORM
), "fdRead socket events incorrect\n");
6578 err
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
6579 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
6580 ok(id
== 0, "expected 0, got %d\n", id
);
6582 /* Test data receiving notifications */
6583 ret
= send(fdWrite
, "1234", 4, 0);
6584 ok(ret
== 4, "expected 4, got %d\n", ret
);
6586 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6587 POLL_SET(fdRead
, POLLIN
);
6588 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6589 ok(ret
== 1, "expected 1, got %d\n", ret
);
6590 ok(POLL_ISSET(fdRead
, POLLRDNORM
), "fdRead socket events incorrect\n");
6591 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
6592 ok(ret
== 4, "expected 4, got %d\n", ret
);
6593 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
6595 /* Test OOB data notifications */
6596 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
6597 ok(ret
== 1, "expected 1, got %d\n", ret
);
6599 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6600 POLL_SET(fdRead
, POLLIN
);
6601 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6602 ok(ret
== 1, "expected 1, got %d\n", ret
);
6603 ok(POLL_ISSET(fdRead
, POLLRDBAND
), "fdRead socket events incorrect\n");
6605 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
6606 ok(ret
== 1, "expected 1, got %d\n", ret
);
6607 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
6609 /* If the socket is OOBINLINED the notification is like normal data */
6611 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
6612 ok(ret
== 0, "expected 0, got %d\n", ret
);
6613 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
6614 ok(ret
== 1, "expected 1, got %d\n", ret
);
6616 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6617 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6618 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6619 ok(ret
== 1, "expected 1, got %d\n", ret
);
6621 SetLastError(0xdeadbeef);
6622 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
6623 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6624 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %d\n", GetLastError());
6625 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
6626 ok(ret
== 1, "expected 1, got %d\n", ret
);
6627 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
6629 /* Test connection closed notifications */
6630 ret
= closesocket(fdRead
);
6631 ok(ret
== 0, "expected 0, got %d\n", ret
);
6633 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6634 POLL_SET(fdWrite
, POLLIN
);
6635 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6636 ok(ret
== 1, "expected 1, got %d\n", ret
);
6638 ok(POLL_ISSET(fdWrite
, POLLHUP
), "fdWrite socket events incorrect\n");
6639 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
6640 ok(ret
== 0, "expected 0, got %d\n", ret
);
6642 /* When a connection is attempted to a non-listening socket due to a bug
6643 * in the MS code it will never be notified. This is a long standing issue
6644 * that will never be fixed for compatibility reasons so we have to deal
6645 * with it manually. */
6646 ret
= closesocket(fdWrite
);
6647 ok(ret
== 0, "expected 0, got %d\n", ret
);
6648 ret
= closesocket(fdListen
);
6649 ok(ret
== 0, "expected 0, got %d\n", ret
);
6650 len
= sizeof(address
);
6651 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
6653 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6654 poll_timeout
= 2000;
6655 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6657 ok(ret
== 0, "expected 0, got %d\n", ret
);
6660 err
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
6661 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
6662 ok(id
== WSAECONNREFUSED
, "expected 10061, got %d\n", id
);
6663 closesocket(fdWrite
);
6665 /* Try poll() on a closed socket after connection */
6666 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6667 closesocket(fdRead
);
6669 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6670 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6671 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6672 ok(ret
== 1, "expected 1, got %d\n", ret
);
6673 ok(POLL_ISSET(fdRead
, POLLNVAL
), "fdRead socket events incorrect\n");
6675 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6676 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6677 ok(ret
== 1, "expected 1, got %d\n", ret
);
6679 ok(POLL_ISSET(fdWrite
, POLLWRNORM
| POLLHUP
) || broken(POLL_ISSET(fdWrite
, POLLWRNORM
)) /* <= 2008 */,
6680 "fdWrite socket events incorrect\n");
6681 closesocket(fdWrite
);
6683 /* Close the socket currently being polled in a thread */
6684 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6685 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
6686 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
6688 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6689 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6690 ok(ret
== 1, "expected 1, got %d\n", ret
);
6691 ok(POLL_ISSET(fdWrite
, POLLWRNORM
), "fdWrite socket events incorrect\n");
6692 WaitForSingleObject (thread_handle
, 1000);
6693 closesocket(fdRead
);
6694 /* test again with less flags - behavior changes */
6695 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6696 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
6697 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
6699 POLL_SET(fdWrite
, POLLIN
);
6700 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6701 ok(ret
== 1, "expected 1, got %d\n", ret
);
6703 ok(POLL_ISSET(fdWrite
, POLLNVAL
), "fdWrite socket events incorrect\n");
6704 WaitForSingleObject (thread_handle
, 1000);
6705 closesocket(fdRead
);
6711 static void test_GetAddrInfoW(void)
6713 static const WCHAR port
[] = {'8','0',0};
6714 static const WCHAR empty
[] = {0};
6715 static const WCHAR localhost
[] = {'l','o','c','a','l','h','o','s','t',0};
6716 static const WCHAR nxdomain
[] =
6717 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
6718 static const WCHAR zero
[] = {'0',0};
6720 ADDRINFOW
*result
, *result2
, *p
, hint
;
6722 DWORD size
= sizeof(name
)/sizeof(WCHAR
);
6724 if (!pGetAddrInfoW
|| !pFreeAddrInfoW
)
6726 win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
6729 memset(&hint
, 0, sizeof(ADDRINFOW
));
6731 GetComputerNameExW( ComputerNamePhysicalDnsHostname
, name
, &size
);
6733 result
= (ADDRINFOW
*)0xdeadbeef;
6734 WSASetLastError(0xdeadbeef);
6735 ret
= pGetAddrInfoW(NULL
, NULL
, NULL
, &result
);
6736 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6737 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6738 ok(result
== NULL
, "got %p\n", result
);
6741 WSASetLastError(0xdeadbeef);
6742 ret
= pGetAddrInfoW(empty
, NULL
, NULL
, &result
);
6743 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6744 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6745 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6746 pFreeAddrInfoW(result
);
6749 ret
= pGetAddrInfoW(NULL
, zero
, NULL
, &result
);
6750 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6751 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6754 ret
= pGetAddrInfoW(NULL
, empty
, NULL
, &result2
);
6755 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6756 ok(result2
!= NULL
, "GetAddrInfoW failed\n");
6757 compare_addrinfow(result
, result2
);
6758 pFreeAddrInfoW(result
);
6759 pFreeAddrInfoW(result2
);
6762 ret
= pGetAddrInfoW(empty
, zero
, NULL
, &result
);
6763 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6764 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6765 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6768 ret
= pGetAddrInfoW(empty
, empty
, NULL
, &result2
);
6769 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6770 ok(result2
!= NULL
, "GetAddrInfoW failed\n");
6771 compare_addrinfow(result
, result2
);
6772 pFreeAddrInfoW(result
);
6773 pFreeAddrInfoW(result2
);
6776 ret
= pGetAddrInfoW(localhost
, NULL
, NULL
, &result
);
6777 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6778 pFreeAddrInfoW(result
);
6781 ret
= pGetAddrInfoW(localhost
, empty
, NULL
, &result
);
6782 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6783 pFreeAddrInfoW(result
);
6786 ret
= pGetAddrInfoW(localhost
, zero
, NULL
, &result
);
6787 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6788 pFreeAddrInfoW(result
);
6791 ret
= pGetAddrInfoW(localhost
, port
, NULL
, &result
);
6792 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6793 pFreeAddrInfoW(result
);
6796 ret
= pGetAddrInfoW(localhost
, NULL
, &hint
, &result
);
6797 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6798 pFreeAddrInfoW(result
);
6801 SetLastError(0xdeadbeef);
6802 ret
= pGetAddrInfoW(localhost
, port
, &hint
, &result
);
6803 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6804 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6805 pFreeAddrInfoW(result
);
6807 /* try to get information from the computer name, result is the same
6808 * as if requesting with an empty host name. */
6809 ret
= pGetAddrInfoW(name
, NULL
, NULL
, &result
);
6810 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6811 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6813 ret
= pGetAddrInfoW(empty
, NULL
, NULL
, &result2
);
6814 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6815 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6816 compare_addrinfow(result
, result2
);
6817 pFreeAddrInfoW(result
);
6818 pFreeAddrInfoW(result2
);
6820 ret
= pGetAddrInfoW(name
, empty
, NULL
, &result
);
6821 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6822 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6824 ret
= pGetAddrInfoW(empty
, empty
, NULL
, &result2
);
6825 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6826 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6827 compare_addrinfow(result
, result2
);
6828 pFreeAddrInfoW(result
);
6829 pFreeAddrInfoW(result2
);
6831 result
= (ADDRINFOW
*)0xdeadbeef;
6832 WSASetLastError(0xdeadbeef);
6833 ret
= pGetAddrInfoW(NULL
, NULL
, NULL
, &result
);
6836 skip("nxdomain returned success. Broken ISP redirects?\n");
6839 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6840 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6841 ok(result
== NULL
, "got %p\n", result
);
6843 result
= (ADDRINFOW
*)0xdeadbeef;
6844 WSASetLastError(0xdeadbeef);
6845 ret
= pGetAddrInfoW(nxdomain
, NULL
, NULL
, &result
);
6848 skip("nxdomain returned success. Broken ISP redirects?\n");
6851 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6852 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6853 ok(result
== NULL
, "got %p\n", result
);
6855 for (i
= 0;i
< (sizeof(hinttests
) / sizeof(hinttests
[0]));i
++)
6857 hint
.ai_family
= hinttests
[i
].family
;
6858 hint
.ai_socktype
= hinttests
[i
].socktype
;
6859 hint
.ai_protocol
= hinttests
[i
].protocol
;
6862 SetLastError(0xdeadbeef);
6863 ret
= pGetAddrInfoW(localhost
, NULL
, &hint
, &result
);
6866 if (hinttests
[i
].error
)
6867 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i
);
6873 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
6874 if (hinttests
[i
].family
== AF_UNSPEC
)
6875 ok(p
->ai_family
== AF_INET
|| p
->ai_family
== AF_INET6
,
6876 "test %d: expected AF_INET or AF_INET6, got %d\n",
6879 ok(p
->ai_family
== hinttests
[i
].family
,
6880 "test %d: expected family %d, got %d\n",
6881 i
, hinttests
[i
].family
, p
->ai_family
);
6883 ok(p
->ai_socktype
== hinttests
[i
].socktype
,
6884 "test %d: expected type %d, got %d\n",
6885 i
, hinttests
[i
].socktype
, p
->ai_socktype
);
6886 ok(p
->ai_protocol
== hinttests
[i
].protocol
,
6887 "test %d: expected protocol %d, got %d\n",
6888 i
, hinttests
[i
].protocol
, p
->ai_protocol
);
6893 pFreeAddrInfoW(result
);
6897 DWORD err
= WSAGetLastError();
6898 if (hinttests
[i
].error
)
6899 ok(hinttests
[i
].error
== err
, "test %d: GetAddrInfoW failed with error %d, expected %d\n",
6900 i
, err
, hinttests
[i
].error
);
6902 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i
, ret
, err
);
6907 static void test_getaddrinfo(void)
6910 ADDRINFOA
*result
, *result2
, *p
, hint
;
6912 DWORD size
= sizeof(name
);
6914 if (!pgetaddrinfo
|| !pfreeaddrinfo
)
6916 win_skip("getaddrinfo and/or freeaddrinfo not present\n");
6919 memset(&hint
, 0, sizeof(ADDRINFOA
));
6920 GetComputerNameExA( ComputerNamePhysicalDnsHostname
, name
, &size
);
6922 result
= (ADDRINFOA
*)0xdeadbeef;
6923 WSASetLastError(0xdeadbeef);
6924 ret
= pgetaddrinfo(NULL
, NULL
, NULL
, &result
);
6925 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6926 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6927 ok(result
== NULL
, "got %p\n", result
);
6930 WSASetLastError(0xdeadbeef);
6931 ret
= pgetaddrinfo("", NULL
, NULL
, &result
);
6932 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6933 ok(result
!= NULL
, "getaddrinfo failed\n");
6934 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6935 pfreeaddrinfo(result
);
6938 ret
= pgetaddrinfo(NULL
, "0", NULL
, &result
);
6939 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6940 ok(result
!= NULL
, "getaddrinfo failed\n");
6943 ret
= pgetaddrinfo(NULL
, "", NULL
, &result2
);
6944 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6945 ok(result2
!= NULL
, "getaddrinfo failed\n");
6946 compare_addrinfo(result
, result2
);
6947 pfreeaddrinfo(result
);
6948 pfreeaddrinfo(result2
);
6951 WSASetLastError(0xdeadbeef);
6952 ret
= pgetaddrinfo("", "0", NULL
, &result
);
6953 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6954 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6955 ok(result
!= NULL
, "getaddrinfo failed\n");
6958 ret
= pgetaddrinfo("", "", NULL
, &result2
);
6959 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6960 ok(result2
!= NULL
, "getaddrinfo failed\n");
6961 compare_addrinfo(result
, result2
);
6962 pfreeaddrinfo(result
);
6963 pfreeaddrinfo(result2
);
6966 ret
= pgetaddrinfo("localhost", NULL
, NULL
, &result
);
6967 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6968 pfreeaddrinfo(result
);
6971 ret
= pgetaddrinfo("localhost", "", NULL
, &result
);
6972 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6973 pfreeaddrinfo(result
);
6976 ret
= pgetaddrinfo("localhost", "0", NULL
, &result
);
6977 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6978 pfreeaddrinfo(result
);
6981 ret
= pgetaddrinfo("localhost", "80", NULL
, &result
);
6982 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6983 pfreeaddrinfo(result
);
6986 ret
= pgetaddrinfo("localhost", NULL
, &hint
, &result
);
6987 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6988 pfreeaddrinfo(result
);
6991 WSASetLastError(0xdeadbeef);
6992 ret
= pgetaddrinfo("localhost", "80", &hint
, &result
);
6993 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6994 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6995 pfreeaddrinfo(result
);
6997 /* try to get information from the computer name, result is the same
6998 * as if requesting with an empty host name. */
6999 ret
= pgetaddrinfo(name
, NULL
, NULL
, &result
);
7000 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7001 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7003 ret
= pgetaddrinfo("", NULL
, NULL
, &result2
);
7004 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7005 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7006 compare_addrinfo(result
, result2
);
7007 pfreeaddrinfo(result
);
7008 pfreeaddrinfo(result2
);
7010 ret
= pgetaddrinfo(name
, "", NULL
, &result
);
7011 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7012 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7014 ret
= pgetaddrinfo("", "", NULL
, &result2
);
7015 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7016 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7017 compare_addrinfo(result
, result2
);
7018 pfreeaddrinfo(result
);
7019 pfreeaddrinfo(result2
);
7021 result
= (ADDRINFOA
*)0xdeadbeef;
7022 WSASetLastError(0xdeadbeef);
7023 ret
= pgetaddrinfo("nxdomain.codeweavers.com", NULL
, NULL
, &result
);
7026 skip("nxdomain returned success. Broken ISP redirects?\n");
7029 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
7030 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
7031 ok(result
== NULL
, "got %p\n", result
);
7033 for (i
= 0;i
< (sizeof(hinttests
) / sizeof(hinttests
[0]));i
++)
7035 hint
.ai_family
= hinttests
[i
].family
;
7036 hint
.ai_socktype
= hinttests
[i
].socktype
;
7037 hint
.ai_protocol
= hinttests
[i
].protocol
;
7040 SetLastError(0xdeadbeef);
7041 ret
= pgetaddrinfo("localhost", NULL
, &hint
, &result
);
7044 if (hinttests
[i
].error
)
7045 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i
);
7051 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7052 if (hinttests
[i
].family
== AF_UNSPEC
)
7053 ok(p
->ai_family
== AF_INET
|| p
->ai_family
== AF_INET6
,
7054 "test %d: expected AF_INET or AF_INET6, got %d\n",
7057 ok(p
->ai_family
== hinttests
[i
].family
,
7058 "test %d: expected family %d, got %d\n",
7059 i
, hinttests
[i
].family
, p
->ai_family
);
7061 ok(p
->ai_socktype
== hinttests
[i
].socktype
,
7062 "test %d: expected type %d, got %d\n",
7063 i
, hinttests
[i
].socktype
, p
->ai_socktype
);
7064 ok(p
->ai_protocol
== hinttests
[i
].protocol
,
7065 "test %d: expected protocol %d, got %d\n",
7066 i
, hinttests
[i
].protocol
, p
->ai_protocol
);
7071 pfreeaddrinfo(result
);
7075 DWORD err
= WSAGetLastError();
7076 if (hinttests
[i
].error
)
7077 ok(hinttests
[i
].error
== err
, "test %d: getaddrinfo failed with error %d, expected %d\n",
7078 i
, err
, hinttests
[i
].error
);
7080 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i
, ret
, err
);
7085 static void test_ConnectEx(void)
7087 SOCKET listener
= INVALID_SOCKET
;
7088 SOCKET acceptor
= INVALID_SOCKET
;
7089 SOCKET connector
= INVALID_SOCKET
;
7090 struct sockaddr_in address
, conaddress
;
7092 OVERLAPPED overlapped
;
7093 LPFN_CONNECTEX pConnectEx
;
7094 GUID connectExGuid
= WSAID_CONNECTEX
;
7095 DWORD bytesReturned
;
7101 memset(&overlapped
, 0, sizeof(overlapped
));
7103 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7104 if (listener
== INVALID_SOCKET
) {
7105 skip("could not create listener socket, error %d\n", WSAGetLastError());
7109 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7110 if (connector
== INVALID_SOCKET
) {
7111 skip("could not create connector socket, error %d\n", WSAGetLastError());
7115 memset(&address
, 0, sizeof(address
));
7116 address
.sin_family
= AF_INET
;
7117 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7118 iret
= bind(listener
, (struct sockaddr
*)&address
, sizeof(address
));
7120 skip("failed to bind, error %d\n", WSAGetLastError());
7124 addrlen
= sizeof(address
);
7125 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
7127 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
7131 if (set_blocking(listener
, TRUE
)) {
7132 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7136 iret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectExGuid
, sizeof(connectExGuid
),
7137 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
7139 win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret
, WSAGetLastError());
7143 bret
= pConnectEx(INVALID_SOCKET
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7144 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "ConnectEx on invalid socket "
7145 "returned %d + errno %d\n", bret
, WSAGetLastError());
7147 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7148 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "ConnectEx on a unbound socket "
7149 "returned %d + errno %d\n", bret
, WSAGetLastError());
7150 if (bret
== TRUE
|| WSAGetLastError() != WSAEINVAL
)
7152 acceptor
= accept(listener
, NULL
, NULL
);
7153 if (acceptor
!= INVALID_SOCKET
) {
7154 closesocket(acceptor
);
7155 acceptor
= INVALID_SOCKET
;
7158 closesocket(connector
);
7159 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7160 if (connector
== INVALID_SOCKET
) {
7161 skip("could not create connector socket, error %d\n", WSAGetLastError());
7166 /* ConnectEx needs a bound socket */
7167 memset(&conaddress
, 0, sizeof(conaddress
));
7168 conaddress
.sin_family
= AF_INET
;
7169 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7170 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7172 skip("failed to bind, error %d\n", WSAGetLastError());
7176 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, NULL
);
7177 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "ConnectEx on a NULL overlapped "
7178 "returned %d + errno %d\n", bret
, WSAGetLastError());
7180 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7181 if (overlapped
.hEvent
== NULL
) {
7182 skip("could not create event object, errno = %d\n", GetLastError());
7186 iret
= listen(listener
, 1);
7188 skip("listening failed, errno = %d\n", WSAGetLastError());
7192 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7193 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
7194 "returned %d + errno %d\n", bret
, WSAGetLastError());
7195 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7196 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7198 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7199 ok(bret
, "Connecting failed, error %d\n", GetLastError());
7200 ok(bytesReturned
== 0, "Bytes sent is %d\n", bytesReturned
);
7202 closesocket(connector
);
7203 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7204 if (connector
== INVALID_SOCKET
) {
7205 skip("could not create connector socket, error %d\n", WSAGetLastError());
7208 /* ConnectEx needs a bound socket */
7209 memset(&conaddress
, 0, sizeof(conaddress
));
7210 conaddress
.sin_family
= AF_INET
;
7211 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7212 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7214 skip("failed to bind, error %d\n", WSAGetLastError());
7218 acceptor
= accept(listener
, NULL
, NULL
);
7219 if (acceptor
!= INVALID_SOCKET
) {
7220 closesocket(acceptor
);
7226 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, buffer
, 3, &bytesReturned
, &overlapped
);
7227 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
7228 "returned %d + errno %d\n", bret
, WSAGetLastError());
7229 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7230 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7232 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7233 ok(bret
, "Connecting failed, error %d\n", GetLastError());
7234 ok(bytesReturned
== 3, "Bytes sent is %d\n", bytesReturned
);
7236 acceptor
= accept(listener
, NULL
, NULL
);
7237 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket error %d\n", WSAGetLastError());
7239 bytesReturned
= recv(acceptor
, buffer
, 3, 0);
7241 ok(bytesReturned
== 3, "Didn't get all sent data, got only %d\n", bytesReturned
);
7242 ok(buffer
[0] == '1' && buffer
[1] == '2' && buffer
[2] == '3',
7243 "Failed to get the right data, expected '123', got '%s'\n", buffer
);
7245 closesocket(connector
);
7246 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7247 if (connector
== INVALID_SOCKET
) {
7248 skip("could not create connector socket, error %d\n", WSAGetLastError());
7251 /* ConnectEx needs a bound socket */
7252 memset(&conaddress
, 0, sizeof(conaddress
));
7253 conaddress
.sin_family
= AF_INET
;
7254 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7255 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7257 skip("failed to bind, error %d\n", WSAGetLastError());
7261 if (acceptor
!= INVALID_SOCKET
) {
7262 closesocket(acceptor
);
7263 acceptor
= INVALID_SOCKET
;
7266 /* Connect with error */
7267 closesocket(listener
);
7268 listener
= INVALID_SOCKET
;
7270 address
.sin_port
= htons(1);
7272 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7273 ok(bret
== FALSE
&& GetLastError(), "ConnectEx to bad destination failed: "
7274 "returned %d + errno %d\n", bret
, GetLastError());
7276 if (GetLastError() == ERROR_IO_PENDING
)
7278 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7279 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7281 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7282 ok(bret
== FALSE
&& GetLastError() == ERROR_CONNECTION_REFUSED
,
7283 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
7286 ok(GetLastError() == WSAECONNREFUSED
,
7287 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
7291 if (overlapped
.hEvent
)
7292 WSACloseEvent(overlapped
.hEvent
);
7293 if (listener
!= INVALID_SOCKET
)
7294 closesocket(listener
);
7295 if (acceptor
!= INVALID_SOCKET
)
7296 closesocket(acceptor
);
7297 if (connector
!= INVALID_SOCKET
)
7298 closesocket(connector
);
7301 static void test_AcceptEx(void)
7303 SOCKET listener
= INVALID_SOCKET
;
7304 SOCKET acceptor
= INVALID_SOCKET
;
7305 SOCKET connector
= INVALID_SOCKET
;
7306 SOCKET connector2
= INVALID_SOCKET
;
7307 struct sockaddr_in bindAddress
, peerAddress
, *readBindAddress
, *readRemoteAddress
;
7308 int socklen
, optlen
;
7309 GUID acceptExGuid
= WSAID_ACCEPTEX
, getAcceptExGuid
= WSAID_GETACCEPTEXSOCKADDRS
;
7310 LPFN_ACCEPTEX pAcceptEx
= NULL
;
7311 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs
= NULL
;
7312 fd_set fds_accept
, fds_send
;
7313 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
7315 DWORD bytesReturned
, connect_time
;
7316 char buffer
[1024], ipbuffer
[32];
7317 OVERLAPPED overlapped
;
7318 int iret
, localSize
= sizeof(struct sockaddr_in
), remoteSize
= localSize
;
7322 memset(&overlapped
, 0, sizeof(overlapped
));
7324 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7325 if (listener
== INVALID_SOCKET
) {
7326 skip("could not create listener socket, error %d\n", WSAGetLastError());
7330 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7331 if (acceptor
== INVALID_SOCKET
) {
7332 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7336 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7337 if (connector
== INVALID_SOCKET
) {
7338 skip("could not create connector socket, error %d\n", WSAGetLastError());
7342 memset(&bindAddress
, 0, sizeof(bindAddress
));
7343 bindAddress
.sin_family
= AF_INET
;
7344 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7345 iret
= bind(listener
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7347 skip("failed to bind, error %d\n", WSAGetLastError());
7351 socklen
= sizeof(bindAddress
);
7352 iret
= getsockname(listener
, (struct sockaddr
*)&bindAddress
, &socklen
);
7354 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
7358 if (set_blocking(listener
, FALSE
)) {
7359 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7363 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
7364 &pAcceptEx
, sizeof(pAcceptEx
), &bytesReturned
, NULL
, NULL
);
7366 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret
, WSAGetLastError());
7370 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &getAcceptExGuid
, sizeof(getAcceptExGuid
),
7371 &pGetAcceptExSockaddrs
, sizeof(pGetAcceptExSockaddrs
), &bytesReturned
, NULL
, NULL
);
7373 skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret
, WSAGetLastError());
7377 bret
= pAcceptEx(INVALID_SOCKET
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7378 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7379 &bytesReturned
, &overlapped
);
7380 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid listening socket "
7381 "returned %d + errno %d\n", bret
, WSAGetLastError());
7383 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7384 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7385 &bytesReturned
, &overlapped
);
7387 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "AcceptEx on a non-listening socket "
7388 "returned %d + errno %d\n", bret
, WSAGetLastError());
7390 iret
= listen(listener
, 5);
7392 skip("listening failed, errno = %d\n", WSAGetLastError());
7396 bret
= pAcceptEx(listener
, INVALID_SOCKET
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7397 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7398 &bytesReturned
, &overlapped
);
7399 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid accepting socket "
7400 "returned %d + errno %d\n", bret
, WSAGetLastError());
7402 bret
= pAcceptEx(listener
, acceptor
, NULL
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7403 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7404 &bytesReturned
, &overlapped
);
7406 (WSAGetLastError() == WSAEINVAL
||
7407 broken(WSAGetLastError() == WSAEFAULT
)), /* NT4 */
7408 "AcceptEx on NULL buffer returned %d + errno %d\n", bret
, WSAGetLastError());
7410 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
7411 &bytesReturned
, &overlapped
);
7412 ok(bret
== FALSE
&& (WSAGetLastError() == ERROR_IO_PENDING
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7413 "AcceptEx on too small local address size returned %d + errno %d\n",
7414 bret
, WSAGetLastError());
7415 bret
= CancelIo((HANDLE
) listener
);
7416 ok(bret
, "Failed to cancel pending accept socket\n");
7418 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 15,
7419 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7420 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx on too small local address "
7421 "size returned %d + errno %d\n",
7422 bret
, WSAGetLastError());
7423 bret
= CancelIo((HANDLE
) listener
);
7424 ok(bret
, "Failed to cancel pending accept socket\n");
7426 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16, 0,
7427 &bytesReturned
, &overlapped
);
7428 ok(bret
== FALSE
&& (WSAGetLastError() == WSAEFAULT
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7429 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7431 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
7432 sizeof(struct sockaddr_in
) + 15, &bytesReturned
, &overlapped
);
7433 ok(bret
== FALSE
&& (WSAGetLastError() == ERROR_IO_PENDING
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7434 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7435 bret
= CancelIo((HANDLE
) listener
);
7436 ok(bret
, "Failed to cancel pending accept socket\n");
7438 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7439 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7440 &bytesReturned
, NULL
);
7441 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7442 "returned %d + errno %d\n", bret
, WSAGetLastError());
7444 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, 0, &bytesReturned
, NULL
);
7445 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7446 "returned %d + errno %d\n", bret
, WSAGetLastError());
7448 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7449 if (overlapped
.hEvent
== NULL
) {
7450 skip("could not create event object, errno = %d\n", GetLastError());
7454 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7455 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7456 &bytesReturned
, &overlapped
);
7457 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7459 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7460 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7461 &bytesReturned
, &overlapped
);
7462 todo_wine
ok((bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
) || broken(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
) /* NT4 */,
7463 "AcceptEx on already pending socket returned %d + errno %d\n", bret
, WSAGetLastError());
7464 if (bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
) {
7465 /* We need to cancel this call, otherwise things fail */
7466 bret
= CancelIo((HANDLE
) listener
);
7467 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7469 WaitForSingleObject(overlapped
.hEvent
, 0);
7471 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7472 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7473 &bytesReturned
, &overlapped
);
7474 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7477 iret
= connect(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7478 todo_wine
ok((iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
) || broken(!iret
) /* NT4 */,
7479 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret
, WSAGetLastError());
7480 if (!iret
|| (iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
)) {
7481 /* We need to cancel this call, otherwise things fail */
7482 closesocket(acceptor
);
7483 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7484 if (acceptor
== INVALID_SOCKET
) {
7485 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7489 bret
= CancelIo((HANDLE
) listener
);
7490 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7493 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7494 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7495 &bytesReturned
, &overlapped
);
7496 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7499 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7500 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7502 dwret
= WaitForSingleObject(overlapped
.hEvent
, INFINITE
);
7503 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7505 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7506 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7507 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7509 closesocket(connector
);
7510 connector
= INVALID_SOCKET
;
7511 closesocket(acceptor
);
7513 /* Test short reads */
7515 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7516 if (acceptor
== INVALID_SOCKET
) {
7517 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7520 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7521 if (connector
== INVALID_SOCKET
) {
7522 skip("could not create connector socket, error %d\n", WSAGetLastError());
7525 bret
= pAcceptEx(listener
, acceptor
, buffer
, 2,
7526 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7527 &bytesReturned
, &overlapped
);
7528 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7530 connect_time
= 0xdeadbeef;
7531 optlen
= sizeof(connect_time
);
7532 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7533 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7534 ok(connect_time
== ~0u, "unexpected connect time %u\n", connect_time
);
7536 /* AcceptEx() still won't complete until we send data */
7537 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7538 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7540 connect_time
= 0xdeadbeef;
7541 optlen
= sizeof(connect_time
);
7542 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7543 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7544 ok(connect_time
< 0xdeadbeef, "unexpected connect time %u\n", connect_time
);
7546 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7547 ok(dwret
== WAIT_TIMEOUT
, "Waiting for accept event timeout failed with %d + errno %d\n", dwret
, GetLastError());
7549 iret
= getsockname( connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
7550 ok( !iret
, "getsockname failed.\n");
7552 /* AcceptEx() could complete any time now */
7553 iret
= send(connector
, buffer
, 1, 0);
7554 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
7556 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7557 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7559 /* Check if the buffer from AcceptEx is decoded correctly */
7560 pGetAcceptExSockaddrs(buffer
, 2, sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7561 (struct sockaddr
**)&readBindAddress
, &localSize
,
7562 (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
7563 strcpy( ipbuffer
, inet_ntoa(readBindAddress
->sin_addr
));
7564 ok( readBindAddress
->sin_addr
.s_addr
== bindAddress
.sin_addr
.s_addr
,
7565 "Local socket address is different %s != %s\n",
7566 ipbuffer
, inet_ntoa(bindAddress
.sin_addr
));
7567 ok( readBindAddress
->sin_port
== bindAddress
.sin_port
,
7568 "Local socket port is different: %d != %d\n",
7569 readBindAddress
->sin_port
, bindAddress
.sin_port
);
7570 strcpy( ipbuffer
, inet_ntoa(readRemoteAddress
->sin_addr
));
7571 ok( readRemoteAddress
->sin_addr
.s_addr
== peerAddress
.sin_addr
.s_addr
,
7572 "Remote socket address is different %s != %s\n",
7573 ipbuffer
, inet_ntoa(peerAddress
.sin_addr
));
7574 ok( readRemoteAddress
->sin_port
== peerAddress
.sin_port
,
7575 "Remote socket port is different: %d != %d\n",
7576 readRemoteAddress
->sin_port
, peerAddress
.sin_port
);
7578 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7579 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7580 ok(bytesReturned
== 1, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7582 closesocket(connector
);
7583 connector
= INVALID_SOCKET
;
7584 closesocket(acceptor
);
7586 /* Test CF_DEFER & AcceptEx interaction */
7588 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7589 if (acceptor
== INVALID_SOCKET
) {
7590 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7593 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7594 if (connector
== INVALID_SOCKET
) {
7595 skip("could not create connector socket, error %d\n", WSAGetLastError());
7598 connector2
= socket(AF_INET
, SOCK_STREAM
, 0);
7599 if (connector
== INVALID_SOCKET
) {
7600 skip("could not create connector socket, error %d\n", WSAGetLastError());
7604 if (set_blocking(connector
, FALSE
)) {
7605 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7609 if (set_blocking(connector2
, FALSE
)) {
7610 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7614 /* Connect socket #1 */
7615 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7616 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7618 FD_ZERO ( &fds_accept
);
7619 FD_ZERO ( &fds_send
);
7621 FD_SET ( listener
, &fds_accept
);
7622 FD_SET ( connector
, &fds_send
);
7628 for (i
= 0; i
< 4000; ++i
)
7630 fd_set fds_openaccept
= fds_accept
, fds_opensend
= fds_send
;
7632 wsa_ok ( ( select ( 0, &fds_openaccept
, &fds_opensend
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
7633 "acceptex test(%d): could not select on socket, errno %d\n" );
7635 /* check for incoming requests */
7636 if ( FD_ISSET ( listener
, &fds_openaccept
) ) {
7639 SOCKET tmp
= WSAAccept(listener
, NULL
, NULL
, (LPCONDITIONPROC
) AlwaysDeferConditionFunc
, 0);
7640 ok(tmp
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
7641 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7642 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7643 &bytesReturned
, &overlapped
);
7644 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7646 else if (got
== 2) {
7647 /* this should be socket #2 */
7648 SOCKET tmp
= accept(listener
, NULL
, NULL
);
7649 ok(tmp
!= INVALID_SOCKET
, "accept failed %d\n", WSAGetLastError());
7653 ok(FALSE
, "Got more than 2 connections?\n");
7656 if ( conn1
&& FD_ISSET ( connector2
, &fds_opensend
) ) {
7657 /* Send data on second socket, and stop */
7658 send(connector2
, "2", 1, 0);
7659 FD_CLR ( connector2
, &fds_send
);
7663 if ( FD_ISSET ( connector
, &fds_opensend
) ) {
7664 /* Once #1 is connected, allow #2 to connect */
7667 send(connector
, "1", 1, 0);
7668 FD_CLR ( connector
, &fds_send
);
7670 iret
= connect(connector2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7671 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7672 FD_SET ( connector2
, &fds_send
);
7676 ok (got
== 2 || broken(got
== 1) /* NT4 */,
7677 "Did not get both connections, got %d\n", got
);
7679 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7680 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7682 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7683 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7684 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7686 set_blocking(acceptor
, TRUE
);
7687 iret
= recv( acceptor
, buffer
, 2, 0);
7688 ok(iret
== 1, "Failed to get data, %d, errno: %d\n", iret
, WSAGetLastError());
7690 ok(buffer
[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer
[0]);
7692 closesocket(connector
);
7693 connector
= INVALID_SOCKET
;
7694 closesocket(acceptor
);
7696 /* clean up in case of failures */
7697 while ((acceptor
= accept(listener
, NULL
, NULL
)) != INVALID_SOCKET
)
7698 closesocket(acceptor
);
7700 /* Disconnect during receive? */
7702 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7703 if (acceptor
== INVALID_SOCKET
) {
7704 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7707 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7708 if (connector
== INVALID_SOCKET
) {
7709 skip("could not create connector socket, error %d\n", WSAGetLastError());
7712 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7713 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7714 &bytesReturned
, &overlapped
);
7715 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7717 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7718 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7720 closesocket(connector
);
7721 connector
= INVALID_SOCKET
;
7723 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7724 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7726 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7727 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7728 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7730 closesocket(acceptor
);
7732 /* Test closing with pending requests */
7734 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7735 if (acceptor
== INVALID_SOCKET
) {
7736 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7739 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7740 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7741 &bytesReturned
, &overlapped
);
7742 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7744 closesocket(acceptor
);
7746 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7747 todo_wine
ok(dwret
== WAIT_OBJECT_0
|| broken(dwret
== WAIT_TIMEOUT
) /* NT4/2000 */,
7748 "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7750 if (dwret
!= WAIT_TIMEOUT
) {
7751 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7752 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7755 bret
= CancelIo((HANDLE
) listener
);
7756 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7758 WaitForSingleObject(overlapped
.hEvent
, 0);
7761 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7762 if (acceptor
== INVALID_SOCKET
) {
7763 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7766 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7767 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7768 &bytesReturned
, &overlapped
);
7769 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7771 CancelIo((HANDLE
) acceptor
);
7773 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7774 ok(dwret
== WAIT_TIMEOUT
, "Waiting for timeout failed with %d + errno %d\n", dwret
, GetLastError());
7776 closesocket(acceptor
);
7778 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7779 if (acceptor
== INVALID_SOCKET
) {
7780 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7783 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7784 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7785 &bytesReturned
, &overlapped
);
7786 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7788 closesocket(listener
);
7789 listener
= INVALID_SOCKET
;
7791 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7792 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7794 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7795 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7798 if (overlapped
.hEvent
)
7799 WSACloseEvent(overlapped
.hEvent
);
7800 if (listener
!= INVALID_SOCKET
)
7801 closesocket(listener
);
7802 if (acceptor
!= INVALID_SOCKET
)
7803 closesocket(acceptor
);
7804 if (connector
!= INVALID_SOCKET
)
7805 closesocket(connector
);
7806 if (connector2
!= INVALID_SOCKET
)
7807 closesocket(connector2
);
7810 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
7812 static void compare_file2(HANDLE handle
, SOCKET sock
, int offset
, const char *file
, int line
)
7814 char buf1
[256], buf2
[256];
7818 SetFilePointer(handle
, offset
, NULL
, FILE_BEGIN
);
7821 DWORD n1
= 0, n2
= 0;
7823 success
= ReadFile(handle
, buf1
, sizeof(buf1
), &n1
, NULL
);
7824 ok_(file
,line
)(success
, "Failed to read from file.\n");
7825 if (success
&& n1
== 0)
7829 n2
= recv(sock
, buf2
, n1
, 0);
7830 ok_(file
,line
)(n1
== n2
, "Block %d size mismatch (%d != %d)\n", i
, n1
, n2
);
7831 ok_(file
,line
)(memcmp(buf1
, buf2
, n2
) == 0, "Block %d failed\n", i
);
7836 static void test_TransmitFile(void)
7838 DWORD num_bytes
, err
, file_size
, total_sent
;
7839 GUID transmitFileGuid
= WSAID_TRANSMITFILE
;
7840 LPFN_TRANSMITFILE pTransmitFile
= NULL
;
7841 HANDLE file
= INVALID_HANDLE_VALUE
;
7842 char header_msg
[] = "hello world";
7843 char footer_msg
[] = "goodbye!!!";
7844 char system_ini_path
[MAX_PATH
];
7845 struct sockaddr_in bindAddress
;
7846 TRANSMIT_FILE_BUFFERS buffers
;
7847 SOCKET client
, server
, dest
;
7853 memset( &ov
, 0, sizeof(ov
) );
7855 /* Setup sockets for testing TransmitFile */
7856 client
= socket(AF_INET
, SOCK_STREAM
, 0);
7857 server
= socket(AF_INET
, SOCK_STREAM
, 0);
7858 if (client
== INVALID_SOCKET
|| server
== INVALID_SOCKET
)
7860 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7863 iret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &transmitFileGuid
, sizeof(transmitFileGuid
),
7864 &pTransmitFile
, sizeof(pTransmitFile
), &num_bytes
, NULL
, NULL
);
7867 skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret
, WSAGetLastError());
7870 GetSystemWindowsDirectoryA(system_ini_path
, MAX_PATH
);
7871 strcat(system_ini_path
, "\\system.ini");
7872 file
= CreateFileA(system_ini_path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
7873 if (file
== INVALID_HANDLE_VALUE
)
7875 skip("Unable to open a file to transmit.\n");
7878 file_size
= GetFileSize(file
, NULL
);
7880 /* Test TransmitFile with an invalid socket */
7881 bret
= pTransmitFile(INVALID_SOCKET
, file
, 0, 0, NULL
, NULL
, 0);
7882 err
= WSAGetLastError();
7883 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
7884 ok(err
== WSAENOTSOCK
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTSOCK
);
7886 /* Test a bogus TransmitFile without a connected socket */
7887 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, TF_REUSE_SOCKET
);
7888 err
= WSAGetLastError();
7889 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
7890 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
7892 /* Setup a properly connected socket for transfers */
7893 memset(&bindAddress
, 0, sizeof(bindAddress
));
7894 bindAddress
.sin_family
= AF_INET
;
7895 bindAddress
.sin_port
= htons(9375);
7896 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7897 iret
= bind(server
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7900 skip("failed to bind(), error %d\n", WSAGetLastError());
7903 iret
= listen(server
, 1);
7906 skip("failed to listen(), error %d\n", WSAGetLastError());
7909 iret
= connect(client
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7912 skip("failed to connect(), error %d\n", WSAGetLastError());
7915 len
= sizeof(bindAddress
);
7916 dest
= accept(server
, (struct sockaddr
*)&bindAddress
, &len
);
7917 if (dest
== INVALID_SOCKET
)
7919 skip("failed to accept(), error %d\n", WSAGetLastError());
7922 if (set_blocking(dest
, FALSE
))
7924 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7928 /* Test TransmitFile with no possible buffer */
7929 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
7930 ok(bret
, "TransmitFile failed unexpectedly.\n");
7931 iret
= recv(dest
, buf
, sizeof(buf
), 0);
7932 ok(iret
== -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret
);
7934 /* Test TransmitFile with only buffer data */
7935 buffers
.Head
= &header_msg
[0];
7936 buffers
.HeadLength
= sizeof(header_msg
)+1;
7937 buffers
.Tail
= &footer_msg
[0];
7938 buffers
.TailLength
= sizeof(footer_msg
)+1;
7939 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, &buffers
, 0);
7940 ok(bret
, "TransmitFile failed unexpectedly.\n");
7941 iret
= recv(dest
, buf
, sizeof(buf
), 0);
7942 ok(iret
== sizeof(header_msg
)+sizeof(footer_msg
)+2,
7943 "Returned an unexpected buffer from TransmitFile: %d\n", iret
);
7944 ok(memcmp(&buf
[0], &header_msg
[0], sizeof(header_msg
)+1) == 0,
7945 "TransmitFile header buffer did not match!\n");
7946 ok(memcmp(&buf
[sizeof(header_msg
)+1], &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
7947 "TransmitFile footer buffer did not match!\n");
7949 /* Test TransmitFile with only file data */
7950 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, NULL
, 0);
7951 ok(bret
, "TransmitFile failed unexpectedly.\n");
7952 compare_file(file
, dest
, 0);
7954 /* Test TransmitFile with both file and buffer data */
7955 buffers
.Head
= &header_msg
[0];
7956 buffers
.HeadLength
= sizeof(header_msg
)+1;
7957 buffers
.Tail
= &footer_msg
[0];
7958 buffers
.TailLength
= sizeof(footer_msg
)+1;
7959 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
7960 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, &buffers
, 0);
7961 ok(bret
, "TransmitFile failed unexpectedly.\n");
7962 iret
= recv(dest
, buf
, sizeof(header_msg
)+1, 0);
7963 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)+1) == 0,
7964 "TransmitFile header buffer did not match!\n");
7965 compare_file(file
, dest
, 0);
7966 iret
= recv(dest
, buf
, sizeof(footer_msg
)+1, 0);
7967 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
7968 "TransmitFile footer buffer did not match!\n");
7970 /* Test overlapped TransmitFile */
7971 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
7972 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
7974 skip("Could not create event object, some tests will be skipped. errno = %d\n",
7978 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
7979 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
7980 err
= WSAGetLastError();
7981 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
7982 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n",
7983 err
, ERROR_IO_PENDING
);
7984 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
7985 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
7986 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
7987 ok(total_sent
== file_size
,
7988 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
7989 total_sent
, file_size
);
7990 compare_file(file
, dest
, 0);
7992 /* Test overlapped TransmitFile w/ start offset */
7993 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
7994 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
7996 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
7999 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8001 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
8002 err
= WSAGetLastError();
8003 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8004 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8005 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8006 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8007 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8008 ok(total_sent
== (file_size
- ov
.Offset
),
8009 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8010 total_sent
, file_size
- ov
.Offset
);
8011 compare_file(file
, dest
, ov
.Offset
);
8013 /* Test overlapped TransmitFile w/ file and buffer data */
8014 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8015 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
8017 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
8020 buffers
.Head
= &header_msg
[0];
8021 buffers
.HeadLength
= sizeof(header_msg
)+1;
8022 buffers
.Tail
= &footer_msg
[0];
8023 buffers
.TailLength
= sizeof(footer_msg
)+1;
8024 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8026 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, &buffers
, 0);
8027 err
= WSAGetLastError();
8028 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8029 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8030 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8031 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8032 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8033 ok(total_sent
== (file_size
+ buffers
.HeadLength
+ buffers
.TailLength
),
8034 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8035 total_sent
, file_size
+ buffers
.HeadLength
+ buffers
.TailLength
);
8036 iret
= recv(dest
, buf
, sizeof(header_msg
)+1, 0);
8037 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)+1) == 0,
8038 "TransmitFile header buffer did not match!\n");
8039 compare_file(file
, dest
, 0);
8040 iret
= recv(dest
, buf
, sizeof(footer_msg
)+1, 0);
8041 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
8042 "TransmitFile footer buffer did not match!\n");
8044 /* Test TransmitFile with a UDP datagram socket */
8045 closesocket(client
);
8046 client
= socket(AF_INET
, SOCK_DGRAM
, 0);
8047 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
8048 err
= WSAGetLastError();
8049 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8050 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
8054 CloseHandle(ov
.hEvent
);
8055 closesocket(client
);
8056 closesocket(server
);
8059 static void test_getpeername(void)
8062 struct sockaddr_in sa
, sa_out
;
8063 SOCKADDR_STORAGE ss
;
8065 const char buf
[] = "hello world";
8068 /* Test the parameter validation order. */
8069 ret
= getpeername(INVALID_SOCKET
, NULL
, NULL
);
8070 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8071 ok(WSAGetLastError() == WSAENOTSOCK
,
8072 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
8074 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
8075 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8076 if (sock
== INVALID_SOCKET
)
8078 skip("Socket creation failed with %d\n", WSAGetLastError());
8082 ret
= getpeername(sock
, NULL
, NULL
);
8083 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8084 ok(WSAGetLastError() == WSAENOTCONN
||
8085 broken(WSAGetLastError() == WSAEFAULT
), /* Win9x and WinMe */
8086 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8088 memset(&sa
, 0, sizeof(sa
));
8089 sa
.sin_family
= AF_INET
;
8090 sa
.sin_port
= htons(139);
8091 sa
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8093 /* sendto does not change a socket's connection state. */
8094 ret
= sendto(sock
, buf
, sizeof(buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
8095 ok(ret
!= SOCKET_ERROR
,
8096 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8098 ret
= getpeername(sock
, NULL
, NULL
);
8099 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8100 ok(WSAGetLastError() == WSAENOTCONN
||
8101 broken(WSAGetLastError() == WSAEFAULT
), /* Win9x and WinMe */
8102 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8104 ret
= connect(sock
, (struct sockaddr
*)&sa
, sizeof(sa
));
8106 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8108 ret
= getpeername(sock
, NULL
, NULL
);
8109 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8110 ok(WSAGetLastError() == WSAEFAULT
,
8111 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8113 /* Test crashes on Wine. */
8116 ret
= getpeername(sock
, (void*)0xdeadbeef, (void*)0xcafebabe);
8117 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8118 ok(WSAGetLastError() == WSAEFAULT
,
8119 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8122 ret
= getpeername(sock
, (struct sockaddr
*)&sa_out
, NULL
);
8123 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8124 ok(WSAGetLastError() == WSAEFAULT
,
8125 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8128 ret
= getpeername(sock
, NULL
, &sa_len
);
8129 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8130 ok(WSAGetLastError() == WSAEFAULT
,
8131 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8132 ok(!sa_len
, "got %d\n", sa_len
);
8135 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8136 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8137 ok(WSAGetLastError() == WSAEFAULT
,
8138 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8139 ok(!sa_len
, "got %d\n", sa_len
);
8141 sa_len
= sizeof(ss
);
8142 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8143 ok(ret
== 0, "Expected getpeername to return 0, got %d\n", ret
);
8144 ok(!memcmp(&sa
, &ss
, sizeof(sa
)),
8145 "Expected the returned structure to be identical to the connect structure\n");
8146 ok(sa_len
== sizeof(sa
), "got %d\n", sa_len
);
8151 static void test_sioRoutingInterfaceQuery(void)
8155 SOCKADDR_IN sin
= { 0 }, sout
= { 0 };
8156 DWORD bytesReturned
;
8158 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
8159 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8160 if (sock
== INVALID_SOCKET
)
8162 skip("Socket creation failed with %d\n", WSAGetLastError());
8165 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, NULL
, 0, NULL
, 0, NULL
,
8167 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
8168 "expected WSAEFAULT, got %d\n", WSAGetLastError());
8169 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8170 NULL
, 0, NULL
, NULL
, NULL
);
8171 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
8172 "expected WSAEFAULT, got %d\n", WSAGetLastError());
8173 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8174 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8175 ok(ret
== SOCKET_ERROR
&&
8176 (WSAGetLastError() == WSAEFAULT
/* Win98 */ ||
8177 WSAGetLastError() == WSAEINVAL
/* NT4 */||
8178 WSAGetLastError() == WSAEAFNOSUPPORT
),
8179 "expected WSAEFAULT or WSAEINVAL or WSAEAFNOSUPPORT, got %d\n",
8181 sin
.sin_family
= AF_INET
;
8182 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8183 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8184 ok(ret
== SOCKET_ERROR
&&
8185 (WSAGetLastError() == WSAEFAULT
/* Win98 */ ||
8186 WSAGetLastError() == WSAEINVAL
),
8187 "expected WSAEFAULT or WSAEINVAL, got %d\n", WSAGetLastError());
8188 sin
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
8189 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8190 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8191 ok(ret
== SOCKET_ERROR
&&
8192 (WSAGetLastError() == WSAEINVAL
/* NT4 */ ||
8193 WSAGetLastError() == WSAEFAULT
),
8194 "expected WSAEINVAL or WSAEFAULT, got %d\n", WSAGetLastError());
8195 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8196 &sout
, sizeof(sout
), &bytesReturned
, NULL
, NULL
);
8197 ok(!ret
|| broken(WSAGetLastError() == WSAEINVAL
/* NT4 */),
8198 "WSAIoctl failed: %d\n", WSAGetLastError());
8201 ok(sout
.sin_family
== AF_INET
, "expected AF_INET, got %d\n",
8203 /* We expect the source address to be INADDR_LOOPBACK as well, but
8204 * there's no guarantee that a route to the loopback address exists,
8205 * so rather than introduce spurious test failures we do not test the
8212 static void test_sioAddressListChange(void)
8214 struct sockaddr_in bindAddress
;
8215 struct in_addr net_address
;
8216 WSAOVERLAPPED overlapped
;
8223 if (!winetest_interactive
)
8225 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
8229 /* Use gethostbyname to find the list of local network interfaces */
8230 h
= gethostbyname("");
8233 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n",
8237 for (acount
= 0; h
->h_addr_list
[acount
]; acount
++);
8240 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
8243 net_address
.s_addr
= *(ULONG
*) h
->h_addr_list
[0];
8245 /* Bind an overlapped socket to the first found network interface */
8246 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8247 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8248 if (sock
== INVALID_SOCKET
)
8250 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, socket creation failed with %u\n",
8254 memset(&bindAddress
, 0, sizeof(bindAddress
));
8255 bindAddress
.sin_family
= AF_INET
;
8256 bindAddress
.sin_addr
.s_addr
= net_address
.s_addr
;
8257 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8260 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, failed to bind, error %u\n", WSAGetLastError());
8264 /* Wait for address changes, request that the user connects/disconnects an interface */
8265 memset(&overlapped
, 0, sizeof(overlapped
));
8266 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8267 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8268 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
8269 ok(WSAGetLastError() == WSA_IO_PENDING
, "Expected pending last error %d\n", WSAGetLastError());
8270 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
8271 " change the ipv4 address of any of the local network interfaces (10 second timeout).\n");
8272 ret
= WaitForSingleObject(overlapped
.hEvent
, 10000);
8273 ok(ret
== WAIT_OBJECT_0
, "failed to get overlapped event %u\n", ret
);
8279 static void test_synchronous_WSAIoctl(void)
8281 HANDLE previous_port
, io_port
;
8282 WSAOVERLAPPED overlapped
, *olp
;
8290 previous_port
= CreateIoCompletionPort( INVALID_HANDLE_VALUE
, NULL
, 0, 0 );
8291 ok( previous_port
!= NULL
, "failed to create completion port %u\n", GetLastError() );
8293 socket
= WSASocketW( AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8294 ok( socket
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError() );
8296 io_port
= CreateIoCompletionPort( (HANDLE
)socket
, previous_port
, 0, 0 );
8297 ok( io_port
!= NULL
, "failed to create completion port %u\n", GetLastError() );
8300 memset( &overlapped
, 0, sizeof(overlapped
) );
8301 res
= WSAIoctl( socket
, FIONBIO
, &on
, sizeof(on
), NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8302 ok( !res
, "WSAIoctl failed %d\n", WSAGetLastError() );
8304 ret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 10000 );
8305 ok( ret
, "failed to get completion status %u\n", GetLastError() );
8307 CloseHandle( io_port
);
8308 closesocket( socket
);
8309 CloseHandle( previous_port
);
8312 #define WM_ASYNCCOMPLETE (WM_USER + 100)
8313 static HWND
create_async_message_window(void)
8315 static const char class_name
[] = "ws2_32 async message window class";
8317 WNDCLASSEXA wndclass
;
8320 wndclass
.cbSize
= sizeof(wndclass
);
8321 wndclass
.style
= CS_HREDRAW
| CS_VREDRAW
;
8322 wndclass
.lpfnWndProc
= DefWindowProcA
;
8323 wndclass
.cbClsExtra
= 0;
8324 wndclass
.cbWndExtra
= 0;
8325 wndclass
.hInstance
= GetModuleHandleA(NULL
);
8326 wndclass
.hIcon
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
8327 wndclass
.hIconSm
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
8328 wndclass
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_ARROW
);
8329 wndclass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
8330 wndclass
.lpszClassName
= class_name
;
8331 wndclass
.lpszMenuName
= NULL
;
8333 RegisterClassExA(&wndclass
);
8335 hWnd
= CreateWindowA(class_name
, "ws2_32 async message window", WS_OVERLAPPEDWINDOW
,
8336 0, 0, 500, 500, NULL
, NULL
, GetModuleHandleA(NULL
), NULL
);
8339 ok(0, "failed to create window: %u\n", GetLastError());
8346 static void test_WSAAsyncGetServByPort(void)
8348 HWND hwnd
= create_async_message_window();
8350 char buffer
[MAXGETHOSTSTRUCT
];
8355 /* FIXME: The asynchronous window messages should be tested. */
8357 /* Parameters are not checked when initiating the asynchronous operation. */
8358 ret
= WSAAsyncGetServByPort(NULL
, 0, 0, NULL
, NULL
, 0);
8359 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8361 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, 0, NULL
, NULL
, 0);
8362 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8364 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, htons(80), NULL
, NULL
, 0);
8365 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8367 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, htons(80), NULL
, buffer
, MAXGETHOSTSTRUCT
);
8368 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8370 DestroyWindow(hwnd
);
8373 static void test_WSAAsyncGetServByName(void)
8375 HWND hwnd
= create_async_message_window();
8377 char buffer
[MAXGETHOSTSTRUCT
];
8382 /* FIXME: The asynchronous window messages should be tested. */
8384 /* Parameters are not checked when initiating the asynchronous operation. */
8385 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "", NULL
, NULL
, 0);
8386 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8388 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "", "", buffer
, MAXGETHOSTSTRUCT
);
8389 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8391 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "http", NULL
, NULL
, 0);
8392 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8394 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "http", "tcp", buffer
, MAXGETHOSTSTRUCT
);
8395 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8397 DestroyWindow(hwnd
);
8401 * Provide consistent initialization for the AcceptEx IOCP tests.
8403 static SOCKET
setup_iocp_src(struct sockaddr_in
*bindAddress
)
8405 SOCKET src
, ret
= INVALID_SOCKET
;
8408 src
= socket(AF_INET
, SOCK_STREAM
, 0);
8409 if (src
== INVALID_SOCKET
)
8411 skip("could not create listener socket, error %d\n", WSAGetLastError());
8415 memset(bindAddress
, 0, sizeof(*bindAddress
));
8416 bindAddress
->sin_family
= AF_INET
;
8417 bindAddress
->sin_addr
.s_addr
= inet_addr("127.0.0.1");
8418 iret
= bind(src
, (struct sockaddr
*)bindAddress
, sizeof(*bindAddress
));
8421 skip("failed to bind, error %d\n", WSAGetLastError());
8425 socklen
= sizeof(*bindAddress
);
8426 iret
= getsockname(src
, (struct sockaddr
*)bindAddress
, &socklen
);
8428 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8432 if (set_blocking(src
, FALSE
))
8434 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8438 iret
= listen(src
, 5);
8441 skip("listening failed, errno = %d\n", WSAGetLastError());
8447 if (src
!= ret
&& ret
== INVALID_SOCKET
)
8452 static void test_completion_port(void)
8454 HANDLE previous_port
, io_port
;
8455 WSAOVERLAPPED ov
, *olp
;
8456 SOCKET src
, dest
, dup
, connector
= INVALID_SOCKET
;
8457 WSAPROTOCOL_INFOA info
;
8460 DWORD num_bytes
, flags
;
8465 struct sockaddr_in bindAddress
;
8466 GUID acceptExGuid
= WSAID_ACCEPTEX
;
8467 LPFN_ACCEPTEX pAcceptEx
= NULL
;
8469 memset(buf
, 0, sizeof(buf
));
8470 previous_port
= CreateIoCompletionPort(INVALID_HANDLE_VALUE
, NULL
, 0, 0);
8471 ok( previous_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8473 memset(&ov
, 0, sizeof(ov
));
8475 tcp_socketpair(&src
, &dest
);
8476 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
8478 skip("failed to create sockets\n");
8482 bufs
.len
= sizeof(buf
);
8488 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8489 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8491 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, previous_port
, 125, 0 );
8492 ok(io_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8494 SetLastError(0xdeadbeef);
8496 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8497 ok(iret
== SOCKET_ERROR
, "WSARecv returned %d\n", iret
);
8498 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8503 src
= INVALID_SOCKET
;
8505 SetLastError(0xdeadbeef);
8507 num_bytes
= 0xdeadbeef;
8508 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8510 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8511 todo_wine
ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8512 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
, "Last error was %d\n", GetLastError());
8513 ok(key
== 125, "Key is %lu\n", key
);
8514 ok(num_bytes
== 0, "Number of bytes received is %u\n", num_bytes
);
8515 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8517 SetLastError(0xdeadbeef);
8519 num_bytes
= 0xdeadbeef;
8520 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8522 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8523 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8524 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8525 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8526 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8527 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8529 if (dest
!= INVALID_SOCKET
)
8532 memset(&ov
, 0, sizeof(ov
));
8534 tcp_socketpair(&src
, &dest
);
8535 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
8537 skip("failed to create sockets\n");
8541 bufs
.len
= sizeof(buf
);
8547 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8548 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8550 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 125, 0);
8551 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8553 set_blocking(dest
, FALSE
);
8556 src
= INVALID_SOCKET
;
8560 num_bytes
= 0xdeadbeef;
8561 SetLastError(0xdeadbeef);
8563 iret
= WSASend(dest
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
8564 ok(iret
== SOCKET_ERROR
, "WSASend failed - %d\n", iret
);
8565 ok(GetLastError() == WSAECONNRESET
, "Last error was %d\n", GetLastError());
8566 ok(num_bytes
== 0xdeadbeef, "Managed to send %d\n", num_bytes
);
8568 SetLastError(0xdeadbeef);
8570 num_bytes
= 0xdeadbeef;
8571 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8573 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8574 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
8575 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8576 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8577 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8578 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8580 if (dest
!= INVALID_SOCKET
)
8583 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
8584 if (dest
== INVALID_SOCKET
)
8586 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8590 iret
= WSAIoctl(dest
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
8591 &pAcceptEx
, sizeof(pAcceptEx
), &num_bytes
, NULL
, NULL
);
8594 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret
, WSAGetLastError());
8598 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
8600 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8603 SetLastError(0xdeadbeef);
8605 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8606 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8608 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8609 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8611 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8612 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8615 src
= INVALID_SOCKET
;
8617 SetLastError(0xdeadbeef);
8619 num_bytes
= 0xdeadbeef;
8620 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8622 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8623 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8624 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8625 ok(key
== 125, "Key is %lu\n", key
);
8626 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8627 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8628 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8630 SetLastError(0xdeadbeef);
8632 num_bytes
= 0xdeadbeef;
8633 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8634 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8635 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8636 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8637 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8638 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8639 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8641 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
8643 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8646 SetLastError(0xdeadbeef);
8648 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8649 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8651 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8652 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8654 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8655 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8658 src
= INVALID_SOCKET
;
8660 SetLastError(0xdeadbeef);
8662 num_bytes
= 0xdeadbeef;
8663 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8665 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8666 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8667 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8668 ok(key
== 125, "Key is %lu\n", key
);
8669 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8670 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8671 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8673 SetLastError(0xdeadbeef);
8675 num_bytes
= 0xdeadbeef;
8676 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8677 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8678 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8679 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8680 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8681 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8682 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8684 /* Test IOCP with duplicated handle */
8686 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8689 SetLastError(0xdeadbeef);
8691 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8692 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8694 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8695 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8696 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8698 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8699 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8701 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8702 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8704 SetLastError(0xdeadbeef);
8706 num_bytes
= 0xdeadbeef;
8707 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8708 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8709 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8710 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8711 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8712 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8713 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8716 src
= INVALID_SOCKET
;
8718 dup
= INVALID_SOCKET
;
8720 SetLastError(0xdeadbeef);
8722 num_bytes
= 0xdeadbeef;
8723 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8724 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8725 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8726 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8727 ok(key
== 125, "Key is %lu\n", key
);
8728 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8729 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8730 ok(olp
&& olp
->Internal
== (ULONG
)STATUS_CANCELLED
, "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8732 SetLastError(0xdeadbeef);
8734 num_bytes
= 0xdeadbeef;
8735 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8736 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8737 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8738 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8739 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8740 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8741 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8743 /* Test IOCP with duplicated handle (closing duplicated handle) */
8745 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8748 SetLastError(0xdeadbeef);
8750 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8751 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8753 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8754 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8755 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8757 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8758 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8760 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8761 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8764 dup
= INVALID_SOCKET
;
8766 SetLastError(0xdeadbeef);
8768 num_bytes
= 0xdeadbeef;
8769 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8770 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8771 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8772 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8773 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8774 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8775 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8777 SetLastError(0xdeadbeef);
8779 num_bytes
= 0xdeadbeef;
8780 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8781 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8782 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8783 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8784 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8785 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8786 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8789 src
= INVALID_SOCKET
;
8791 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8792 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8793 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8794 ok(key
== 125, "Key is %lu\n", key
);
8795 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8796 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8797 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8799 SetLastError(0xdeadbeef);
8801 num_bytes
= 0xdeadbeef;
8802 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8803 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8804 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8805 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8806 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8807 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8808 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8810 /* Test IOCP with duplicated handle (closing original handle) */
8812 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8815 SetLastError(0xdeadbeef);
8817 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8818 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8820 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8821 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8822 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8824 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8825 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8827 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8828 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8831 src
= INVALID_SOCKET
;
8833 SetLastError(0xdeadbeef);
8835 num_bytes
= 0xdeadbeef;
8836 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8837 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8838 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8839 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8840 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8841 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8842 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8845 dup
= INVALID_SOCKET
;
8847 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8848 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8849 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8850 ok(key
== 125, "Key is %lu\n", key
);
8851 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8852 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8853 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8855 SetLastError(0xdeadbeef);
8857 num_bytes
= 0xdeadbeef;
8858 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8859 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8860 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8861 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8862 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8863 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8864 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8866 /* Test IOCP without AcceptEx */
8868 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8871 SetLastError(0xdeadbeef);
8873 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8874 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8877 src
= INVALID_SOCKET
;
8879 SetLastError(0xdeadbeef);
8881 num_bytes
= 0xdeadbeef;
8882 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8883 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8884 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8885 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8886 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8887 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8888 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8892 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8895 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8896 if (connector
== INVALID_SOCKET
) {
8897 skip("could not create connector socket, error %d\n", WSAGetLastError());
8901 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8902 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8904 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
8905 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8907 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8908 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8910 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8911 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8913 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8914 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
8916 closesocket(connector
);
8917 connector
= INVALID_SOCKET
;
8919 SetLastError(0xdeadbeef);
8921 num_bytes
= 0xdeadbeef;
8922 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8924 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8925 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
8926 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
8927 ok(key
== 125, "Key is %lu\n", key
);
8928 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8929 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8930 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8932 SetLastError(0xdeadbeef);
8934 num_bytes
= 0xdeadbeef;
8935 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8936 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8937 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8938 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8939 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8940 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8941 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8943 if (dest
!= INVALID_SOCKET
)
8945 if (src
!= INVALID_SOCKET
)
8950 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8953 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
8954 if (dest
== INVALID_SOCKET
)
8956 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8960 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
8961 if (connector
== INVALID_SOCKET
) {
8962 skip("could not create connector socket, error %d\n", WSAGetLastError());
8966 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8967 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8969 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
8970 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8972 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8973 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8975 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8976 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8978 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8979 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
8981 iret
= send(connector
, buf
, 1, 0);
8982 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
8987 dest
= INVALID_SOCKET
;
8989 SetLastError(0xdeadbeef);
8991 num_bytes
= 0xdeadbeef;
8992 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8994 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8995 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
8996 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
8997 ok(key
== 125, "Key is %lu\n", key
);
8998 ok(num_bytes
== 1, "Number of bytes transferred is %u\n", num_bytes
);
8999 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9000 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9002 SetLastError(0xdeadbeef);
9004 num_bytes
= 0xdeadbeef;
9005 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9006 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9007 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9008 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9009 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9010 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9011 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9013 if (src
!= INVALID_SOCKET
)
9015 if (connector
!= INVALID_SOCKET
)
9016 closesocket(connector
);
9020 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
9023 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
9024 if (dest
== INVALID_SOCKET
)
9026 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9030 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9031 if (connector
== INVALID_SOCKET
) {
9032 skip("could not create connector socket, error %d\n", WSAGetLastError());
9036 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
9037 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9039 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
9040 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9042 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9043 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9045 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9046 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9048 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9049 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9052 dest
= INVALID_SOCKET
;
9054 SetLastError(0xdeadbeef);
9056 num_bytes
= 0xdeadbeef;
9057 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9059 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9060 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9061 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
||
9062 GetLastError() == ERROR_OPERATION_ABORTED
||
9063 GetLastError() == ERROR_CONNECTION_ABORTED
||
9064 GetLastError() == ERROR_PIPE_NOT_CONNECTED
/* win 2000 */,
9065 "Last error was %d\n", GetLastError());
9066 ok(key
== 125, "Key is %lu\n", key
);
9067 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9068 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9069 todo_wine
ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
||
9070 olp
->Internal
== (ULONG
)STATUS_CANCELLED
||
9071 olp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
||
9072 olp
->Internal
== (ULONG
)STATUS_PIPE_DISCONNECTED
/* win 2000 */),
9073 "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9075 SetLastError(0xdeadbeef);
9077 num_bytes
= 0xdeadbeef;
9078 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9079 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9080 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9081 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9082 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9083 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9084 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9088 if (dest
!= INVALID_SOCKET
)
9090 if (src
!= INVALID_SOCKET
)
9092 if (connector
!= INVALID_SOCKET
)
9093 closesocket(connector
);
9094 CloseHandle(previous_port
);
9097 static void test_address_list_query(void)
9099 SOCKET_ADDRESS_LIST
*address_list
;
9100 DWORD bytes_returned
, size
;
9105 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9106 ok(s
!= INVALID_SOCKET
, "Failed to create socket, error %d.\n", WSAGetLastError());
9109 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, 0, &bytes_returned
, NULL
, NULL
);
9110 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9111 if(WSAGetLastError() == WSAEINVAL
)
9113 win_skip("Windows <= NT4 is not supported in this test\n");
9117 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9118 ok(bytes_returned
>= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]),
9119 "Got unexpected bytes_returned %u.\n", bytes_returned
);
9121 size
= bytes_returned
;
9123 address_list
= HeapAlloc(GetProcessHeap(), 0, size
* 2);
9124 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, size
* 2, &bytes_returned
, NULL
, NULL
);
9125 ok(!ret
, "Got unexpected ret %d, error %d.\n", ret
, WSAGetLastError());
9126 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9128 bytes_returned
= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[address_list
->iAddressCount
]);
9129 for (i
= 0; i
< address_list
->iAddressCount
; ++i
)
9131 bytes_returned
+= address_list
->Address
[i
].iSockaddrLength
;
9133 ok(size
== bytes_returned
, "Got unexpected size %u, expected %u.\n", size
, bytes_returned
);
9135 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, size
, NULL
, NULL
, NULL
);
9136 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9137 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9139 bytes_returned
= 0xdeadbeef;
9140 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, size
, &bytes_returned
, NULL
, NULL
);
9141 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9142 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9143 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9145 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, 1, &bytes_returned
, NULL
, NULL
);
9146 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9147 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
9148 ok(bytes_returned
== 0, "Got unexpected bytes_returned %u.\n", bytes_returned
);
9150 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
,
9151 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &bytes_returned
, NULL
, NULL
);
9152 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9153 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9154 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9156 HeapFree(GetProcessHeap(), 0, address_list
);
9160 static DWORD WINAPI
inet_ntoa_thread_proc(void *param
)
9164 HANDLE
*event
= param
;
9166 addr
= inet_addr("4.3.2.1");
9167 ok(addr
== htonl(0x04030201), "expected 0x04030201, got %08x\n", addr
);
9168 str
= inet_ntoa(*(struct in_addr
*)&addr
);
9169 ok(!strcmp(str
, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str
);
9172 WaitForSingleObject(event
[1], 3000);
9177 static void test_inet_ntoa(void)
9181 HANDLE thread
, event
[2];
9184 addr
= inet_addr("1.2.3.4");
9185 ok(addr
== htonl(0x01020304), "expected 0x01020304, got %08x\n", addr
);
9186 str
= inet_ntoa(*(struct in_addr
*)&addr
);
9187 ok(!strcmp(str
, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str
);
9189 event
[0] = CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
9190 event
[1] = CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
9192 thread
= CreateThread(NULL
, 0, inet_ntoa_thread_proc
, event
, 0, &tid
);
9193 WaitForSingleObject(event
[0], 3000);
9195 ok(!strcmp(str
, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str
);
9198 WaitForSingleObject(thread
, 3000);
9200 CloseHandle(event
[0]);
9201 CloseHandle(event
[1]);
9202 CloseHandle(thread
);
9205 static void test_WSALookupService(void)
9207 char buffer
[4096], strbuff
[128];
9208 WSAQUERYSETW
*qs
= NULL
;
9212 DWORD error
, offset
, bsize
;
9214 if (!pWSALookupServiceBeginW
|| !pWSALookupServiceEnd
|| !pWSALookupServiceNextW
)
9216 win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n");
9220 qs
= (WSAQUERYSETW
*)buffer
;
9221 memset(qs
, 0, sizeof(*qs
));
9223 /* invalid parameter tests */
9224 ret
= pWSALookupServiceBeginW(NULL
, 0, &hnd
);
9225 error
= WSAGetLastError();
9226 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9228 ok(error
== WSAEFAULT
, "expected 10014, got %d\n", error
);
9230 ret
= pWSALookupServiceBeginW(qs
, 0, NULL
);
9231 error
= WSAGetLastError();
9232 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9234 ok(error
== WSAEFAULT
, "expected 10014, got %d\n", error
);
9236 ret
= pWSALookupServiceBeginW(qs
, 0, &hnd
);
9237 error
= WSAGetLastError();
9238 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9240 ok(error
== WSAEINVAL
9241 || broken(error
== ERROR_INVALID_PARAMETER
) /* == XP */
9242 || broken(error
== WSAEFAULT
) /* == NT */
9243 || broken(error
== WSASERVICE_NOT_FOUND
) /* == 2000 */,
9244 "expected 10022, got %d\n", error
);
9246 ret
= pWSALookupServiceEnd(NULL
);
9247 error
= WSAGetLastError();
9249 ok(ret
== SOCKET_ERROR
, "WSALookupServiceEnd should have failed\n");
9251 ok(error
== ERROR_INVALID_HANDLE
, "expected 6, got %d\n", error
);
9253 /* standard network list query */
9254 qs
->dwSize
= sizeof(*qs
);
9255 hnd
= (HANDLE
)0xdeadbeef;
9256 ret
= pWSALookupServiceBeginW(qs
, LUP_RETURN_ALL
| LUP_DEEP
, &hnd
);
9257 error
= WSAGetLastError();
9258 if(ret
&& error
== ERROR_INVALID_PARAMETER
)
9260 win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n");
9265 ok(!ret
, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error
);
9267 ok(hnd
!= (HANDLE
)0xdeadbeef, "Handle was not filled\n");
9272 memset(qs
, 0, sizeof(*qs
));
9273 bsize
= sizeof(buffer
);
9275 if (pWSALookupServiceNextW(hnd
, 0, &bsize
, qs
) == SOCKET_ERROR
)
9277 error
= WSAGetLastError();
9278 if (error
== WSA_E_NO_MORE
) break;
9279 ok(0, "Error %d happened while listing services\n", error
);
9283 WideCharToMultiByte(CP_ACP
, 0, qs
->lpszServiceInstanceName
, -1,
9284 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9285 trace("Network Name: %s\n", strbuff
);
9287 /* network data is written in the blob field */
9290 /* each network may have multiple NLA_BLOB information structures */
9293 netdata
= (PNLA_BLOB
) &qs
->lpBlob
->pBlobData
[offset
];
9294 switch (netdata
->header
.type
)
9297 trace("\tNLA Data Type: NLA_RAW_DATA\n");
9300 trace("\tNLA Data Type: NLA_INTERFACE\n");
9301 trace("\t\tType: %d\n", netdata
->data
.interfaceData
.dwType
);
9302 trace("\t\tSpeed: %d\n", netdata
->data
.interfaceData
.dwSpeed
);
9303 trace("\t\tAdapter Name: %s\n", netdata
->data
.interfaceData
.adapterName
);
9305 case NLA_802_1X_LOCATION
:
9306 trace("\tNLA Data Type: NLA_802_1X_LOCATION\n");
9307 trace("\t\tInformation: %s\n", netdata
->data
.locationData
.information
);
9309 case NLA_CONNECTIVITY
:
9310 switch (netdata
->data
.connectivity
.type
)
9312 case NLA_NETWORK_AD_HOC
:
9313 trace("\t\tNetwork Type: AD HOC\n");
9315 case NLA_NETWORK_MANAGED
:
9316 trace("\t\tNetwork Type: Managed\n");
9318 case NLA_NETWORK_UNMANAGED
:
9319 trace("\t\tNetwork Type: Unmanaged\n");
9321 case NLA_NETWORK_UNKNOWN
:
9322 trace("\t\tNetwork Type: Unknown\n");
9324 switch (netdata
->data
.connectivity
.internet
)
9326 case NLA_INTERNET_NO
:
9327 trace("\t\tInternet connectivity: No\n");
9329 case NLA_INTERNET_YES
:
9330 trace("\t\tInternet connectivity: Yes\n");
9332 case NLA_INTERNET_UNKNOWN
:
9333 trace("\t\tInternet connectivity: Unknown\n");
9338 trace("\tNLA Data Type: NLA_ICS\n");
9339 trace("\t\tSpeed: %d\n",
9340 netdata
->data
.ICS
.remote
.speed
);
9341 trace("\t\tType: %d\n",
9342 netdata
->data
.ICS
.remote
.type
);
9343 trace("\t\tState: %d\n",
9344 netdata
->data
.ICS
.remote
.state
);
9345 WideCharToMultiByte(CP_ACP
, 0, netdata
->data
.ICS
.remote
.machineName
, -1,
9346 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9347 trace("\t\tMachine Name: %s\n", strbuff
);
9348 WideCharToMultiByte(CP_ACP
, 0, netdata
->data
.ICS
.remote
.sharedAdapterName
, -1,
9349 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9350 trace("\t\tShared Adapter Name: %s\n", strbuff
);
9353 trace("\tNLA Data Type: Unknown\n");
9362 ret
= pWSALookupServiceEnd(hnd
);
9363 ok(!ret
, "WSALookupServiceEnd failed unexpectedly\n");
9366 static void test_WSAEnumNameSpaceProvidersA(void)
9368 LPWSANAMESPACE_INFOA name
= NULL
;
9369 DWORD ret
, error
, blen
= 0, i
;
9370 if (!pWSAEnumNameSpaceProvidersA
)
9372 win_skip("WSAEnumNameSpaceProvidersA not found\n");
9376 SetLastError(0xdeadbeef);
9377 ret
= pWSAEnumNameSpaceProvidersA(&blen
, name
);
9378 error
= WSAGetLastError();
9380 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9382 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9384 /* Invalid parameter tests */
9385 SetLastError(0xdeadbeef);
9386 ret
= pWSAEnumNameSpaceProvidersA(NULL
, name
);
9387 error
= WSAGetLastError();
9389 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9391 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9393 SetLastError(0xdeadbeef);
9394 ret
= pWSAEnumNameSpaceProvidersA(NULL
, NULL
);
9395 error
= WSAGetLastError();
9397 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9399 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9401 SetLastError(0xdeadbeef);
9402 ret
= pWSAEnumNameSpaceProvidersA(&blen
, NULL
);
9403 error
= WSAGetLastError();
9405 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9407 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9409 name
= HeapAlloc(GetProcessHeap(), 0, blen
);
9412 skip("Failed to alloc memory\n");
9416 ret
= pWSAEnumNameSpaceProvidersA(&blen
, name
);
9418 ok(ret
> 0, "Expected more than zero name space providers\n");
9420 for (i
= 0;i
< ret
; i
++)
9422 trace("Name space Identifier (%p): %s\n", name
[i
].lpszIdentifier
,
9423 name
[i
].lpszIdentifier
);
9424 switch (name
[i
].dwNameSpace
)
9427 trace("\tName space ID: NS_DNS (%u)\n", name
[i
].dwNameSpace
);
9430 trace("\tName space ID: NS_NLA (%u)\n", name
[i
].dwNameSpace
);
9433 trace("\tName space ID: Unknown (%u)\n", name
[i
].dwNameSpace
);
9436 trace("\tActive: %d\n", name
[i
].fActive
);
9437 trace("\tVersion: %d\n", name
[i
].dwVersion
);
9440 HeapFree(GetProcessHeap(), 0, name
);
9443 static void test_WSAEnumNameSpaceProvidersW(void)
9445 LPWSANAMESPACE_INFOW name
= NULL
;
9446 DWORD ret
, error
, blen
= 0, i
;
9447 if (!pWSAEnumNameSpaceProvidersW
)
9449 win_skip("WSAEnumNameSpaceProvidersW not found\n");
9453 SetLastError(0xdeadbeef);
9454 ret
= pWSAEnumNameSpaceProvidersW(&blen
, name
);
9455 error
= WSAGetLastError();
9457 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9459 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9461 /* Invalid parameter tests */
9462 SetLastError(0xdeadbeef);
9463 ret
= pWSAEnumNameSpaceProvidersW(NULL
, name
);
9464 error
= WSAGetLastError();
9466 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9468 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9470 SetLastError(0xdeadbeef);
9471 ret
= pWSAEnumNameSpaceProvidersW(NULL
, NULL
);
9472 error
= WSAGetLastError();
9474 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9476 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9478 SetLastError(0xdeadbeef);
9479 ret
= pWSAEnumNameSpaceProvidersW(&blen
, NULL
);
9480 error
= WSAGetLastError();
9482 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9484 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9486 name
= HeapAlloc(GetProcessHeap(), 0, blen
);
9489 skip("Failed to alloc memory\n");
9493 ret
= pWSAEnumNameSpaceProvidersW(&blen
, name
);
9495 ok(ret
> 0, "Expected more than zero name space providers\n");
9497 for (i
= 0;i
< ret
; i
++)
9499 trace("Name space Identifier (%p): %s\n", name
[i
].lpszIdentifier
,
9500 wine_dbgstr_w(name
[i
].lpszIdentifier
));
9501 switch (name
[i
].dwNameSpace
)
9504 trace("\tName space ID: NS_DNS (%u)\n", name
[i
].dwNameSpace
);
9507 trace("\tName space ID: NS_NLA (%u)\n", name
[i
].dwNameSpace
);
9510 trace("\tName space ID: Unknown (%u)\n", name
[i
].dwNameSpace
);
9513 trace("\tActive: %d\n", name
[i
].fActive
);
9514 trace("\tVersion: %d\n", name
[i
].dwVersion
);
9517 HeapFree(GetProcessHeap(), 0, name
);
9520 /**************** Main program ***************/
9526 /* Leave these tests at the beginning. They depend on WSAStartup not having been
9527 * called, which is done by Init() below. */
9528 test_WithoutWSAStartup();
9529 test_WithWSAStartup();
9535 test_set_getsockopt();
9536 test_so_reuseaddr();
9538 test_extendedSocketOptions();
9540 for (i
= 0; i
< sizeof(tests
)/sizeof(tests
[0]); i
++)
9542 trace ( " **** STARTING TEST %d ****\n", i
);
9543 do_test ( &tests
[i
] );
9544 trace ( " **** TEST %d COMPLETE ****\n", i
);
9549 test_getservbyname();
9551 test_WSADuplicateSocket();
9552 test_WSAEnumNetworkEvents();
9554 test_WSAAddressToStringA();
9555 test_WSAAddressToStringW();
9557 test_WSAStringToAddressA();
9558 test_WSAStringToAddressW();
9567 test_addr_to_print();
9570 test_gethostbyname();
9571 test_gethostbyname_hack();
9583 test_TransmitFile();
9584 test_GetAddrInfoW();
9589 test_sioRoutingInterfaceQuery();
9590 test_sioAddressListChange();
9592 test_WSALookupService();
9593 test_WSAEnumNameSpaceProvidersA();
9594 test_WSAEnumNameSpaceProvidersW();
9596 test_WSAAsyncGetServByPort();
9597 test_WSAAsyncGetServByName();
9599 test_completion_port();
9600 test_address_list_query();
9602 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
9604 test_synchronous_WSAIoctl();