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 PCWSTR(WINAPI
*pInetNtopW
)(INT
,LPVOID
,LPWSTR
,ULONG
);
72 static int (WINAPI
*pInetPtonA
)(INT
,LPCSTR
,LPVOID
);
73 static int (WINAPI
*pInetPtonW
)(INT
,LPWSTR
,LPVOID
);
74 static int (WINAPI
*pWSALookupServiceBeginW
)(LPWSAQUERYSETW
,DWORD
,LPHANDLE
);
75 static int (WINAPI
*pWSALookupServiceEnd
)(HANDLE
);
76 static int (WINAPI
*pWSALookupServiceNextW
)(HANDLE
,DWORD
,LPDWORD
,LPWSAQUERYSETW
);
77 static int (WINAPI
*pWSAEnumNameSpaceProvidersA
)(LPDWORD
,LPWSANAMESPACE_INFOA
);
78 static int (WINAPI
*pWSAEnumNameSpaceProvidersW
)(LPDWORD
,LPWSANAMESPACE_INFOW
);
79 static int (WINAPI
*pWSAPoll
)(WSAPOLLFD
*,ULONG
,INT
);
81 /* Function pointers from iphlpapi */
82 static DWORD (WINAPI
*pGetAdaptersInfo
)(PIP_ADAPTER_INFO
,PULONG
);
83 static DWORD (WINAPI
*pGetIpForwardTable
)(PMIB_IPFORWARDTABLE
,PULONG
,BOOL
);
85 /**************** Structs and typedefs ***************/
87 typedef struct thread_info
93 /* Information in the server about open client connections */
94 typedef struct sock_info
97 struct sockaddr_in addr
;
98 struct sockaddr_in peer
;
104 /* Test parameters for both server & client */
105 typedef struct test_params
109 const char *inet_addr
;
116 /* server-specific test parameters */
117 typedef struct server_params
119 test_params
*general
;
124 /* client-specific test parameters */
125 typedef struct client_params
127 test_params
*general
;
132 /* This type combines all information for setting up a test scenario */
133 typedef struct test_setup
137 server_params srv_params
;
139 client_params clt_params
;
142 /* Thread local storage for server */
143 typedef struct server_memory
146 struct sockaddr_in addr
;
147 sock_info sock
[MAX_CLIENTS
];
150 /* Thread local storage for client */
151 typedef struct client_memory
154 struct sockaddr_in addr
;
159 /* SelectReadThread thread parameters */
160 typedef struct select_thread_params
164 } select_thread_params
;
166 /* Tests used in both getaddrinfo and GetAddrInfoW */
167 static const struct addr_hint_tests
169 int family
, socktype
, protocol
;
172 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_TCP
, 0 },
173 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_UDP
, 0 },
174 {AF_UNSPEC
, SOCK_STREAM
, IPPROTO_IPV6
,0 },
175 {AF_UNSPEC
, SOCK_DGRAM
, IPPROTO_TCP
, 0 },
176 {AF_UNSPEC
, SOCK_DGRAM
, IPPROTO_UDP
, 0 },
177 {AF_UNSPEC
, SOCK_DGRAM
, IPPROTO_IPV6
,0 },
178 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, 0 },
179 {AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, 0 },
180 {AF_INET
, SOCK_STREAM
, IPPROTO_IPV6
,0 },
181 {AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, 0 },
182 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, 0 },
183 {AF_INET
, SOCK_DGRAM
, IPPROTO_IPV6
,0 },
184 {AF_UNSPEC
, 0, IPPROTO_TCP
, 0 },
185 {AF_UNSPEC
, 0, IPPROTO_UDP
, 0 },
186 {AF_UNSPEC
, 0, IPPROTO_IPV6
,0 },
187 {AF_UNSPEC
, SOCK_STREAM
, 0, 0 },
188 {AF_UNSPEC
, SOCK_DGRAM
, 0, 0 },
189 {AF_INET
, 0, IPPROTO_TCP
, 0 },
190 {AF_INET
, 0, IPPROTO_UDP
, 0 },
191 {AF_INET
, 0, IPPROTO_IPV6
,0 },
192 {AF_INET
, SOCK_STREAM
, 0, 0 },
193 {AF_INET
, SOCK_DGRAM
, 0, 0 },
194 {AF_UNSPEC
, 999, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
195 {AF_UNSPEC
, 999, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
196 {AF_UNSPEC
, 999, IPPROTO_IPV6
,WSAESOCKTNOSUPPORT
},
197 {AF_INET
, 999, IPPROTO_TCP
, WSAESOCKTNOSUPPORT
},
198 {AF_INET
, 999, IPPROTO_UDP
, WSAESOCKTNOSUPPORT
},
199 {AF_INET
, 999, IPPROTO_IPV6
,WSAESOCKTNOSUPPORT
},
200 {AF_UNSPEC
, SOCK_STREAM
, 999, 0 },
201 {AF_UNSPEC
, SOCK_STREAM
, 999, 0 },
202 {AF_INET
, SOCK_DGRAM
, 999, 0 },
203 {AF_INET
, SOCK_DGRAM
, 999, 0 },
206 /**************** Static variables ***************/
208 static DWORD tls
; /* Thread local storage index */
209 static HANDLE thread
[1+MAX_CLIENTS
];
210 static DWORD thread_id
[1+MAX_CLIENTS
];
211 static HANDLE server_ready
;
212 static HANDLE client_ready
[MAX_CLIENTS
];
213 static int client_id
;
215 /**************** General utility functions ***************/
217 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
);
218 static SOCKET
setup_connector_socket(struct sockaddr_in
*addr
, int len
, BOOL nonblock
);
220 static int tcp_socketpair(SOCKET
*src
, SOCKET
*dst
)
222 SOCKET server
= INVALID_SOCKET
;
223 struct sockaddr_in addr
;
227 *src
= INVALID_SOCKET
;
228 *dst
= INVALID_SOCKET
;
230 *src
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
231 if (*src
== INVALID_SOCKET
)
234 server
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
235 if (server
== INVALID_SOCKET
)
238 memset(&addr
, 0, sizeof(addr
));
239 addr
.sin_family
= AF_INET
;
240 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
241 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
246 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
250 ret
= listen(server
, 1);
254 ret
= connect(*src
, (struct sockaddr
*)&addr
, sizeof(addr
));
259 *dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
262 if (server
!= INVALID_SOCKET
)
264 if (*src
!= INVALID_SOCKET
&& *dst
!= INVALID_SOCKET
)
271 static void set_so_opentype ( BOOL overlapped
)
273 int optval
= !overlapped
, newval
, len
= sizeof (int);
275 ok ( setsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
276 (LPVOID
) &optval
, sizeof (optval
) ) == 0,
277 "setting SO_OPENTYPE failed\n" );
278 ok ( getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
,
279 (LPVOID
) &newval
, &len
) == 0,
280 "getting SO_OPENTYPE failed\n" );
281 ok ( optval
== newval
, "failed to set SO_OPENTYPE\n" );
284 static int set_blocking ( SOCKET s
, BOOL blocking
)
286 u_long val
= !blocking
;
287 return ioctlsocket ( s
, FIONBIO
, &val
);
290 static void fill_buffer ( char *buf
, int chunk_size
, int n_chunks
)
293 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
294 memset ( p
, c
, chunk_size
);
297 static int test_buffer ( char *buf
, int chunk_size
, int n_chunks
)
301 for ( c
= FIRST_CHAR
, p
= buf
; c
< FIRST_CHAR
+ n_chunks
; c
++, p
+= chunk_size
)
303 for ( i
= 0; i
< chunk_size
; i
++ )
304 if ( p
[i
] != c
) return i
;
310 * This routine is called when a client / server does not expect any more data,
311 * but needs to acknowledge the closing of the connection (by reading 0 bytes).
313 static void read_zero_bytes ( SOCKET s
)
317 while ( ( tmp
= recv ( s
, buf
, 256, 0 ) ) > 0 )
319 ok ( n
<= 0, "garbage data received: %d bytes\n", n
);
322 static int do_synchronous_send ( SOCKET s
, char *buf
, int buflen
, int flags
, int sendlen
)
324 char* last
= buf
+ buflen
, *p
;
326 for ( p
= buf
; n
> 0 && p
< last
; )
328 n
= send ( s
, p
, min ( sendlen
, last
- p
), flags
);
331 wsa_ok ( n
, 0 <=, "do_synchronous_send (%x): error %d\n" );
335 static int do_synchronous_recv ( SOCKET s
, char *buf
, int buflen
, int flags
, int recvlen
)
337 char* last
= buf
+ buflen
, *p
;
339 for ( p
= buf
; n
> 0 && p
< last
; )
341 n
= recv ( s
, p
, min ( recvlen
, last
- p
), flags
);
344 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
348 static int do_synchronous_recvfrom ( SOCKET s
, char *buf
, int buflen
, int flags
, struct sockaddr
*from
, int *fromlen
, int recvlen
)
350 char* last
= buf
+ buflen
, *p
;
352 for ( p
= buf
; n
> 0 && p
< last
; )
354 n
= recvfrom ( s
, p
, min ( recvlen
, last
- p
), flags
, from
, fromlen
);
357 wsa_ok ( n
, 0 <=, "do_synchronous_recv (%x): error %d:\n" );
362 * Call this routine right after thread startup.
363 * SO_OPENTYPE must by 0, regardless what the server did.
365 static void check_so_opentype (void)
369 getsockopt ( INVALID_SOCKET
, SOL_SOCKET
, SO_OPENTYPE
, (LPVOID
) &tmp
, &len
);
370 ok ( tmp
== 0, "check_so_opentype: wrong startup value of SO_OPENTYPE: %d\n", tmp
);
373 static void compare_addrinfo (ADDRINFO
*a
, ADDRINFO
*b
)
375 for (; a
&& b
; a
= a
->ai_next
, b
= b
->ai_next
)
377 ok(a
->ai_flags
== b
->ai_flags
,
378 "Wrong flags %d != %d\n", a
->ai_flags
, b
->ai_flags
);
379 ok(a
->ai_family
== b
->ai_family
,
380 "Wrong family %d != %d\n", a
->ai_family
, b
->ai_family
);
381 ok(a
->ai_socktype
== b
->ai_socktype
,
382 "Wrong socktype %d != %d\n", a
->ai_socktype
, b
->ai_socktype
);
383 ok(a
->ai_protocol
== b
->ai_protocol
,
384 "Wrong protocol %d != %d\n", a
->ai_protocol
, b
->ai_protocol
);
385 ok(a
->ai_addrlen
== b
->ai_addrlen
,
386 "Wrong addrlen %lu != %lu\n", a
->ai_addrlen
, b
->ai_addrlen
);
387 ok(!memcmp(a
->ai_addr
, b
->ai_addr
, min(a
->ai_addrlen
, b
->ai_addrlen
)),
388 "Wrong address data\n");
389 if (a
->ai_canonname
&& b
->ai_canonname
)
391 ok(!strcmp(a
->ai_canonname
, b
->ai_canonname
), "Wrong canonical name '%s' != '%s'\n",
392 a
->ai_canonname
, b
->ai_canonname
);
395 ok(!a
->ai_canonname
&& !b
->ai_canonname
, "Expected both names absent (%p != %p)\n",
396 a
->ai_canonname
, b
->ai_canonname
);
398 ok(!a
&& !b
, "Expected both addresses null (%p != %p)\n", a
, b
);
401 static void compare_addrinfow (ADDRINFOW
*a
, ADDRINFOW
*b
)
403 for (; a
&& b
; a
= a
->ai_next
, b
= b
->ai_next
)
405 ok(a
->ai_flags
== b
->ai_flags
,
406 "Wrong flags %d != %d\n", a
->ai_flags
, b
->ai_flags
);
407 ok(a
->ai_family
== b
->ai_family
,
408 "Wrong family %d != %d\n", a
->ai_family
, b
->ai_family
);
409 ok(a
->ai_socktype
== b
->ai_socktype
,
410 "Wrong socktype %d != %d\n", a
->ai_socktype
, b
->ai_socktype
);
411 ok(a
->ai_protocol
== b
->ai_protocol
,
412 "Wrong protocol %d != %d\n", a
->ai_protocol
, b
->ai_protocol
);
413 ok(a
->ai_addrlen
== b
->ai_addrlen
,
414 "Wrong addrlen %lu != %lu\n", a
->ai_addrlen
, b
->ai_addrlen
);
415 ok(!memcmp(a
->ai_addr
, b
->ai_addr
, min(a
->ai_addrlen
, b
->ai_addrlen
)),
416 "Wrong address data\n");
417 if (a
->ai_canonname
&& b
->ai_canonname
)
419 ok(!lstrcmpW(a
->ai_canonname
, b
->ai_canonname
), "Wrong canonical name '%s' != '%s'\n",
420 wine_dbgstr_w(a
->ai_canonname
), wine_dbgstr_w(b
->ai_canonname
));
423 ok(!a
->ai_canonname
&& !b
->ai_canonname
, "Expected both names absent (%p != %p)\n",
424 a
->ai_canonname
, b
->ai_canonname
);
426 ok(!a
&& !b
, "Expected both addresses null (%p != %p)\n", a
, b
);
429 /**************** Server utility functions ***************/
432 * Even if we have closed our server socket cleanly,
433 * the OS may mark the address "in use" for some time -
434 * this happens with native Linux apps, too.
436 static void do_bind ( SOCKET s
, struct sockaddr
* addr
, int addrlen
)
438 int err
, wsaerr
= 0, n_try
= BIND_TRIES
;
440 while ( ( err
= bind ( s
, addr
, addrlen
) ) != 0 &&
441 ( wsaerr
= WSAGetLastError () ) == WSAEADDRINUSE
&&
444 trace ( "address in use, waiting ...\n" );
445 Sleep ( 1000 * BIND_SLEEP
);
447 ok ( err
== 0, "failed to bind: %d\n", wsaerr
);
450 static void server_start ( server_params
*par
)
453 test_params
*gen
= par
->general
;
454 server_memory
*mem
= LocalAlloc ( LPTR
, sizeof ( server_memory
) );
456 TlsSetValue ( tls
, mem
);
457 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
458 NULL
, 0, par
->sock_flags
);
459 ok ( mem
->s
!= INVALID_SOCKET
, "Server: WSASocket failed\n" );
461 mem
->addr
.sin_family
= AF_INET
;
462 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
463 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
465 for (i
= 0; i
< MAX_CLIENTS
; i
++)
467 mem
->sock
[i
].s
= INVALID_SOCKET
;
468 mem
->sock
[i
].buf
= LocalAlloc ( LPTR
, gen
->n_chunks
* gen
->chunk_size
);
469 mem
->sock
[i
].n_recvd
= 0;
470 mem
->sock
[i
].n_sent
= 0;
473 if ( gen
->sock_type
== SOCK_STREAM
)
474 do_bind ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof (mem
->addr
) );
477 static void server_stop (void)
480 server_memory
*mem
= TlsGetValue ( tls
);
482 for (i
= 0; i
< MAX_CLIENTS
; i
++ )
484 LocalFree ( mem
->sock
[i
].buf
);
485 if ( mem
->sock
[i
].s
!= INVALID_SOCKET
)
486 closesocket ( mem
->sock
[i
].s
);
488 ok ( closesocket ( mem
->s
) == 0, "closesocket failed\n" );
490 ExitThread ( GetCurrentThreadId () );
493 /**************** Client utilitiy functions ***************/
495 static void client_start ( client_params
*par
)
497 test_params
*gen
= par
->general
;
498 client_memory
*mem
= LocalAlloc (LPTR
, sizeof (client_memory
));
500 TlsSetValue ( tls
, mem
);
502 WaitForSingleObject ( server_ready
, INFINITE
);
504 mem
->s
= WSASocketA ( AF_INET
, gen
->sock_type
, gen
->sock_prot
,
505 NULL
, 0, par
->sock_flags
);
507 mem
->addr
.sin_family
= AF_INET
;
508 mem
->addr
.sin_addr
.s_addr
= inet_addr ( gen
->inet_addr
);
509 mem
->addr
.sin_port
= htons ( gen
->inet_port
);
511 ok ( mem
->s
!= INVALID_SOCKET
, "Client: WSASocket failed\n" );
513 mem
->send_buf
= LocalAlloc ( LPTR
, 2 * gen
->n_chunks
* gen
->chunk_size
);
514 mem
->recv_buf
= mem
->send_buf
+ gen
->n_chunks
* gen
->chunk_size
;
515 fill_buffer ( mem
->send_buf
, gen
->chunk_size
, gen
->n_chunks
);
517 SetEvent ( client_ready
[client_id
] );
518 /* Wait for the other clients to come up */
519 WaitForMultipleObjects ( min ( gen
->n_clients
, MAX_CLIENTS
), client_ready
, TRUE
, INFINITE
);
522 static void client_stop (void)
524 client_memory
*mem
= TlsGetValue ( tls
);
525 wsa_ok ( closesocket ( mem
->s
), 0 ==, "closesocket error (%x): %d\n" );
526 LocalFree ( mem
->send_buf
);
531 /**************** Servers ***************/
534 * simple_server: A very basic server doing synchronous IO.
536 static VOID WINAPI
simple_server ( server_params
*par
)
538 test_params
*gen
= par
->general
;
540 int pos
, n_recvd
, n_sent
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
541 id
= GetCurrentThreadId();
543 trace ( "simple_server (%x) starting\n", id
);
545 set_so_opentype ( FALSE
); /* non-overlapped */
546 server_start ( par
);
547 mem
= TlsGetValue ( tls
);
549 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "simple_server (%x): failed to set blocking mode: %d\n");
550 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "simple_server (%x): listen failed: %d\n");
552 trace ( "simple_server (%x) ready\n", id
);
553 SetEvent ( server_ready
); /* notify clients */
555 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
557 trace ( "simple_server (%x): waiting for client\n", id
);
559 /* accept a single connection */
560 tmp
= sizeof ( mem
->sock
[0].peer
);
561 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
562 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "simple_server (%x): accept failed: %d\n" );
564 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
565 "simple_server (%x): strange peer address\n", id
);
567 /* Receive data & check it */
568 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
569 ok ( n_recvd
== n_expected
,
570 "simple_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
571 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
572 ok ( pos
== -1, "simple_server (%x): test pattern error: %d\n", id
, pos
);
575 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
576 ok ( n_sent
== n_expected
,
577 "simple_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
580 read_zero_bytes ( mem
->sock
[0].s
);
581 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "simple_server (%x): closesocket error: %d\n" );
582 mem
->sock
[0].s
= INVALID_SOCKET
;
585 trace ( "simple_server (%x) exiting\n", id
);
590 * oob_server: A very basic server receiving out-of-band data.
592 static VOID WINAPI
oob_server ( server_params
*par
)
594 test_params
*gen
= par
->general
;
597 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
,
598 id
= GetCurrentThreadId();
600 trace ( "oob_server (%x) starting\n", id
);
602 set_so_opentype ( FALSE
); /* non-overlapped */
603 server_start ( par
);
604 mem
= TlsGetValue ( tls
);
606 wsa_ok ( set_blocking ( mem
->s
, TRUE
), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n");
607 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "oob_server (%x): listen failed: %d\n");
609 trace ( "oob_server (%x) ready\n", id
);
610 SetEvent ( server_ready
); /* notify clients */
612 trace ( "oob_server (%x): waiting for client\n", id
);
614 /* accept a single connection */
615 tmp
= sizeof ( mem
->sock
[0].peer
);
616 mem
->sock
[0].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[0].peer
, &tmp
);
617 wsa_ok ( mem
->sock
[0].s
, INVALID_SOCKET
!=, "oob_server (%x): accept failed: %d\n" );
619 ok ( mem
->sock
[0].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
620 "oob_server (%x): strange peer address\n", id
);
622 /* check initial atmark state */
623 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
624 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
626 /* Receive normal data */
627 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
628 ok ( n_recvd
== n_expected
,
629 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
630 pos
= test_buffer ( mem
->sock
[0].buf
, gen
->chunk_size
, gen
->n_chunks
);
631 ok ( pos
== -1, "oob_server (%x): test pattern error: %d\n", id
, pos
);
633 /* check atmark state */
634 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
635 ok ( atmark
== 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id
, atmark
);
638 n_sent
= do_synchronous_send ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
639 ok ( n_sent
== n_expected
,
640 "oob_server (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
642 /* Receive a part of the out-of-band data and print atmark state */
643 n_recvd
= do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, 8, 0, par
->buflen
);
645 "oob_server (%x): received less data than expected: %d of %d\n", id
, n_recvd
, 8 );
648 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
649 trace( "oob_server (%x): %s the OOB mark: %i\n", id
, atmark
== 1 ? "not at" : "at", atmark
);
651 /* Receive the rest of the out-of-band data and check atmark state */
652 do_synchronous_recv ( mem
->sock
[0].s
, mem
->sock
[0].buf
, n_expected
, 0, par
->buflen
);
654 ioctlsocket ( mem
->sock
[0].s
, SIOCATMARK
, &atmark
);
655 todo_wine
ok ( atmark
== 0, "oob_server (%x): not at the OOB mark: %i\n", id
, atmark
);
658 wsa_ok ( closesocket ( mem
->sock
[0].s
), 0 ==, "oob_server (%x): closesocket error: %d\n" );
659 mem
->sock
[0].s
= INVALID_SOCKET
;
661 trace ( "oob_server (%x) exiting\n", id
);
666 * select_server: A non-blocking server.
668 static VOID WINAPI
select_server ( server_params
*par
)
670 test_params
*gen
= par
->general
;
672 int n_expected
= gen
->n_chunks
* gen
->chunk_size
, tmp
, i
,
673 id
= GetCurrentThreadId(), n_connections
= 0, n_sent
, n_recvd
,
674 n_set
, delta
, n_ready
;
675 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
676 fd_set fds_recv
, fds_send
, fds_openrecv
, fds_opensend
;
678 trace ( "select_server (%x) starting\n", id
);
680 set_so_opentype ( FALSE
); /* non-overlapped */
681 server_start ( par
);
682 mem
= TlsGetValue ( tls
);
684 wsa_ok ( set_blocking ( mem
->s
, FALSE
), 0 ==, "select_server (%x): failed to set blocking mode: %d\n");
685 wsa_ok ( listen ( mem
->s
, SOMAXCONN
), 0 ==, "select_server (%x): listen failed: %d\n");
687 trace ( "select_server (%x) ready\n", id
);
688 SetEvent ( server_ready
); /* notify clients */
690 FD_ZERO ( &fds_openrecv
);
691 FD_ZERO ( &fds_recv
);
692 FD_ZERO ( &fds_send
);
693 FD_ZERO ( &fds_opensend
);
695 FD_SET ( mem
->s
, &fds_openrecv
);
699 fds_recv
= fds_openrecv
;
700 fds_send
= fds_opensend
;
704 wsa_ok ( ( n_ready
= select ( 0, &fds_recv
, &fds_send
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
705 "select_server (%x): select() failed: %d\n" );
707 /* check for incoming requests */
708 if ( FD_ISSET ( mem
->s
, &fds_recv
) ) {
711 trace ( "select_server (%x): accepting client connection\n", id
);
713 /* accept a single connection */
714 tmp
= sizeof ( mem
->sock
[n_connections
].peer
);
715 mem
->sock
[n_connections
].s
= accept ( mem
->s
, (struct sockaddr
*) &mem
->sock
[n_connections
].peer
, &tmp
);
716 wsa_ok ( mem
->sock
[n_connections
].s
, INVALID_SOCKET
!=, "select_server (%x): accept() failed: %d\n" );
718 ok ( mem
->sock
[n_connections
].peer
.sin_addr
.s_addr
== inet_addr ( gen
->inet_addr
),
719 "select_server (%x): strange peer address\n", id
);
721 /* add to list of open connections */
722 FD_SET ( mem
->sock
[n_connections
].s
, &fds_openrecv
);
723 FD_SET ( mem
->sock
[n_connections
].s
, &fds_opensend
);
728 /* handle open requests */
730 for ( i
= 0; i
< n_connections
; i
++ )
732 if ( FD_ISSET( mem
->sock
[i
].s
, &fds_recv
) ) {
735 if ( mem
->sock
[i
].n_recvd
< n_expected
) {
736 /* Receive data & check it */
737 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 );
738 ok ( n_recvd
!= SOCKET_ERROR
, "select_server (%x): error in recv(): %d\n", id
, WSAGetLastError() );
739 mem
->sock
[i
].n_recvd
+= n_recvd
;
741 if ( mem
->sock
[i
].n_recvd
== n_expected
) {
742 int pos
= test_buffer ( mem
->sock
[i
].buf
, gen
->chunk_size
, gen
->n_chunks
);
743 ok ( pos
== -1, "select_server (%x): test pattern error: %d\n", id
, pos
);
744 FD_CLR ( mem
->sock
[i
].s
, &fds_openrecv
);
747 ok ( mem
->sock
[i
].n_recvd
<= n_expected
, "select_server (%x): received too many bytes: %d\n", id
, mem
->sock
[i
].n_recvd
);
751 /* only echo back what we've received */
752 delta
= mem
->sock
[i
].n_recvd
- mem
->sock
[i
].n_sent
;
754 if ( FD_ISSET ( mem
->sock
[i
].s
, &fds_send
) ) {
757 if ( ( delta
> 0 ) && ( mem
->sock
[i
].n_sent
< n_expected
) ) {
759 n_sent
= send ( mem
->sock
[i
].s
, mem
->sock
[i
].buf
+ mem
->sock
[i
].n_sent
, min ( delta
, par
->buflen
), 0 );
760 ok ( n_sent
!= SOCKET_ERROR
, "select_server (%x): error in send(): %d\n", id
, WSAGetLastError() );
761 mem
->sock
[i
].n_sent
+= n_sent
;
763 if ( mem
->sock
[i
].n_sent
== n_expected
) {
764 FD_CLR ( mem
->sock
[i
].s
, &fds_opensend
);
767 ok ( mem
->sock
[i
].n_sent
<= n_expected
, "select_server (%x): sent too many bytes: %d\n", id
, mem
->sock
[i
].n_sent
);
772 /* check that select returned the correct number of ready sockets */
773 ok ( ( n_set
== n_ready
), "select_server (%x): select() returns wrong number of ready sockets\n", id
);
775 /* check if all clients are done */
776 if ( ( fds_opensend
.fd_count
== 0 )
777 && ( fds_openrecv
.fd_count
== 1 ) /* initial socket that accepts clients */
778 && ( n_connections
== min ( gen
->n_clients
, MAX_CLIENTS
) ) ) {
783 for ( i
= 0; i
< min ( gen
->n_clients
, MAX_CLIENTS
); i
++ )
786 read_zero_bytes ( mem
->sock
[i
].s
);
787 wsa_ok ( closesocket ( mem
->sock
[i
].s
), 0 ==, "select_server (%x): closesocket error: %d\n" );
788 mem
->sock
[i
].s
= INVALID_SOCKET
;
791 trace ( "select_server (%x) exiting\n", id
);
795 /**************** Clients ***************/
798 * simple_client: A very basic client doing synchronous IO.
800 static VOID WINAPI
simple_client ( client_params
*par
)
802 test_params
*gen
= par
->general
;
804 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
806 id
= GetCurrentThreadId();
807 trace ( "simple_client (%x): starting\n", id
);
808 /* wait here because we want to call set_so_opentype before creating a socket */
809 WaitForSingleObject ( server_ready
, INFINITE
);
810 trace ( "simple_client (%x): server ready\n", id
);
812 check_so_opentype ();
813 set_so_opentype ( FALSE
); /* non-overlapped */
814 client_start ( par
);
815 mem
= TlsGetValue ( tls
);
818 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
819 0 ==, "simple_client (%x): connect error: %d\n" );
820 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
821 "simple_client (%x): failed to set blocking mode\n", id
);
822 trace ( "simple_client (%x) connected\n", id
);
824 /* send data to server */
825 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
826 ok ( n_sent
== n_expected
,
827 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
829 /* shutdown send direction */
830 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
832 /* Receive data echoed back & check it */
833 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
834 ok ( n_recvd
== n_expected
,
835 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
838 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
839 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
842 read_zero_bytes ( mem
->s
);
843 trace ( "simple_client (%x) exiting\n", id
);
848 * oob_client: A very basic client sending out-of-band data.
850 static VOID WINAPI
oob_client ( client_params
*par
)
852 test_params
*gen
= par
->general
;
854 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
856 id
= GetCurrentThreadId();
857 trace ( "oob_client (%x): starting\n", id
);
858 /* wait here because we want to call set_so_opentype before creating a socket */
859 WaitForSingleObject ( server_ready
, INFINITE
);
860 trace ( "oob_client (%x): server ready\n", id
);
862 check_so_opentype ();
863 set_so_opentype ( FALSE
); /* non-overlapped */
864 client_start ( par
);
865 mem
= TlsGetValue ( tls
);
868 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
869 0 ==, "oob_client (%x): connect error: %d\n" );
870 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
871 "oob_client (%x): failed to set blocking mode\n", id
);
872 trace ( "oob_client (%x) connected\n", id
);
874 /* send data to server */
875 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
876 ok ( n_sent
== n_expected
,
877 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
879 /* Receive data echoed back & check it */
880 n_recvd
= do_synchronous_recv ( mem
->s
, mem
->recv_buf
, n_expected
, 0, par
->buflen
);
881 ok ( n_recvd
== n_expected
,
882 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
883 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
884 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
886 /* send out-of-band data to server */
887 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, MSG_OOB
, par
->buflen
);
888 ok ( n_sent
== n_expected
,
889 "oob_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
891 /* shutdown send direction */
892 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
895 read_zero_bytes ( mem
->s
);
896 trace ( "oob_client (%x) exiting\n", id
);
901 * simple_mixed_client: mixing send and recvfrom
903 static VOID WINAPI
simple_mixed_client ( client_params
*par
)
905 test_params
*gen
= par
->general
;
907 int pos
, n_sent
, n_recvd
, n_expected
= gen
->n_chunks
* gen
->chunk_size
, id
;
908 int fromLen
= sizeof(mem
->addr
);
909 struct sockaddr test
;
911 id
= GetCurrentThreadId();
912 trace ( "simple_client (%x): starting\n", id
);
913 /* wait here because we want to call set_so_opentype before creating a socket */
914 WaitForSingleObject ( server_ready
, INFINITE
);
915 trace ( "simple_client (%x): server ready\n", id
);
917 check_so_opentype ();
918 set_so_opentype ( FALSE
); /* non-overlapped */
919 client_start ( par
);
920 mem
= TlsGetValue ( tls
);
923 wsa_ok ( connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) ),
924 0 ==, "simple_client (%x): connect error: %d\n" );
925 ok ( set_blocking ( mem
->s
, TRUE
) == 0,
926 "simple_client (%x): failed to set blocking mode\n", id
);
927 trace ( "simple_client (%x) connected\n", id
);
929 /* send data to server */
930 n_sent
= do_synchronous_send ( mem
->s
, mem
->send_buf
, n_expected
, 0, par
->buflen
);
931 ok ( n_sent
== n_expected
,
932 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n_sent
, n_expected
);
934 /* shutdown send direction */
935 wsa_ok ( shutdown ( mem
->s
, SD_SEND
), 0 ==, "simple_client (%x): shutdown failed: %d\n" );
937 /* this shouldn't change, since lpFrom, is not updated on
938 connection oriented sockets - exposed by bug 11640
940 ((struct sockaddr_in
*)&test
)->sin_addr
.s_addr
= inet_addr("0.0.0.0");
942 /* Receive data echoed back & check it */
943 n_recvd
= do_synchronous_recvfrom ( mem
->s
,
947 (struct sockaddr
*)&test
,
950 ok ( n_recvd
== n_expected
,
951 "simple_client (%x): received less data than expected: %d of %d\n", id
, n_recvd
, n_expected
);
953 /* check that lpFrom was not updated */
956 inet_ntoa(((struct sockaddr_in
*)&test
)->sin_addr
),
957 "0.0.0.0"), "lpFrom shouldn't be updated on connection oriented sockets\n");
960 pos
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
961 ok ( pos
== -1, "simple_client (%x): test pattern error: %d\n", id
, pos
);
964 read_zero_bytes ( mem
->s
);
965 trace ( "simple_client (%x) exiting\n", id
);
970 * event_client: An event-driven client
972 static void WINAPI
event_client ( client_params
*par
)
974 test_params
*gen
= par
->general
;
976 int id
= GetCurrentThreadId(), n_expected
= gen
->n_chunks
* gen
->chunk_size
,
979 WSANETWORKEVENTS wsa_events
;
980 char *send_last
, *recv_last
, *send_p
, *recv_p
;
981 LONG mask
= FD_READ
| FD_WRITE
| FD_CLOSE
;
983 trace ( "event_client (%x): starting\n", id
);
984 client_start ( par
);
985 trace ( "event_client (%x): server ready\n", id
);
987 mem
= TlsGetValue ( tls
);
989 /* Prepare event notification for connect, makes socket nonblocking */
990 event
= WSACreateEvent ();
991 WSAEventSelect ( mem
->s
, event
, FD_CONNECT
);
992 tmp
= connect ( mem
->s
, (struct sockaddr
*) &mem
->addr
, sizeof ( mem
->addr
) );
994 err
= WSAGetLastError ();
995 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): connect error: %d\n", id
, err
);
996 tmp
= WaitForSingleObject ( event
, INFINITE
);
997 ok ( tmp
== WAIT_OBJECT_0
, "event_client (%x): wait for connect event failed: %d\n", id
, tmp
);
998 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
999 ok ( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
1000 err
= wsa_events
.iErrorCode
[ FD_CONNECT_BIT
];
1001 ok ( err
== 0, "event_client (%x): connect error: %d\n", id
, err
);
1002 if ( err
) goto out
;
1005 trace ( "event_client (%x) connected\n", id
);
1007 WSAEventSelect ( mem
->s
, event
, mask
);
1009 recv_p
= mem
->recv_buf
;
1010 recv_last
= mem
->recv_buf
+ n_expected
;
1011 send_p
= mem
->send_buf
;
1012 send_last
= mem
->send_buf
+ n_expected
;
1016 err
= WaitForSingleObject ( event
, INFINITE
);
1017 ok ( err
== WAIT_OBJECT_0
, "event_client (%x): wait failed\n", id
);
1019 err
= WSAEnumNetworkEvents ( mem
->s
, event
, &wsa_events
);
1020 ok( err
== 0, "event_client (%x): WSAEnumNetworkEvents error: %d\n", id
, err
);
1022 if ( wsa_events
.lNetworkEvents
& FD_WRITE
)
1024 err
= wsa_events
.iErrorCode
[ FD_WRITE_BIT
];
1025 ok ( err
== 0, "event_client (%x): FD_WRITE error code: %d\n", id
, err
);
1030 n
= send ( mem
->s
, send_p
, min ( send_last
- send_p
, par
->buflen
), 0 );
1033 err
= WSAGetLastError ();
1034 ok ( err
== WSAEWOULDBLOCK
, "event_client (%x): send error: %d\n", id
, err
);
1039 while ( n
>= 0 && send_p
< send_last
);
1041 if ( send_p
== send_last
)
1043 trace ( "event_client (%x): all data sent - shutdown\n", id
);
1044 shutdown ( mem
->s
, SD_SEND
);
1046 WSAEventSelect ( mem
->s
, event
, mask
);
1049 if ( wsa_events
.lNetworkEvents
& FD_READ
)
1051 err
= wsa_events
.iErrorCode
[ FD_READ_BIT
];
1052 ok ( err
== 0, "event_client (%x): FD_READ error code: %d\n", id
, err
);
1053 if ( err
!= 0 ) break;
1055 /* First read must succeed */
1056 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
1057 wsa_ok ( n
, 0 <=, "event_client (%x): recv error: %d\n" );
1061 if ( recv_p
== recv_last
)
1064 trace ( "event_client (%x): all data received\n", id
);
1065 WSAEventSelect ( mem
->s
, event
, mask
);
1068 n
= recv ( mem
->s
, recv_p
, min ( recv_last
- recv_p
, par
->buflen
), 0 );
1069 if ( n
< 0 && ( err
= WSAGetLastError()) != WSAEWOULDBLOCK
)
1070 ok ( 0, "event_client (%x): read error: %d\n", id
, err
);
1074 if ( wsa_events
.lNetworkEvents
& FD_CLOSE
)
1076 trace ( "event_client (%x): close event\n", id
);
1077 err
= wsa_events
.iErrorCode
[ FD_CLOSE_BIT
];
1078 ok ( err
== 0, "event_client (%x): FD_CLOSE error code: %d\n", id
, err
);
1083 n
= send_p
- mem
->send_buf
;
1084 ok ( send_p
== send_last
,
1085 "simple_client (%x): sent less data than expected: %d of %d\n", id
, n
, n_expected
);
1086 n
= recv_p
- mem
->recv_buf
;
1087 ok ( recv_p
== recv_last
,
1088 "simple_client (%x): received less data than expected: %d of %d\n", id
, n
, n_expected
);
1089 n
= test_buffer ( mem
->recv_buf
, gen
->chunk_size
, gen
->n_chunks
);
1090 ok ( n
== -1, "event_client (%x): test pattern error: %d\n", id
, n
);
1093 WSACloseEvent ( event
);
1094 trace ( "event_client (%x) exiting\n", id
);
1098 /* Tests for WSAStartup */
1099 static void test_WithoutWSAStartup(void)
1103 WSASetLastError(0xdeadbeef);
1104 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
, "WSASocketA should have failed\n");
1105 err
= WSAGetLastError();
1106 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
1108 WSASetLastError(0xdeadbeef);
1109 ok(gethostbyname("localhost") == NULL
, "gethostbyname() succeeded unexpectedly\n");
1110 err
= WSAGetLastError();
1111 ok(err
== WSANOTINITIALISED
, "Expected 10093, received %d\n", err
);
1114 static void test_WithWSAStartup(void)
1117 WORD version
= MAKEWORD( 2, 2 );
1118 INT res
, socks
, i
, j
;
1123 SOCKET src
, dst
, dup_src
, dup_dst
;
1127 res
= WSAStartup( version
, &data
);
1128 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1130 ptr
= gethostbyname("localhost");
1131 ok(ptr
!= NULL
, "gethostbyname() failed unexpectedly: %d\n", WSAGetLastError());
1133 /* Alloc some sockets to check if they are destroyed on WSACleanup */
1134 for (socks
= 0; socks
< sizeof(pairs
) / sizeof(pairs
[0]); socks
++)
1136 WSAPROTOCOL_INFOA info
;
1137 if (tcp_socketpair(&pairs
[socks
].src
, &pairs
[socks
].dst
)) break;
1139 memset(&info
, 0, sizeof(info
));
1140 ok(!WSADuplicateSocketA(pairs
[socks
].src
, GetCurrentProcessId(), &info
),
1141 "WSADuplicateSocketA should have worked\n");
1142 pairs
[socks
].dup_src
= WSASocketA(0, 0, 0, &info
, 0, 0);
1143 ok(pairs
[socks
].dup_src
!= SOCKET_ERROR
, "expected != -1\n");
1145 memset(&info
, 0, sizeof(info
));
1146 ok(!WSADuplicateSocketA(pairs
[socks
].dst
, GetCurrentProcessId(), &info
),
1147 "WSADuplicateSocketA should have worked\n");
1148 pairs
[socks
].dup_dst
= WSASocketA(0, 0, 0, &info
, 0, 0);
1149 ok(pairs
[socks
].dup_dst
!= SOCKET_ERROR
, "expected != -1\n");
1152 res
= send(pairs
[0].src
, "TEST", 4, 0);
1153 ok(res
== 4, "send failed with error %d\n", WSAGetLastError());
1157 res
= WSAStartup( version
, &data
);
1158 ok(res
== 0, "WSAStartup() failed unexpectedly: %d\n", res
);
1160 /* show that sockets are destroyed automatically after WSACleanup */
1162 SetLastError(0xdeadbeef);
1163 res
= send(pairs
[0].src
, "TEST", 4, 0);
1164 error
= WSAGetLastError();
1165 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1166 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1168 SetLastError(0xdeadbeef);
1169 res
= send(pairs
[0].dst
, "TEST", 4, 0);
1170 error
= WSAGetLastError();
1171 ok(res
== SOCKET_ERROR
, "send should have failed\n");
1172 ok(error
== WSAENOTSOCK
, "expected 10038, got %d\n", error
);
1174 /* Check that all sockets were destroyed */
1175 for (i
= 0; i
< socks
; i
++)
1177 for (j
= 0; j
< 4; j
++)
1179 struct sockaddr_in saddr
;
1180 int size
= sizeof(saddr
);
1183 case 0: sock
= pairs
[i
].src
; break;
1184 case 1: sock
= pairs
[i
].dup_src
; break;
1185 case 2: sock
= pairs
[i
].dst
; break;
1186 case 3: sock
= pairs
[i
].dup_dst
; break;
1189 SetLastError(0xdeadbeef);
1190 res
= getsockname(sock
, (struct sockaddr
*)&saddr
, &size
);
1191 error
= WSAGetLastError();
1192 ok(res
== SOCKET_ERROR
, "Test[%d]: getsockname should have failed\n", i
);
1193 ok(error
== WSAENOTSOCK
, "Test[%d]: expected 10038, got %d\n", i
, error
);
1199 /* While wine is not fixed, close all sockets manually */
1200 for (i
= 0; i
< socks
; i
++)
1202 closesocket(pairs
[i
].src
);
1203 closesocket(pairs
[i
].dst
);
1204 closesocket(pairs
[i
].dup_src
);
1205 closesocket(pairs
[i
].dup_dst
);
1209 ok(res
== 0, "expected 0, got %d\n", res
);
1210 WSASetLastError(0xdeadbeef);
1212 error
= WSAGetLastError();
1213 ok ( (res
== SOCKET_ERROR
&& error
== WSANOTINITIALISED
) ||
1214 broken(res
== 0), /* WinME */
1215 "WSACleanup returned %d WSAGetLastError is %d\n", res
, error
);
1218 /**************** Main program utility functions ***************/
1220 static void Init (void)
1222 WORD ver
= MAKEWORD (2, 2);
1224 HMODULE hws2_32
= GetModuleHandleA("ws2_32.dll"), hiphlpapi
;
1226 pfreeaddrinfo
= (void *)GetProcAddress(hws2_32
, "freeaddrinfo");
1227 pgetaddrinfo
= (void *)GetProcAddress(hws2_32
, "getaddrinfo");
1228 pFreeAddrInfoW
= (void *)GetProcAddress(hws2_32
, "FreeAddrInfoW");
1229 pGetAddrInfoW
= (void *)GetProcAddress(hws2_32
, "GetAddrInfoW");
1230 pInetNtop
= (void *)GetProcAddress(hws2_32
, "inet_ntop");
1231 pInetNtopW
= (void *)GetProcAddress(hws2_32
, "InetNtopW");
1232 pInetPtonA
= (void *)GetProcAddress(hws2_32
, "inet_pton");
1233 pInetPtonW
= (void *)GetProcAddress(hws2_32
, "InetPtonW");
1234 pWSALookupServiceBeginW
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceBeginW");
1235 pWSALookupServiceEnd
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceEnd");
1236 pWSALookupServiceNextW
= (void *)GetProcAddress(hws2_32
, "WSALookupServiceNextW");
1237 pWSAEnumNameSpaceProvidersA
= (void *)GetProcAddress(hws2_32
, "WSAEnumNameSpaceProvidersA");
1238 pWSAEnumNameSpaceProvidersW
= (void *)GetProcAddress(hws2_32
, "WSAEnumNameSpaceProvidersW");
1239 pWSAPoll
= (void *)GetProcAddress(hws2_32
, "WSAPoll");
1241 hiphlpapi
= LoadLibraryA("iphlpapi.dll");
1244 pGetIpForwardTable
= (void *)GetProcAddress(hiphlpapi
, "GetIpForwardTable");
1245 pGetAdaptersInfo
= (void *)GetProcAddress(hiphlpapi
, "GetAdaptersInfo");
1248 ok ( WSAStartup ( ver
, &data
) == 0, "WSAStartup failed\n" );
1252 static void Exit (void)
1257 err
= WSAGetLastError();
1258 ok ( ret
== 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret
, err
);
1261 static void StartServer (LPTHREAD_START_ROUTINE routine
,
1262 test_params
*general
, server_params
*par
)
1264 par
->general
= general
;
1265 thread
[0] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[0] );
1266 ok ( thread
[0] != NULL
, "Failed to create server thread\n" );
1269 static void StartClients (LPTHREAD_START_ROUTINE routine
,
1270 test_params
*general
, client_params
*par
)
1273 par
->general
= general
;
1274 for ( i
= 1; i
<= min ( general
->n_clients
, MAX_CLIENTS
); i
++ )
1277 thread
[i
] = CreateThread ( NULL
, 0, routine
, par
, 0, &thread_id
[i
] );
1278 ok ( thread
[i
] != NULL
, "Failed to create client thread\n" );
1279 /* Make sure the client is up and running */
1280 WaitForSingleObject ( client_ready
[client_id
], INFINITE
);
1284 static void do_test( test_setup
*test
)
1286 DWORD i
, n
= min (test
->general
.n_clients
, MAX_CLIENTS
);
1289 server_ready
= CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1290 for (i
= 0; i
<= n
; i
++)
1291 client_ready
[i
] = CreateEventA ( NULL
, TRUE
, FALSE
, NULL
);
1293 StartServer ( test
->srv
, &test
->general
, &test
->srv_params
);
1294 StartClients ( test
->clt
, &test
->general
, &test
->clt_params
);
1295 WaitForSingleObject ( server_ready
, INFINITE
);
1297 wait
= WaitForMultipleObjects ( 1 + n
, thread
, TRUE
, 1000 * TEST_TIMEOUT
);
1298 ok ( wait
<= WAIT_OBJECT_0
+ n
,
1299 "some threads have not completed: %x\n", wait
);
1301 if ( ! ( wait
<= WAIT_OBJECT_0
+ n
) )
1303 for (i
= 0; i
<= n
; i
++)
1305 if ( WaitForSingleObject ( thread
[i
], 0 ) != WAIT_OBJECT_0
)
1307 trace ("terminating thread %08x\n", thread_id
[i
]);
1308 TerminateThread ( thread
[i
], 0 );
1312 CloseHandle ( server_ready
);
1313 for (i
= 0; i
<= n
; i
++)
1314 CloseHandle ( client_ready
[i
] );
1317 /********* some tests for getsockopt(setsockopt(X)) == X ***********/
1318 /* optname = SO_LINGER */
1319 static const LINGER linger_testvals
[] = {
1326 /* optname = SO_RCVTIMEO, SOSNDTIMEO */
1327 #define SOCKTIMEOUT1 63000 /* 63 seconds. Do not test fractional part because of a
1328 bug in the linux kernel (fixed in 2.6.8) */
1329 #define SOCKTIMEOUT2 997000 /* 997 seconds */
1331 static void test_set_getsockopt(void)
1334 int i
, err
, lasterr
;
1338 WSAPROTOCOL_INFOA infoA
;
1339 WSAPROTOCOL_INFOW infoW
;
1340 char providername
[WSAPROTOCOL_LEN
+ 1];
1344 int family
, type
, proto
;
1346 {AF_INET
, SOCK_STREAM
, IPPROTO_TCP
},
1347 {AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
},
1348 {AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
},
1349 {AF_INET6
, SOCK_DGRAM
, IPPROTO_UDP
}
1357 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1358 ok(s
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1359 if( s
== INVALID_SOCKET
) return;
1361 timeout
= SOCKTIMEOUT1
;
1362 size
= sizeof(timeout
);
1363 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1365 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1366 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1367 ok( timeout
== SOCKTIMEOUT1
, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1370 size
= sizeof(timeout
);
1371 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, size
);
1373 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *) &timeout
, &size
);
1374 ok( !err
, "get/setsockopt(SO_RCVTIMEO) failed error: %d\n", WSAGetLastError());
1375 ok( timeout
== 0, "getsockopt(SO_RCVTIMEO) returned wrong value %d\n", timeout
);
1378 timeout
= SOCKTIMEOUT2
; /* 997 seconds. See remark above */
1379 size
= sizeof(timeout
);
1380 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, size
);
1382 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *) &timeout
, &size
);
1383 ok( !err
, "get/setsockopt(SO_SNDTIMEO) failed error: %d\n", WSAGetLastError());
1384 ok( timeout
== SOCKTIMEOUT2
, "getsockopt(SO_SNDTIMEO) returned wrong value %d\n", timeout
);
1388 size
= sizeof(value
);
1389 err
= setsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, size
);
1390 ok( !err
, "setsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1392 err
= getsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, (char *)&value
, &size
);
1393 ok( !err
, "getsockopt(SO_SNDBUF) failed error: %u\n", WSAGetLastError() );
1394 todo_wine
ok( value
== 4096, "expected 4096, got %u\n", value
);
1398 size
= sizeof(value
);
1399 err
= setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, size
);
1400 ok( !err
, "setsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1402 err
= getsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, (char *)&value
, &size
);
1403 ok( !err
, "getsockopt(SO_RCVBUF) failed error: %u\n", WSAGetLastError() );
1404 todo_wine
ok( value
== 4096, "expected 4096, got %u\n", value
);
1407 for( i
= 0; i
< sizeof(linger_testvals
)/sizeof(LINGER
);i
++) {
1408 size
= sizeof(lingval
);
1409 lingval
= linger_testvals
[i
];
1410 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *) &lingval
, size
);
1412 err
= getsockopt(s
, SOL_SOCKET
, SO_LINGER
, (char *) &lingval
, &size
);
1413 ok( !err
, "get/setsockopt(SO_LINGER) failed error: %d\n", WSAGetLastError());
1414 ok( !lingval
.l_onoff
== !linger_testvals
[i
].l_onoff
&&
1415 (lingval
.l_linger
== linger_testvals
[i
].l_linger
||
1416 (!lingval
.l_linger
&& !linger_testvals
[i
].l_onoff
))
1417 , "getsockopt(SO_LINGER #%d) returned wrong value %d,%d not %d,%d\n", i
,
1418 lingval
.l_onoff
, lingval
.l_linger
,
1419 linger_testvals
[i
].l_onoff
, linger_testvals
[i
].l_linger
);
1422 size
= sizeof(lingval
);
1423 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, size
);
1424 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1425 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1426 err
= setsockopt(s
, SOL_SOCKET
, SO_LINGER
, NULL
, 0);
1427 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1428 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1430 size
= sizeof(BOOL
);
1431 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, size
);
1432 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1433 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1434 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTLINGER
, NULL
, 0);
1435 ok(err
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
1436 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err
, WSAGetLastError());
1438 /* Test for erroneously passing a value instead of a pointer as optval */
1439 size
= sizeof(char);
1440 err
= setsockopt(s
, SOL_SOCKET
, SO_DONTROUTE
, (char *)1, size
);
1441 ok(err
== SOCKET_ERROR
, "setsockopt with optval being a value passed "
1442 "instead of failing.\n");
1443 lasterr
= WSAGetLastError();
1444 ok(lasterr
== WSAEFAULT
, "setsockopt with optval being a value "
1445 "returned 0x%08x, not WSAEFAULT(0x%08x)\n",
1446 lasterr
, WSAEFAULT
);
1448 /* SO_RCVTIMEO with invalid values for level */
1449 size
= sizeof(timeout
);
1450 timeout
= SOCKTIMEOUT1
;
1451 SetLastError(0xdeadbeef);
1452 err
= setsockopt(s
, 0xffffffff, SO_RCVTIMEO
, (char *) &timeout
, size
);
1453 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1454 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1455 err
, WSAGetLastError());
1457 timeout
= SOCKTIMEOUT1
;
1458 SetLastError(0xdeadbeef);
1459 err
= setsockopt(s
, 0x00008000, SO_RCVTIMEO
, (char *) &timeout
, size
);
1460 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
1461 "got %d with %d (expected SOCKET_ERROR with WSAEINVAL)\n",
1462 err
, WSAGetLastError());
1464 /* Test SO_ERROR set/get */
1465 SetLastError(0xdeadbeef);
1467 err
= setsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, size
);
1469 ok( !err
&& !WSAGetLastError(),
1470 "got %d with %d (expected 0 with 0)\n",
1471 err
, WSAGetLastError());
1473 SetLastError(0xdeadbeef);
1475 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1477 ok( !err
&& !WSAGetLastError(),
1478 "got %d with %d (expected 0 with 0)\n",
1479 err
, WSAGetLastError());
1481 ok (i
== 1234, "got %d (expected 1234)\n", i
);
1483 /* Test invalid optlen */
1484 SetLastError(0xdeadbeef);
1486 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1488 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEFAULT
),
1489 "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n",
1490 err
, WSAGetLastError());
1493 /* Test with the closed socket */
1494 SetLastError(0xdeadbeef);
1497 err
= getsockopt(s
, SOL_SOCKET
, SO_ERROR
, (char *) &i
, &size
);
1499 ok( (err
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOTSOCK
),
1500 "got %d with %d (expected SOCKET_ERROR with WSAENOTSOCK)\n",
1501 err
, WSAGetLastError());
1502 ok (i
== 1234, "expected 1234, got %d\n", i
);
1504 /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */
1505 s
= socket(AF_INET
, SOCK_DGRAM
, 0);
1506 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1509 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &i
, size
);
1512 for (i
= 0; i
< 4; i
++)
1515 const int tests
[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d};
1516 err
= setsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &tests
[i
], i
+ 1);
1517 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1518 err
= getsockopt(s
, IPPROTO_IP
, IP_MULTICAST_TTL
, (char *) &k
, &size
);
1519 ok(!err
, "Test [%d] Expected 0, got %d\n", i
, err
);
1520 j
= i
!= 3 ? tests
[i
] & ((1 << (i
+ 1) * 8) - 1) : tests
[i
];
1521 ok(k
== j
, "Test [%d] Expected 0x%x, got 0x%x\n", i
, j
, k
);
1525 win_skip("IP_MULTICAST_TTL is unsupported\n");
1528 /* test SO_PROTOCOL_INFOA invalid parameters */
1529 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1530 "getsockopt should have failed\n");
1531 err
= WSAGetLastError();
1532 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1533 size
= sizeof(WSAPROTOCOL_INFOA
);
1534 ok(getsockopt(INVALID_SOCKET
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1535 "getsockopt should have failed\n");
1536 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1537 err
= WSAGetLastError();
1538 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
1539 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1540 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, NULL
),
1541 "getsockopt should have failed\n");
1542 err
= WSAGetLastError();
1543 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1544 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, NULL
),
1545 "getsockopt should have failed\n");
1546 err
= WSAGetLastError();
1547 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1548 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, NULL
, &size
),
1549 "getsockopt should have failed\n");
1550 err
= WSAGetLastError();
1551 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1552 size
= sizeof(WSAPROTOCOL_INFOA
) / 2;
1553 ok(getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
),
1554 "getsockopt should have failed\n");
1555 err
= WSAGetLastError();
1556 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
1557 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1558 size
= sizeof(WSAPROTOCOL_INFOA
) * 2;
1559 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1560 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1561 ok(size
== sizeof(WSAPROTOCOL_INFOA
) * 2, "got size %d\n", size
);
1565 /* test SO_PROTOCOL_INFO structure returned for different protocols */
1566 for (i
= 0; i
< sizeof(prottest
) / sizeof(prottest
[0]); i
++)
1568 s
= socket(prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1569 if (s
== INVALID_SOCKET
&& prottest
[i
].family
== AF_INET6
) continue;
1571 ok(s
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
1574 /* compare both A and W version */
1575 infoA
.szProtocol
[0] = 0;
1576 size
= sizeof(WSAPROTOCOL_INFOA
);
1577 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &infoA
, &size
);
1578 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1579 ok(size
== sizeof(WSAPROTOCOL_INFOA
), "got size %d\n", size
);
1581 infoW
.szProtocol
[0] = 0;
1582 size
= sizeof(WSAPROTOCOL_INFOW
);
1583 err
= getsockopt(s
, SOL_SOCKET
, SO_PROTOCOL_INFOW
, (char *) &infoW
, &size
);
1584 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
1585 ok(size
== sizeof(WSAPROTOCOL_INFOW
), "got size %d\n", size
);
1587 trace("provider name '%s', family %d, type %d, proto %d\n",
1588 infoA
.szProtocol
, prottest
[i
].family
, prottest
[i
].type
, prottest
[i
].proto
);
1590 ok(infoA
.szProtocol
[0] || broken(!infoA
.szProtocol
[0]) /* NT4 */,
1591 "WSAPROTOCOL_INFOA was not filled\n");
1592 ok(infoW
.szProtocol
[0] || broken(!infoA
.szProtocol
[0]) /* NT4 */,
1593 "WSAPROTOCOL_INFOW was not filled\n");
1595 WideCharToMultiByte(CP_ACP
, 0, infoW
.szProtocol
, -1,
1596 providername
, sizeof(providername
), NULL
, NULL
);
1597 ok(!strcmp(infoA
.szProtocol
,providername
),
1598 "different provider names '%s' != '%s'\n", infoA
.szProtocol
, providername
);
1600 ok(!memcmp(&infoA
, &infoW
, FIELD_OFFSET(WSAPROTOCOL_INFOA
, szProtocol
)),
1601 "SO_PROTOCOL_INFO[A/W] comparison failed\n");
1603 /* Remove IF when WSAEnumProtocols support IPV6 data */
1604 todo_wine_if (prottest
[i
].family
== AF_INET6
)
1605 ok(infoA
.iAddressFamily
== prottest
[i
].family
, "socket family invalid, expected %d received %d\n",
1606 prottest
[i
].family
, infoA
.iAddressFamily
);
1607 ok(infoA
.iSocketType
== prottest
[i
].type
, "socket type invalid, expected %d received %d\n",
1608 prottest
[i
].type
, infoA
.iSocketType
);
1609 ok(infoA
.iProtocol
== prottest
[i
].proto
, "socket protocol invalid, expected %d received %d\n",
1610 prottest
[i
].proto
, infoA
.iProtocol
);
1615 /* Test SO_BSP_STATE - Present only in >= Win 2008 */
1616 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1617 ok(s
!= INVALID_SOCKET
, "Failed to create socket\n");
1618 s2
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
1619 ok(s2
!= INVALID_SOCKET
, "Failed to create socket\n");
1621 SetLastError(0xdeadbeef);
1622 size
= sizeof(csinfoA
);
1623 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1626 struct sockaddr_in saddr
;
1627 memset(&saddr
, 0, sizeof(saddr
));
1628 saddr
.sin_family
= AF_INET
;
1629 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1631 /* Socket is not bound, no information provided */
1632 ok(!csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1633 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1634 /* Socket is not connected, no information provided */
1635 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1636 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1638 err
= bind(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1639 ok(!err
, "Expected 0, got %d\n", err
);
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
);
1644 /* Socket is bound */
1645 ok(csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected non-zero\n");
1646 ok(csinfoA
.cs
.LocalAddr
.lpSockaddr
!= NULL
, "Expected non-null\n");
1647 /* Socket is not connected, no information provided */
1648 ok(!csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected 0, got %d\n", csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1649 ok(csinfoA
.cs
.RemoteAddr
.lpSockaddr
== NULL
, "Expected NULL, got %p\n", csinfoA
.cs
.LocalAddr
.lpSockaddr
);
1651 err
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1652 ok(!err
, "Expected 0, got %d\n", err
);
1653 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1654 ok(!err
, "Expected 0, got %d\n", err
);
1655 err
= listen(s2
, 1);
1656 ok(!err
, "Expected 0, got %d\n", err
);
1657 err
= connect(s
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1658 ok(!err
, "Expected 0, got %d\n", err
);
1659 size
= sizeof(saddr
);
1660 err
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1661 ok(err
!= INVALID_SOCKET
, "Failed to accept socket\n");
1665 size
= sizeof(csinfoA
);
1666 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1667 ok(!err
, "Expected 0, got %d\n", err
);
1668 err
= getsockopt(s2
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoB
, &size
);
1669 ok(!err
, "Expected 0, got %d\n", err
);
1670 ok(size
== sizeof(csinfoA
), "Got %d\n", size
);
1671 size
= sizeof(saddr
);
1672 ok(size
== csinfoA
.cs
.LocalAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1673 csinfoA
.cs
.LocalAddr
.iSockaddrLength
);
1674 ok(size
== csinfoA
.cs
.RemoteAddr
.iSockaddrLength
, "Expected %d, got %d\n", size
,
1675 csinfoA
.cs
.RemoteAddr
.iSockaddrLength
);
1676 ok(!memcmp(csinfoA
.cs
.LocalAddr
.lpSockaddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
),
1677 "Expected matching addresses\n");
1678 ok(!memcmp(csinfoB
.cs
.LocalAddr
.lpSockaddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
),
1679 "Expected matching addresses\n");
1680 ok(csinfoA
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1681 ok(csinfoB
.cs
.iSocketType
== SOCK_STREAM
, "Wrong socket type\n");
1682 ok(csinfoA
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1683 ok(csinfoB
.cs
.iProtocol
== IPPROTO_TCP
, "Wrong socket protocol\n");
1685 err
= getpeername(s
, (struct sockaddr
*)&saddr
, &size
);
1686 ok(!err
, "Expected 0, got %d\n", err
);
1687 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1688 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1689 err
= getpeername(s2
, (struct sockaddr
*)&saddr
, &size
);
1690 ok(!err
, "Expected 0, got %d\n", err
);
1691 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1692 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1693 err
= getsockname(s
, (struct sockaddr
*)&saddr
, &size
);
1694 ok(!err
, "Expected 0, got %d\n", err
);
1695 ok(!memcmp(&saddr
, csinfoA
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1696 ok(!memcmp(&saddr
, csinfoB
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1697 err
= getsockname(s2
, (struct sockaddr
*)&saddr
, &size
);
1698 ok(!err
, "Expected 0, got %d\n", err
);
1699 ok(!memcmp(&saddr
, csinfoB
.cs
.LocalAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1700 ok(!memcmp(&saddr
, csinfoA
.cs
.RemoteAddr
.lpSockaddr
, size
), "Expected matching addresses\n");
1702 SetLastError(0xdeadbeef);
1703 size
= sizeof(CSADDR_INFO
);
1704 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1705 ok(err
, "Expected non-zero\n");
1706 ok(size
== sizeof(CSADDR_INFO
), "Got %d\n", size
);
1707 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1709 /* At least for IPv4 the size is exactly 56 bytes */
1710 size
= sizeof(*csinfoA
.cs
.LocalAddr
.lpSockaddr
) * 2 + sizeof(csinfoA
.cs
);
1711 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1712 ok(!err
, "Expected 0, got %d\n", err
);
1714 SetLastError(0xdeadbeef);
1715 err
= getsockopt(s
, SOL_SOCKET
, SO_BSP_STATE
, (char *) &csinfoA
, &size
);
1716 ok(err
, "Expected non-zero\n");
1717 ok(GetLastError() == WSAEFAULT
, "Expected 10014, got %d\n", GetLastError());
1720 ok(GetLastError() == WSAENOPROTOOPT
, "Expected 10042, got %d\n", GetLastError());
1726 static void test_so_reuseaddr(void)
1728 struct sockaddr_in saddr
;
1730 unsigned int rc
,reuse
;
1734 saddr
.sin_family
= AF_INET
;
1735 saddr
.sin_port
= htons(9375);
1736 saddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
1738 s1
=socket(AF_INET
, SOCK_STREAM
, 0);
1739 ok(s1
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1740 rc
= bind(s1
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1741 ok(rc
!=SOCKET_ERROR
, "bind(s1) failed error: %d\n", WSAGetLastError());
1743 s2
=socket(AF_INET
, SOCK_STREAM
, 0);
1744 ok(s2
!=INVALID_SOCKET
, "socket() failed error: %d\n", WSAGetLastError());
1748 rc
=getsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, &size
);
1749 ok(rc
==0 && reuse
==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc
,reuse
);
1751 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1752 ok(rc
==SOCKET_ERROR
, "bind() succeeded\n");
1755 rc
= setsockopt(s2
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&reuse
, sizeof(reuse
));
1756 ok(rc
==0, "setsockopt() failed error: %d\n", WSAGetLastError());
1758 /* On Win2k3 and above, all SO_REUSEADDR seems to do is to allow binding to
1759 * a port immediately after closing another socket on that port, so
1760 * basically following the BSD socket semantics here. */
1761 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1764 int s3
=socket(AF_INET
, SOCK_STREAM
, 0), s4
;
1765 trace("<= Win XP behavior of SO_REUSEADDR\n");
1767 /* If we could bind again in the same port this is Windows version <= XP.
1768 * Lets test if we can really connect to one of them. */
1769 set_blocking(s1
, FALSE
);
1770 set_blocking(s2
, FALSE
);
1772 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1774 ok(!rc
, "listen() failed with error: %d\n", WSAGetLastError());
1775 rc
= connect(s3
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1776 ok(!rc
, "connecting to accepting socket failed %d\n", WSAGetLastError());
1778 /* the delivery of the connection is random so we need to try on both sockets */
1779 size
= sizeof(saddr
);
1780 s4
= accept(s1
, (struct sockaddr
*)&saddr
, &size
);
1781 if(s4
== INVALID_SOCKET
)
1782 s4
= accept(s2
, (struct sockaddr
*)&saddr
, &size
);
1783 ok(s4
!= INVALID_SOCKET
, "none of the listening sockets could get the connection\n");
1791 trace(">= Win 2003 behavior of SO_REUSEADDR\n");
1792 err
= WSAGetLastError();
1793 ok(err
==WSAEACCES
, "expected 10013, got %d\n", err
);
1796 rc
= bind(s2
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
1797 ok(rc
==0, "bind() failed error: %d\n", WSAGetLastError());
1803 #define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo)))
1805 static void test_ip_pktinfo(void)
1807 ULONG addresses
[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY
)};
1808 char recvbuf
[10], pktbuf
[512], msg
[] = "HELLO";
1809 struct sockaddr_in s1addr
, s2addr
, s3addr
;
1810 GUID WSARecvMsg_GUID
= WSAID_WSARECVMSG
;
1811 LPFN_WSARECVMSG pWSARecvMsg
= NULL
;
1812 unsigned int rc
, yes
= 1;
1814 DWORD dwBytes
, dwSize
, dwFlags
;
1823 memset(&ov
, 0, sizeof(ov
));
1824 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
1825 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
1827 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
1831 memset(&hdr
, 0x00, sizeof(hdr
));
1832 s1addr
.sin_family
= AF_INET
;
1833 s1addr
.sin_port
= htons(0);
1834 /* Note: s1addr.sin_addr is set below */
1835 iovec
[0].buf
= recvbuf
;
1836 iovec
[0].len
= sizeof(recvbuf
);
1837 hdr
.name
= (struct sockaddr
*)&s3addr
;
1838 hdr
.namelen
= sizeof(s3addr
);
1839 hdr
.lpBuffers
= &iovec
[0];
1840 hdr
.dwBufferCount
= 1;
1841 hdr
.Control
.buf
= pktbuf
;
1842 /* Note: hdr.Control.len is set below */
1845 for (i
=0;i
<sizeof(addresses
)/sizeof(UINT32
);i
++)
1847 s1addr
.sin_addr
.s_addr
= addresses
[i
];
1849 /* Build "server" side socket */
1850 s1
=socket(AF_INET
, SOCK_DGRAM
, 0);
1851 if (s1
== INVALID_SOCKET
)
1853 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
1857 /* Obtain the WSARecvMsg function */
1858 WSAIoctl(s1
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSARecvMsg_GUID
, sizeof(WSARecvMsg_GUID
),
1859 &pWSARecvMsg
, sizeof(pWSARecvMsg
), &dwBytes
, NULL
, NULL
);
1862 win_skip("WSARecvMsg is unsupported, some tests will be skipped.\n");
1867 /* Setup the server side socket */
1868 rc
=bind(s1
, (struct sockaddr
*)&s1addr
, sizeof(s1addr
));
1869 ok(rc
!= SOCKET_ERROR
, "bind() failed error: %d\n", WSAGetLastError());
1870 rc
=setsockopt(s1
, IPPROTO_IP
, IP_PKTINFO
, (const char*)&yes
, sizeof(yes
));
1871 ok(rc
== 0, "failed to set IPPROTO_IP flag IP_PKTINFO!\n");
1873 /* Build "client" side socket */
1874 addrlen
= sizeof(s2addr
);
1875 if (getsockname(s1
, (struct sockaddr
*) &s2addr
, &addrlen
) != 0)
1877 skip("Failed to call getsockname, some tests skipped: %d\n", WSAGetLastError());
1881 s2addr
.sin_addr
.s_addr
= addresses
[0]; /* Always target the local adapter address */
1882 s2
=socket(AF_INET
, SOCK_DGRAM
, 0);
1883 if (s2
== INVALID_SOCKET
)
1885 skip("socket() failed error, some tests skipped: %d\n", WSAGetLastError());
1890 /* Test an empty message header */
1891 rc
=pWSARecvMsg(s1
, NULL
, NULL
, NULL
, NULL
);
1892 err
=WSAGetLastError();
1893 ok(rc
== SOCKET_ERROR
&& err
== WSAEFAULT
, "WSARecvMsg() failed error: %d (ret = %d)\n", err
, rc
);
1896 * Send a packet from the client to the server and test for specifying
1897 * a short control header.
1899 SetLastError(0xdeadbeef);
1900 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1901 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1902 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1903 hdr
.Control
.len
= 1;
1904 rc
=pWSARecvMsg(s1
, &hdr
, &dwSize
, NULL
, NULL
);
1905 err
=WSAGetLastError();
1906 ok(rc
== SOCKET_ERROR
&& err
== WSAEMSGSIZE
&& (hdr
.dwFlags
& MSG_CTRUNC
),
1907 "WSARecvMsg() failed error: %d (ret: %d, flags: %d)\n", err
, rc
, hdr
.dwFlags
);
1908 hdr
.dwFlags
= 0; /* Reset flags */
1910 /* Perform another short control header test, this time with an overlapped receive */
1911 hdr
.Control
.len
= 1;
1912 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1913 err
=WSAGetLastError();
1914 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1915 SetLastError(0xdeadbeef);
1916 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1917 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1918 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
1919 if (WaitForSingleObject(ov
.hEvent
, 100) != WAIT_OBJECT_0
)
1921 skip("Server side did not receive packet, some tests skipped.\n");
1927 WSAGetOverlappedResult(s1
, &ov
, NULL
, FALSE
, &dwFlags
);
1929 "WSAGetOverlappedResult() returned unexpected flags %d!\n", dwFlags
);
1930 ok(hdr
.dwFlags
== MSG_CTRUNC
,
1931 "WSARecvMsg() overlapped operation set unexpected flags %d.\n", hdr
.dwFlags
);
1932 hdr
.dwFlags
= 0; /* Reset flags */
1935 * Setup an overlapped receive, send a packet, then wait for the packet to be retrieved
1936 * on the server end and check that the returned packet matches what was sent.
1938 hdr
.Control
.len
= sizeof(pktbuf
);
1939 rc
=pWSARecvMsg(s1
, &hdr
, NULL
, &ov
, NULL
);
1940 err
=WSAGetLastError();
1941 ok(rc
!= 0 && err
== WSA_IO_PENDING
, "WSARecvMsg() failed error: %d\n", err
);
1942 ok(hdr
.Control
.len
== sizeof(pktbuf
),
1943 "WSARecvMsg() control length mismatch (%d != sizeof pktbuf).\n", hdr
.Control
.len
);
1944 rc
=sendto(s2
, msg
, sizeof(msg
), 0, (struct sockaddr
*)&s2addr
, sizeof(s2addr
));
1945 ok(rc
== sizeof(msg
), "sendto() failed error: %d\n", WSAGetLastError());
1946 if (WaitForSingleObject(ov
.hEvent
, 100) != WAIT_OBJECT_0
)
1948 skip("Server side did not receive packet, some tests skipped.\n");
1954 WSAGetOverlappedResult(s1
, &ov
, &dwSize
, FALSE
, NULL
);
1955 ok(dwSize
== sizeof(msg
),
1956 "WSARecvMsg() buffer length does not match transmitted data!\n");
1957 ok(strncmp(iovec
[0].buf
, msg
, sizeof(msg
)) == 0,
1958 "WSARecvMsg() buffer does not match transmitted data!\n");
1959 ok(hdr
.Control
.len
== IP_PKTINFO_LEN
,
1960 "WSARecvMsg() control length mismatch (%d).\n", hdr
.Control
.len
);
1962 /* Test for the expected IP_PKTINFO return information. */
1964 for (cmsg
= WSA_CMSG_FIRSTHDR(&hdr
); cmsg
!= NULL
; cmsg
= WSA_CMSG_NXTHDR(&hdr
, cmsg
))
1966 if (cmsg
->cmsg_level
== IPPROTO_IP
&& cmsg
->cmsg_type
== IP_PKTINFO
)
1968 struct in_pktinfo
*pi
= (struct in_pktinfo
*)WSA_CMSG_DATA(cmsg
);
1970 ok(pi
->ipi_addr
.s_addr
== s2addr
.sin_addr
.s_addr
, "destination ip mismatch!\n");
1974 ok(foundhdr
, "IP_PKTINFO header information was not returned!\n");
1981 CloseHandle(ov
.hEvent
);
1984 /************* Array containing the tests to run **********/
1986 #define STD_STREAM_SOCKET \
1992 static test_setup tests
[] =
1994 /* Test 0: synchronous client and server */
2015 /* Test 1: event-driven client, synchronous server */
2032 WSA_FLAG_OVERLAPPED
,
2036 /* Test 2: synchronous client, non-blocking server via select() */
2057 /* Test 3: OOB client, OOB server */
2078 /* Test 4: synchronous mixed client and server */
2092 simple_mixed_client
,
2101 static void test_UDP(void)
2103 /* This function tests UDP sendto() and recvfrom(). UDP is unreliable, so it is
2104 possible that this test fails due to dropped packets. */
2106 /* peer 0 receives data from all other peers */
2107 struct sock_info peer
[NUM_UDP_PEERS
];
2109 int ss
, i
, n_recv
, n_sent
;
2111 memset (buf
,0,sizeof(buf
));
2112 for ( i
= NUM_UDP_PEERS
- 1; i
>= 0; i
-- ) {
2113 ok ( ( peer
[i
].s
= socket ( AF_INET
, SOCK_DGRAM
, 0 ) ) != INVALID_SOCKET
, "UDP: socket failed\n" );
2115 peer
[i
].addr
.sin_family
= AF_INET
;
2116 peer
[i
].addr
.sin_addr
.s_addr
= inet_addr ( SERVERIP
);
2119 peer
[i
].addr
.sin_port
= htons ( SERVERPORT
);
2121 peer
[i
].addr
.sin_port
= htons ( 0 );
2124 do_bind ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, sizeof( peer
[i
].addr
) );
2126 /* test getsockname() to get peer's port */
2127 ss
= sizeof ( peer
[i
].addr
);
2128 ok ( getsockname ( peer
[i
].s
, (struct sockaddr
*) &peer
[i
].addr
, &ss
) != SOCKET_ERROR
, "UDP: could not getsockname()\n" );
2129 ok ( peer
[i
].addr
.sin_port
!= htons ( 0 ), "UDP: bind() did not associate port\n" );
2132 /* test getsockname() */
2133 ok ( peer
[0].addr
.sin_port
== htons ( SERVERPORT
), "UDP: getsockname returned incorrect peer port\n" );
2135 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2136 /* send client's ip */
2137 memcpy( buf
, &peer
[i
].addr
.sin_port
, sizeof(peer
[i
].addr
.sin_port
) );
2138 n_sent
= sendto ( peer
[i
].s
, buf
, sizeof(buf
), 0, (struct sockaddr
*) &peer
[0].addr
, sizeof(peer
[0].addr
) );
2139 ok ( n_sent
== sizeof(buf
), "UDP: sendto() sent wrong amount of data or socket error: %d\n", n_sent
);
2142 for ( i
= 1; i
< NUM_UDP_PEERS
; i
++ ) {
2143 n_recv
= recvfrom ( peer
[0].s
, buf
, sizeof(buf
), 0,(struct sockaddr
*) &peer
[0].peer
, &ss
);
2144 ok ( n_recv
== sizeof(buf
), "UDP: recvfrom() received wrong amount of data or socket error: %d\n", n_recv
);
2145 ok ( memcmp ( &peer
[0].peer
.sin_port
, buf
, sizeof(peer
[0].addr
.sin_port
) ) == 0, "UDP: port numbers do not match\n" );
2149 static DWORD WINAPI
do_getservbyname( void *param
)
2155 } serv
[2] = { {"domain", "udp", 53}, {"telnet", "tcp", 23} };
2157 HANDLE
*starttest
= param
;
2159 struct servent
*pserv
[2];
2161 ok ( WaitForSingleObject ( *starttest
, TEST_TIMEOUT
* 1000 ) != WAIT_TIMEOUT
,
2162 "test_getservbyname: timeout waiting for start signal\n" );
2164 /* ensure that necessary buffer resizes are completed */
2165 for ( j
= 0; j
< 2; j
++) {
2166 pserv
[j
] = getservbyname ( serv
[j
].name
, serv
[j
].proto
);
2169 for ( i
= 0; i
< NUM_QUERIES
/ 2; i
++ ) {
2170 for ( j
= 0; j
< 2; j
++ ) {
2171 pserv
[j
] = getservbyname ( serv
[j
].name
, serv
[j
].proto
);
2172 ok ( pserv
[j
] != NULL
|| broken(pserv
[j
] == NULL
) /* win8, fixed in win81 */,
2173 "getservbyname could not retrieve information for %s: %d\n", serv
[j
].name
, WSAGetLastError() );
2174 if ( !pserv
[j
] ) continue;
2175 ok ( pserv
[j
]->s_port
== htons(serv
[j
].port
),
2176 "getservbyname returned the wrong port for %s: %d\n", serv
[j
].name
, ntohs(pserv
[j
]->s_port
) );
2177 ok ( !strcmp ( pserv
[j
]->s_proto
, serv
[j
].proto
),
2178 "getservbyname returned the wrong protocol for %s: %s\n", serv
[j
].name
, pserv
[j
]->s_proto
);
2179 ok ( !strcmp ( pserv
[j
]->s_name
, serv
[j
].name
),
2180 "getservbyname returned the wrong name for %s: %s\n", serv
[j
].name
, pserv
[j
]->s_name
);
2183 ok ( pserv
[0] == pserv
[1] || broken(pserv
[0] != pserv
[1]) /* win8, fixed in win81 */,
2184 "getservbyname: winsock resized servent buffer when not necessary\n" );
2190 static void test_getservbyname(void)
2193 HANDLE starttest
, thread
[NUM_THREADS
];
2194 DWORD thread_id
[NUM_THREADS
];
2196 starttest
= CreateEventA ( NULL
, 1, 0, "test_getservbyname_starttest" );
2198 /* create threads */
2199 for ( i
= 0; i
< NUM_THREADS
; i
++ ) {
2200 thread
[i
] = CreateThread ( NULL
, 0, do_getservbyname
, &starttest
, 0, &thread_id
[i
] );
2203 /* signal threads to start */
2204 SetEvent ( starttest
);
2206 for ( i
= 0; i
< NUM_THREADS
; i
++) {
2207 WaitForSingleObject ( thread
[i
], TEST_TIMEOUT
* 1000 );
2211 static void test_WSASocket(void)
2213 SOCKET sock
= INVALID_SOCKET
;
2214 WSAPROTOCOL_INFOA
*pi
;
2215 int wsaproviders
[] = {IPPROTO_TCP
, IPPROTO_IP
};
2216 int autoprotocols
[] = {IPPROTO_TCP
, IPPROTO_UDP
};
2217 int items
, err
, size
, socktype
, i
, j
;
2220 SetLastError(0xdeadbeef);
2221 ok(WSASocketA(0, 0, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2222 "WSASocketA should have failed\n");
2223 err
= WSAGetLastError();
2224 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2226 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
2227 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2230 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, NULL
, 0, 0);
2231 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2234 SetLastError(0xdeadbeef);
2235 ok(WSASocketA(0, SOCK_STREAM
, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2236 "WSASocketA should have failed\n");
2237 err
= WSAGetLastError();
2238 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2240 SetLastError(0xdeadbeef);
2241 ok(WSASocketA(0, -1, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2242 "WSASocketA should have failed\n");
2243 err
= WSAGetLastError();
2244 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2246 SetLastError(0xdeadbeef);
2247 ok(WSASocketA(0, -1, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2248 "WSASocketA should have failed\n");
2249 err
= WSAGetLastError();
2250 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2252 SetLastError(0xdeadbeef);
2253 ok(WSASocketA(AF_INET
, -1, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2254 "WSASocketA should have failed\n");
2255 err
= WSAGetLastError();
2256 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2258 SetLastError(0xdeadbeef);
2259 ok(WSASocketA(AF_INET
, 0, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2260 "WSASocketA should have failed\n");
2261 err
= WSAGetLastError();
2262 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2264 SetLastError(0xdeadbeef);
2265 ok(WSASocketA(0, -1, -1, NULL
, 0, 0) == INVALID_SOCKET
,
2266 "WSASocketA should have failed\n");
2267 err
= WSAGetLastError();
2268 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2270 SetLastError(0xdeadbeef);
2271 ok(WSASocketA(-1, SOCK_STREAM
, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2272 "WSASocketA should have failed\n");
2273 err
= WSAGetLastError();
2274 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2276 sock
= WSASocketA(AF_INET
, 0, IPPROTO_TCP
, NULL
, 0, 0);
2277 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2280 SetLastError(0xdeadbeef);
2281 ok(WSASocketA(0, SOCK_STREAM
, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2282 "WSASocketA should have failed\n");
2283 err
= WSAGetLastError();
2284 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2286 SetLastError(0xdeadbeef);
2287 ok(WSASocketA(0, 0, 0xdead, NULL
, 0, 0) == INVALID_SOCKET
,
2288 "WSASocketA should have failed\n");
2289 err
= WSAGetLastError();
2290 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2292 SetLastError(0xdeadbeef);
2293 ok(WSASocketA(AF_INET
, 0xdead, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2294 "WSASocketA should have failed\n");
2295 err
= WSAGetLastError();
2296 ok(err
== WSAESOCKTNOSUPPORT
, "Expected 10044, received %d\n", err
);
2298 SetLastError(0xdeadbeef);
2299 ok(WSASocketA(0, 0xdead, 0, NULL
, 0, 0) == INVALID_SOCKET
,
2300 "WSASocketA should have failed\n");
2301 err
= WSAGetLastError();
2302 ok(err
== WSAEINVAL
, "Expected 10022, received %d\n", err
);
2304 sock
= WSASocketA(0, 0, IPPROTO_TCP
, NULL
, 0, 0);
2305 ok(sock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2308 /* SOCK_STREAM does not support IPPROTO_UDP */
2309 SetLastError(0xdeadbeef);
2310 ok(WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_UDP
, NULL
, 0, 0) == INVALID_SOCKET
,
2311 "WSASocketA should have failed\n");
2312 err
= WSAGetLastError();
2313 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2315 /* SOCK_DGRAM does not support IPPROTO_TCP */
2316 SetLastError(0xdeadbeef);
2317 ok(WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_TCP
, NULL
, 0, 0) == INVALID_SOCKET
,
2318 "WSASocketA should have failed\n");
2319 err
= WSAGetLastError();
2320 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2322 /* Set pi_size explicitly to a value below 2*sizeof(WSAPROTOCOL_INFOA)
2323 * to avoid a crash on win98.
2326 items
= WSAEnumProtocolsA(wsaproviders
, NULL
, &pi_size
);
2327 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA({6,0}, NULL, 0) returned %d\n",
2329 err
= WSAGetLastError();
2330 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2333 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2334 ok(pi
!= NULL
, "Failed to allocate memory\n");
2336 skip("Can't continue without memory.\n");
2340 items
= WSAEnumProtocolsA(wsaproviders
, pi
, &pi_size
);
2341 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2345 skip("No protocols enumerated.\n");
2346 HeapFree(GetProcessHeap(), 0, pi
);
2350 sock
= WSASocketA(FROM_PROTOCOL_INFO
, FROM_PROTOCOL_INFO
,
2351 FROM_PROTOCOL_INFO
, &pi
[0], 0, 0);
2352 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2356 /* find what parameters are used first: plain parameters or protocol info struct */
2357 pi
[0].iProtocol
= -1;
2358 pi
[0].iSocketType
= -1;
2359 pi
[0].iAddressFamily
= -1;
2360 ok(WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0) == INVALID_SOCKET
,
2361 "WSASocketA should have failed\n");
2362 err
= WSAGetLastError();
2363 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2365 pi
[0].iProtocol
= 0;
2366 pi
[0].iSocketType
= 0;
2367 pi
[0].iAddressFamily
= 0;
2368 sock
= WSASocketA(0, 0, IPPROTO_UDP
, &pi
[0], 0, 0);
2369 if(sock
!= INVALID_SOCKET
)
2371 win_skip("must work only in OS <= 2003\n");
2376 err
= WSAGetLastError();
2377 ok(err
== WSAEAFNOSUPPORT
, "Expected 10047, received %d\n", err
);
2380 pi
[0].iProtocol
= IPPROTO_UDP
;
2381 pi
[0].iSocketType
= SOCK_DGRAM
;
2382 pi
[0].iAddressFamily
= AF_INET
;
2383 sock
= WSASocketA(0, 0, 0, &pi
[0], 0, 0);
2384 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2386 size
= sizeof(socktype
);
2388 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2389 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2390 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2391 SOCK_DGRAM
, socktype
);
2394 sock
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, &pi
[0], 0, 0);
2395 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2397 size
= sizeof(socktype
);
2399 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2400 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2401 ok(socktype
== SOCK_STREAM
, "Wrong socket type, expected %d received %d\n",
2402 SOCK_STREAM
, socktype
);
2405 HeapFree(GetProcessHeap(), 0, pi
);
2408 items
= WSAEnumProtocolsA(NULL
, NULL
, &pi_size
);
2409 ok(items
== SOCKET_ERROR
, "WSAEnumProtocolsA(NULL, NULL, 0) returned %d\n",
2411 err
= WSAGetLastError();
2412 ok(err
== WSAENOBUFS
, "WSAEnumProtocolsA error is %d, not WSAENOBUFS(%d)\n",
2415 pi
= HeapAlloc(GetProcessHeap(), 0, pi_size
);
2416 ok(pi
!= NULL
, "Failed to allocate memory\n");
2418 skip("Can't continue without memory.\n");
2422 items
= WSAEnumProtocolsA(NULL
, pi
, &pi_size
);
2423 ok(items
!= SOCKET_ERROR
, "WSAEnumProtocolsA failed, last error is %d\n",
2426 /* when no protocol and socket type are specified the first entry
2427 * from WSAEnumProtocols that has the flag PFL_MATCHES_PROTOCOL_ZERO
2429 sock
= WSASocketA(AF_INET
, 0, 0, NULL
, 0, 0);
2430 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2433 size
= sizeof(socktype
);
2435 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2436 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2437 for(i
= 0; i
< items
; i
++)
2439 if(pi
[i
].dwProviderFlags
& PFL_MATCHES_PROTOCOL_ZERO
)
2441 ok(socktype
== pi
[i
].iSocketType
, "Wrong socket type, expected %d received %d\n",
2442 pi
[i
].iSocketType
, socktype
);
2446 ok(i
!= items
, "Creating a socket without protocol and socket type didn't work\n");
2449 /* when no socket type is specified the first entry from WSAEnumProtocols
2450 * that matches the protocol is returned */
2451 for (i
= 0; i
< sizeof(autoprotocols
) / sizeof(autoprotocols
[0]); i
++)
2453 sock
= WSASocketA(0, 0, autoprotocols
[i
], NULL
, 0, 0);
2454 ok(sock
!= INVALID_SOCKET
, "Failed to create socket for protocol %d, received %d\n",
2455 autoprotocols
[i
], WSAGetLastError());
2457 size
= sizeof(socktype
);
2459 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2460 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2462 for (err
= 1, j
= 0; j
< items
; j
++)
2464 if (pi
[j
].iProtocol
== autoprotocols
[i
])
2466 if (socktype
== pi
[j
].iSocketType
)
2469 ok(0, "Wrong socket type, expected %d received %d\n",
2470 pi
[j
].iSocketType
, socktype
);
2474 ok(!err
, "Protocol %d not found in WSAEnumProtocols\n", autoprotocols
[i
]);
2479 HeapFree(GetProcessHeap(), 0, pi
);
2481 SetLastError(0xdeadbeef);
2482 /* starting on vista the socket function returns error during the socket
2483 creation and no longer in the socket operations (sendto, readfrom) */
2484 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_ICMP
, NULL
, 0, 0);
2485 if (sock
== INVALID_SOCKET
)
2487 err
= WSAGetLastError();
2488 ok(err
== WSAEACCES
, "Expected 10013, received %d\n", err
);
2489 skip("SOCK_RAW is not supported\n");
2493 trace("SOCK_RAW is supported\n");
2495 size
= sizeof(socktype
);
2497 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2498 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2499 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2500 SOCK_RAW
, socktype
);
2504 sock
= WSASocketA(0, 0, IPPROTO_RAW
, NULL
, 0, 0);
2505 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2507 size
= sizeof(socktype
);
2509 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2510 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2511 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2512 SOCK_RAW
, socktype
);
2516 sock
= WSASocketA(AF_INET
, SOCK_RAW
, IPPROTO_TCP
, NULL
, 0, 0);
2517 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2519 size
= sizeof(socktype
);
2521 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2522 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2523 ok(socktype
== SOCK_RAW
, "Wrong socket type, expected %d received %d\n",
2524 SOCK_RAW
, socktype
);
2528 /* IPX socket tests */
2530 SetLastError(0xdeadbeef);
2531 sock
= WSASocketA(AF_IPX
, SOCK_DGRAM
, NSPROTO_IPX
, NULL
, 0, 0);
2532 if (sock
== INVALID_SOCKET
)
2534 err
= WSAGetLastError();
2535 ok(err
== WSAEAFNOSUPPORT
|| broken(err
== WSAEPROTONOSUPPORT
), "Expected 10047, received %d\n", err
);
2536 skip("IPX is not supported\n");
2540 WSAPROTOCOL_INFOA info
;
2543 trace("IPX is supported\n");
2545 sock
= WSASocketA(0, 0, NSPROTO_IPX
, NULL
, 0, 0);
2546 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2549 size
= sizeof(socktype
);
2551 err
= getsockopt(sock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2552 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2553 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2554 SOCK_DGRAM
, socktype
);
2556 /* check socket family, type and protocol */
2557 size
= sizeof(WSAPROTOCOL_INFOA
);
2558 err
= getsockopt(sock
, SOL_SOCKET
, SO_PROTOCOL_INFOA
, (char *) &info
, &size
);
2559 ok(!err
,"getsockopt failed with %d\n", WSAGetLastError());
2560 ok(info
.iProtocol
== NSPROTO_IPX
, "expected protocol %d, received %d\n",
2561 NSPROTO_IPX
, info
.iProtocol
);
2562 ok(info
.iAddressFamily
== AF_IPX
, "expected family %d, received %d\n",
2563 AF_IPX
, info
.iProtocol
);
2564 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2565 SOCK_DGRAM
, info
.iSocketType
);
2568 /* SOCK_STREAM does not support NSPROTO_IPX */
2569 SetLastError(0xdeadbeef);
2570 ok(WSASocketA(AF_IPX
, SOCK_STREAM
, NSPROTO_IPX
, NULL
, 0, 0) == INVALID_SOCKET
,
2571 "WSASocketA should have failed\n");
2572 err
= WSAGetLastError();
2573 ok(err
== WSAEPROTONOSUPPORT
, "Expected 10043, received %d\n", err
);
2575 /* test extended IPX support - that is adding any number between 0 and 255
2576 * to the IPX protocol value will make it be used as IPX packet type */
2577 for(i
= 0;i
<= 255;i
+= 17)
2579 SetLastError(0xdeadbeef);
2580 sock
= WSASocketA(0, 0, NSPROTO_IPX
+ i
, NULL
, 0, 0);
2581 ok(sock
!= INVALID_SOCKET
, "Failed to create socket: %d\n",
2586 err
= getsockopt(sock
, NSPROTO_IPX
, IPX_PTYPE
, (char *) &socktype
, &size
);
2587 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
2588 ok(socktype
== i
, "Wrong IPX packet type, expected %d received %d\n",
2596 static void test_WSADuplicateSocket(void)
2598 SOCKET source
, dupsock
;
2599 WSAPROTOCOL_INFOA info
;
2601 struct sockaddr_in addr
;
2602 int socktype
, size
, addrsize
, ret
;
2603 char teststr
[] = "TEST", buffer
[16];
2605 source
= WSASocketA(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
2606 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2608 /* test invalid parameters */
2609 SetLastError(0xdeadbeef);
2610 ok(WSADuplicateSocketA(0, 0, NULL
), "WSADuplicateSocketA should have failed\n");
2611 err
= WSAGetLastError();
2612 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2614 SetLastError(0xdeadbeef);
2615 ok(WSADuplicateSocketA(source
, 0, NULL
),
2616 "WSADuplicateSocketA should have failed\n");
2617 err
= WSAGetLastError();
2618 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2620 SetLastError(0xdeadbeef);
2621 ok(WSADuplicateSocketA(source
, ~0, &info
),
2622 "WSADuplicateSocketA should have failed\n");
2623 err
= WSAGetLastError();
2624 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2626 SetLastError(0xdeadbeef);
2627 ok(WSADuplicateSocketA(0, GetCurrentProcessId(), &info
),
2628 "WSADuplicateSocketA should have failed\n");
2629 err
= WSAGetLastError();
2630 ok(err
== WSAENOTSOCK
, "expected 10038, received %d\n", err
);
2632 SetLastError(0xdeadbeef);
2633 ok(WSADuplicateSocketA(source
, GetCurrentProcessId(), NULL
),
2634 "WSADuplicateSocketA should have failed\n");
2635 err
= WSAGetLastError();
2636 ok(err
== WSAEFAULT
, "expected 10014, received %d\n", err
);
2638 /* test returned structure */
2639 memset(&info
, 0, sizeof(info
));
2640 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2641 "WSADuplicateSocketA should have worked\n");
2643 ok(info
.iProtocol
== IPPROTO_TCP
, "expected protocol %d, received %d\n",
2644 IPPROTO_TCP
, info
.iProtocol
);
2645 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2646 AF_INET
, info
.iProtocol
);
2647 ok(info
.iSocketType
== SOCK_STREAM
, "expected type %d, received %d\n",
2648 SOCK_STREAM
, info
.iSocketType
);
2650 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2651 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2653 closesocket(dupsock
);
2654 closesocket(source
);
2656 /* create a socket, bind it, duplicate it then send data on source and
2657 * receive in the duplicated socket */
2658 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2659 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2661 memset(&info
, 0, sizeof(info
));
2662 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2663 "WSADuplicateSocketA should have worked\n");
2665 ok(info
.iProtocol
== IPPROTO_UDP
, "expected protocol %d, received %d\n",
2666 IPPROTO_UDP
, info
.iProtocol
);
2667 ok(info
.iAddressFamily
== AF_INET
, "expected family %d, received %d\n",
2668 AF_INET
, info
.iProtocol
);
2669 ok(info
.iSocketType
== SOCK_DGRAM
, "expected type %d, received %d\n",
2670 SOCK_DGRAM
, info
.iSocketType
);
2672 memset(&addr
, 0, sizeof(addr
));
2673 addr
.sin_family
= AF_INET
;
2674 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2675 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2676 "bind should have worked\n");
2678 /* read address to find out the port number to be used in sendto */
2679 memset(&addr
, 0, sizeof(addr
));
2680 addrsize
= sizeof(addr
);
2681 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2682 "getsockname should have worked\n");
2683 ok(addr
.sin_port
, "socket port should be != 0\n");
2685 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2686 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2689 ret
= getsockopt(dupsock
, SOL_SOCKET
, SO_TYPE
, (char *) &socktype
, &size
);
2690 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
2691 ok(socktype
== SOCK_DGRAM
, "Wrong socket type, expected %d received %d\n",
2692 SOCK_DGRAM
, socktype
);
2694 set_blocking(source
, TRUE
);
2696 /* send data on source socket */
2697 addrsize
= sizeof(addr
);
2698 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2699 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2701 /* receive on duplicated socket */
2702 addrsize
= sizeof(addr
);
2703 memset(buffer
, 0, sizeof(buffer
));
2704 size
= recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
);
2705 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2706 buffer
[sizeof(teststr
) - 1] = 0;
2707 ok(!strcmp(buffer
, teststr
), "expected '%s', received '%s'\n", teststr
, buffer
);
2709 closesocket(dupsock
);
2710 closesocket(source
);
2712 /* show that the source socket need to be bound before the duplicated
2713 * socket is created */
2714 source
= WSASocketA(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
, NULL
, 0, 0);
2715 ok(source
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2717 memset(&info
, 0, sizeof(info
));
2718 ok(!WSADuplicateSocketA(source
, GetCurrentProcessId(), &info
),
2719 "WSADuplicateSocketA should have worked\n");
2721 dupsock
= WSASocketA(0, 0, 0, &info
, 0, 0);
2722 ok(dupsock
!= INVALID_SOCKET
, "WSASocketA should have succeeded\n");
2724 memset(&addr
, 0, sizeof(addr
));
2725 addr
.sin_family
= AF_INET
;
2726 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
2727 ok(!bind(source
, (struct sockaddr
*)&addr
, sizeof(addr
)),
2728 "bind should have worked\n");
2730 /* read address to find out the port number to be used in sendto */
2731 memset(&addr
, 0, sizeof(addr
));
2732 addrsize
= sizeof(addr
);
2733 ok(!getsockname(source
, (struct sockaddr
*) &addr
, &addrsize
),
2734 "getsockname should have worked\n");
2735 ok(addr
.sin_port
, "socket port should be != 0\n");
2737 set_blocking(source
, TRUE
);
2739 addrsize
= sizeof(addr
);
2740 size
= sendto(source
, teststr
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, addrsize
);
2741 ok(size
== sizeof(teststr
), "got %d (err %d)\n", size
, WSAGetLastError());
2743 SetLastError(0xdeadbeef);
2744 addrsize
= sizeof(addr
);
2745 memset(buffer
, 0, sizeof(buffer
));
2747 ok(recvfrom(dupsock
, buffer
, sizeof(teststr
), 0, (struct sockaddr
*) &addr
, &addrsize
) == -1,
2748 "recvfrom should have failed\n");
2749 err
= WSAGetLastError();
2750 ok(err
== WSAEINVAL
, "expected 10022, received %d\n", err
);
2753 closesocket(dupsock
);
2754 closesocket(source
);
2757 static void test_WSAEnumNetworkEvents(void)
2760 int sock_type
[] = {SOCK_STREAM
, SOCK_DGRAM
, SOCK_STREAM
}, i
, j
, k
, l
;
2761 struct sockaddr_in address
;
2763 WSANETWORKEVENTS net_events
;
2764 /* Windows 2000 Pro without SP installed (testbot) will crash if
2765 * WSAEnumNetworkEvents have a NULL event, so skip this test in <= 2000 */
2766 DWORD ver
= GetVersion() & 0xFFFF;
2767 BOOL supports_null
= ((ver
& 0xFF) << 8 | (ver
>> 8)) > 0x0500;
2769 memset(&address
, 0, sizeof(address
));
2770 address
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
2771 address
.sin_family
= AF_INET
;
2773 /* This test follows the steps from bugs 10204 and 24946 */
2774 for (l
= 0; l
< 2; l
++)
2776 if (l
== 1 && !supports_null
&& broken(1)) continue;
2778 for (i
= 0; i
< sizeof(sock_type
) / sizeof(sock_type
[0]); i
++)
2781 ok(!tcp_socketpair(&s
, &s2
), "Test[%d]: creating socket pair failed\n", i
);
2784 s
= socket(AF_INET
, sock_type
[i
], 0);
2785 ok (s
!= SOCKET_ERROR
, "Test[%d]: failed to create socket\n", i
);
2786 ok (!bind(s
, (struct sockaddr
*) &address
, sizeof(address
)), "Test[%d]: bind failed\n", i
);
2788 event
= WSACreateEvent();
2789 ok (event
!= NULL
, "Test[%d]: failed to create event\n", i
);
2790 for (j
= 0; j
< 5; j
++) /* Repeat sometimes and the result must be the same */
2792 /* When the TCP socket is not connected NO events will be returned.
2793 * When connected and no data pending it will get the write event.
2794 * UDP sockets don't have connections so as soon as they are bound
2795 * they can read/write data. Since nobody is sendind us data only
2796 * the write event will be returned and ONLY once.
2798 ok (!WSAEventSelect(s
, event
, FD_READ
| FD_WRITE
), "Test[%d]: WSAEventSelect failed\n", i
);
2799 memset(&net_events
, 0xAB, sizeof(net_events
));
2800 ok (!WSAEnumNetworkEvents(s
, l
== 0 ? event
: NULL
, &net_events
),
2801 "Test[%d]: WSAEnumNetworkEvents failed\n", i
);
2802 if (i
>= 1 && j
== 0) /* FD_WRITE is SET on first try for UDP and connected TCP */
2804 todo_wine_if (i
== 0) /* Remove when fixed */
2805 ok (net_events
.lNetworkEvents
== FD_WRITE
, "Test[%d]: expected 2, got %d\n",
2806 i
, net_events
.lNetworkEvents
);
2810 todo_wine_if (i
!= 0) /* Remove when fixed */
2811 ok (net_events
.lNetworkEvents
== 0, "Test[%d]: expected 0, got %d\n",
2812 i
, net_events
.lNetworkEvents
);
2814 for (k
= 0; k
< FD_MAX_EVENTS
; k
++)
2816 if (i
>= 1 && j
== 0 && k
== 1) /* first UDP and connected TCP test, FD_WRITE bit no error*/
2818 ok (net_events
.iErrorCode
[k
] == 0x0, "Test[%d][%d]: expected 0x0, got 0x%x\n",
2819 i
, k
, net_events
.iErrorCode
[k
]);
2823 /* Bits that are not set in lNetworkEvents MUST not be changed */
2825 ok (net_events
.iErrorCode
[k
] == 0xABABABAB, "Test[%d][%d]: expected 0xABABABAB, got 0x%x\n",
2826 i
, k
, net_events
.iErrorCode
[k
]);
2831 WSACloseEvent(event
);
2832 if (i
== 2) closesocket(s2
);
2837 static void test_WSAAddressToStringA(void)
2839 SOCKET v6
= INVALID_SOCKET
;
2843 SOCKADDR_IN sockaddr
;
2844 CHAR address
[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
2846 CHAR expect1
[] = "0.0.0.0";
2847 CHAR expect2
[] = "255.255.255.255";
2848 CHAR expect3
[] = "0.0.0.0:65535";
2849 CHAR expect4
[] = "255.255.255.255:65535";
2851 SOCKADDR_IN6 sockaddr6
;
2852 CHAR address6
[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
2854 CHAR addr6_1
[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
2855 CHAR addr6_2
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
2856 CHAR addr6_3
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
2858 CHAR expect6_1
[] = "::1";
2859 CHAR expect6_2
[] = "20ab::1";
2860 CHAR expect6_3
[] = "[20ab::2001]:33274";
2861 CHAR expect6_3_nt
[] = "20ab::2001@33274";
2862 CHAR expect6_3_w2k
[] = "20ab::2001";
2863 CHAR expect6_3_2
[] = "[20ab::2001%4660]:33274";
2864 CHAR expect6_3_2_nt
[] = "4660/20ab::2001@33274";
2865 CHAR expect6_3_2_w2k
[] = "20ab::2001%4660";
2866 CHAR expect6_3_3
[] = "20ab::2001%4660";
2867 CHAR expect6_3_3_nt
[] = "4660/20ab::2001";
2871 sockaddr
.sin_family
= AF_INET
;
2872 sockaddr
.sin_port
= 0;
2873 sockaddr
.sin_addr
.s_addr
= 0;
2875 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2876 GLE
= WSAGetLastError();
2877 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEFAULT
) || (ret
== 0),
2878 "WSAAddressToStringA() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
2881 len
= sizeof(address
);
2883 sockaddr
.sin_family
= AF_INET
;
2884 sockaddr
.sin_port
= 0;
2885 sockaddr
.sin_addr
.s_addr
= 0;
2887 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2888 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2890 ok( !strcmp( address
, expect1
), "Expected: %s, got: %s\n", expect1
, address
);
2891 ok( len
== sizeof( expect1
), "Got size %d\n", len
);
2893 len
= sizeof(address
);
2895 sockaddr
.sin_family
= AF_INET
;
2896 sockaddr
.sin_port
= 0;
2897 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
2899 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2900 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2902 ok( !strcmp( address
, expect2
), "Expected: %s, got: %s\n", expect2
, address
);
2904 len
= sizeof(address
);
2906 sockaddr
.sin_family
= AF_INET
;
2907 sockaddr
.sin_port
= 0xffff;
2908 sockaddr
.sin_addr
.s_addr
= 0;
2910 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2911 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2913 ok( !strcmp( address
, expect3
), "Expected: %s, got: %s\n", expect3
, address
);
2915 len
= sizeof(address
);
2917 sockaddr
.sin_family
= AF_INET
;
2918 sockaddr
.sin_port
= 0xffff;
2919 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
2921 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
2922 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2924 ok( !strcmp( address
, expect4
), "Expected: %s, got: %s\n", expect4
, address
);
2925 ok( len
== sizeof( expect4
), "Got size %d\n", len
);
2927 /*check to see it IPv6 is available */
2928 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
2929 if (v6
== INVALID_SOCKET
) {
2930 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
2931 WSAGetLastError(), WSAEAFNOSUPPORT
);
2934 /* Test a short 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_1
, sizeof(addr6_1
));
2942 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2943 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2944 ok( !strcmp( address6
, expect6_1
), "Expected: %s, got: %s\n", expect6_1
, address6
);
2945 ok( len
== sizeof(expect6_1
), "Got size %d\n", len
);
2947 /* Test a longer IPv6 address */
2948 len
= sizeof(address6
);
2950 sockaddr6
.sin6_family
= AF_INET6
;
2951 sockaddr6
.sin6_port
= 0x0000;
2952 sockaddr6
.sin6_scope_id
= 0;
2953 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_2
, sizeof(addr6_2
));
2955 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2956 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2957 ok( !strcmp( address6
, expect6_2
), "Expected: %s, got: %s\n", expect6_2
, address6
);
2958 ok( len
== sizeof(expect6_2
), "Got size %d\n", len
);
2960 /* Test IPv6 address and port number */
2961 len
= sizeof(address6
);
2963 sockaddr6
.sin6_family
= AF_INET6
;
2964 sockaddr6
.sin6_port
= 0xfa81;
2965 sockaddr6
.sin6_scope_id
= 0;
2966 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
2968 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2969 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2970 ok( !strcmp( address6
, expect6_3
) ||
2971 broken( !strcmp( address6
, expect6_3_nt
) ) || /* NT4 */
2972 broken( !strcmp( address6
, expect6_3_w2k
) ), /* Win2000 */
2973 "Expected: %s, got: %s\n", expect6_3
, address6
);
2974 ok( len
== sizeof(expect6_3
) ||
2975 broken( len
== sizeof(expect6_3_nt
) ) || /* NT4 */
2976 broken( len
== sizeof(expect6_3_w2k
) ), /* Win2000 */
2977 "Got size %d\n", len
);
2979 /* Test IPv6 address, port number and scope_id */
2980 len
= sizeof(address6
);
2982 sockaddr6
.sin6_family
= AF_INET6
;
2983 sockaddr6
.sin6_port
= 0xfa81;
2984 sockaddr6
.sin6_scope_id
= 0x1234;
2985 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
2987 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
2988 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
2989 ok( !strcmp( address6
, expect6_3_2
) ||
2990 broken( !strcmp( address6
, expect6_3_2_nt
) ) || /* NT4 */
2991 broken( !strcmp( address6
, expect6_3_2_w2k
) ), /* Win2000 */
2992 "Expected: %s, got: %s\n", expect6_3_2
, address6
);
2993 ok( len
== sizeof(expect6_3_2
) ||
2994 broken( len
== sizeof(expect6_3_2_nt
) ) || /* NT4 */
2995 broken( len
== sizeof(expect6_3_2_w2k
) ), /* Win2000 */
2996 "Got size %d\n", len
);
2998 /* Test IPv6 address and scope_id */
2999 len
= sizeof(address6
);
3001 sockaddr6
.sin6_family
= AF_INET6
;
3002 sockaddr6
.sin6_port
= 0x0000;
3003 sockaddr6
.sin6_scope_id
= 0x1234;
3004 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3006 ret
= WSAAddressToStringA( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3007 ok( !ret
, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
3008 ok( !strcmp( address6
, expect6_3_3
) ||
3009 broken( !strcmp( address6
, expect6_3_3_nt
) ), /* NT4 */
3010 "Expected: %s, got: %s\n", expect6_3_3
, address6
);
3011 ok( len
== sizeof(expect6_3_3
) ||
3012 broken( len
== sizeof(expect6_3_3_nt
) ), /* NT4 */
3013 "Got size %d\n", len
);
3016 if (v6
!= INVALID_SOCKET
)
3020 static void test_WSAAddressToStringW(void)
3022 SOCKET v6
= INVALID_SOCKET
;
3026 SOCKADDR_IN sockaddr
;
3027 WCHAR address
[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
3029 WCHAR expect1
[] = { '0','.','0','.','0','.','0', 0 };
3030 WCHAR expect2
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3031 WCHAR expect3
[] = { '0','.','0','.','0','.','0', ':', '6', '5', '5', '3', '5', 0 };
3032 WCHAR expect4
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3033 '6', '5', '5', '3', '5', 0 };
3035 SOCKADDR_IN6 sockaddr6
;
3036 WCHAR address6
[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
3038 CHAR addr6_1
[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3039 CHAR addr6_2
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
3040 CHAR addr6_3
[] = {0x20,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01};
3042 WCHAR expect6_1
[] = {':',':','1',0};
3043 WCHAR expect6_2
[] = {'2','0','a','b',':',':','1',0};
3044 WCHAR expect6_3
[] = {'[','2','0','a','b',':',':','2','0','0','1',']',':','3','3','2','7','4',0};
3045 WCHAR expect6_3_nt
[] = {'2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3046 WCHAR expect6_3_w2k
[] = {'2','0','a','b',':',':','2','0','0','1',0};
3047 WCHAR expect6_3_2
[] = {'[','2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',']',':','3','3','2','7','4',0};
3048 WCHAR expect6_3_2_nt
[] = {'4','6','6','0','/','2','0','a','b',':',':','2','0','0','1','@','3','3','2','7','4',0};
3049 WCHAR expect6_3_2_w2k
[] = {'2','0','a','b',':',':','2','0','0','1','%','4','6','6','0',0};
3050 WCHAR expect6_3_3
[] = {'2','0','a','b',':',':','2','0','0','1','%','6','5','5','3','4',0};
3051 WCHAR expect6_3_3_nt
[] = {'6','5','5','3','4','/','2','0','a','b',':',':','2','0','0','1',0};
3055 sockaddr
.sin_family
= AF_INET
;
3056 sockaddr
.sin_port
= 0;
3057 sockaddr
.sin_addr
.s_addr
= 0;
3059 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3060 GLE
= WSAGetLastError();
3061 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEFAULT
) || (ret
== 0),
3062 "WSAAddressToStringW() failed unexpectedly: WSAGetLastError()=%d, ret=%d\n",
3065 len
= sizeof(address
);
3067 sockaddr
.sin_family
= AF_INET
;
3068 sockaddr
.sin_port
= 0;
3069 sockaddr
.sin_addr
.s_addr
= 0;
3071 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3072 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3074 ok( !lstrcmpW( address
, expect1
), "Expected different address string\n" );
3075 ok( len
== sizeof( expect1
)/sizeof( WCHAR
), "Got size %d\n", len
);
3077 len
= sizeof(address
);
3079 sockaddr
.sin_family
= AF_INET
;
3080 sockaddr
.sin_port
= 0;
3081 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
3083 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3084 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3086 ok( !lstrcmpW( address
, expect2
), "Expected different address string\n" );
3088 len
= sizeof(address
);
3090 sockaddr
.sin_family
= AF_INET
;
3091 sockaddr
.sin_port
= 0xffff;
3092 sockaddr
.sin_addr
.s_addr
= 0;
3094 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3095 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3097 ok( !lstrcmpW( address
, expect3
), "Expected different address string\n" );
3099 len
= sizeof(address
);
3101 sockaddr
.sin_family
= AF_INET
;
3102 sockaddr
.sin_port
= 0xffff;
3103 sockaddr
.sin_addr
.s_addr
= 0xffffffff;
3105 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr
, sizeof(sockaddr
), NULL
, address
, &len
);
3106 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3108 ok( !lstrcmpW( address
, expect4
), "Expected different address string\n" );
3109 ok( len
== sizeof( expect4
)/sizeof( WCHAR
), "Got %d\n", len
);
3111 /*check to see it IPv6 is available */
3112 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
3113 if (v6
== INVALID_SOCKET
) {
3114 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
3115 WSAGetLastError(), WSAEAFNOSUPPORT
);
3119 /* Test a short 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_1
, sizeof(addr6_1
));
3127 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3128 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3129 ok( !lstrcmpW( address6
, expect6_1
), "Wrong string returned\n" );
3130 ok( len
== sizeof(expect6_1
)/sizeof(WCHAR
), "Got %d\n", len
);
3132 /* Test a longer IPv6 address */
3133 len
= sizeof(address6
)/sizeof(WCHAR
);
3135 sockaddr6
.sin6_family
= AF_INET6
;
3136 sockaddr6
.sin6_port
= 0x0000;
3137 sockaddr6
.sin6_scope_id
= 0;
3138 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_2
, sizeof(addr6_2
));
3140 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3141 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3143 ok( !lstrcmpW( address6
, expect6_2
), "Wrong string returned\n" );
3144 ok( len
== sizeof(expect6_2
)/sizeof(WCHAR
), "Got %d\n", len
);
3146 /* Test IPv6 address and port number */
3147 len
= sizeof(address6
)/sizeof(WCHAR
);
3149 sockaddr6
.sin6_family
= AF_INET6
;
3150 sockaddr6
.sin6_port
= 0xfa81;
3151 sockaddr6
.sin6_scope_id
= 0;
3152 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3154 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3155 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3156 ok( !lstrcmpW( address6
, expect6_3
) ||
3157 broken( !lstrcmpW( address6
, expect6_3_nt
) ) || /* NT4 */
3158 broken( !lstrcmpW( address6
, expect6_3_w2k
) ), /* Win2000 */
3159 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3
),
3160 wine_dbgstr_w(address6
) );
3161 ok( len
== sizeof(expect6_3
)/sizeof(WCHAR
) ||
3162 broken(len
== sizeof(expect6_3_nt
)/sizeof(WCHAR
) ) || /* NT4 */
3163 broken(len
== sizeof(expect6_3_w2k
)/sizeof(WCHAR
) ), /* Win2000 */
3166 /* Test IPv6 address, port number and scope_id */
3167 len
= sizeof(address6
)/sizeof(WCHAR
);
3169 sockaddr6
.sin6_family
= AF_INET6
;
3170 sockaddr6
.sin6_port
= 0xfa81;
3171 sockaddr6
.sin6_scope_id
= 0x1234;
3172 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3174 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3175 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3176 ok( !lstrcmpW( address6
, expect6_3_2
) ||
3177 broken( !lstrcmpW( address6
, expect6_3_2_nt
) ) || /* NT4 */
3178 broken( !lstrcmpW( address6
, expect6_3_2_w2k
) ), /* Win2000 */
3179 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_2
),
3180 wine_dbgstr_w(address6
) );
3181 ok( len
== sizeof(expect6_3_2
)/sizeof(WCHAR
) ||
3182 broken( len
== sizeof(expect6_3_2_nt
)/sizeof(WCHAR
) ) || /* NT4 */
3183 broken( len
== sizeof(expect6_3_2_w2k
)/sizeof(WCHAR
) ), /* Win2000 */
3186 /* Test IPv6 address and scope_id */
3187 len
= sizeof(address6
)/sizeof(WCHAR
);
3189 sockaddr6
.sin6_family
= AF_INET6
;
3190 sockaddr6
.sin6_port
= 0x0000;
3191 sockaddr6
.sin6_scope_id
= 0xfffe;
3192 memcpy (sockaddr6
.sin6_addr
.s6_addr
, addr6_3
, sizeof(addr6_3
));
3194 ret
= WSAAddressToStringW( (SOCKADDR
*)&sockaddr6
, sizeof(sockaddr6
), NULL
, address6
, &len
);
3195 ok( !ret
, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
3196 ok( !lstrcmpW( address6
, expect6_3_3
) ||
3197 broken( !lstrcmpW( address6
, expect6_3_3_nt
) ), /* NT4 */
3198 "Expected: %s, got: %s\n", wine_dbgstr_w(expect6_3_3
),
3199 wine_dbgstr_w(address6
) );
3200 ok( len
== sizeof(expect6_3_3
)/sizeof(WCHAR
) ||
3201 broken( len
== sizeof(expect6_3_3_nt
)/sizeof(WCHAR
) ), /* NT4 */
3205 if (v6
!= INVALID_SOCKET
)
3209 static void test_WSAStringToAddressA(void)
3212 SOCKADDR_IN sockaddr
;
3213 SOCKADDR_IN6 sockaddr6
;
3216 CHAR address1
[] = "0.0.0.0";
3217 CHAR address2
[] = "127.127.127.127";
3218 CHAR address3
[] = "255.255.255.255";
3219 CHAR address4
[] = "127.127.127.127:65535";
3220 CHAR address5
[] = "255.255.255.255:65535";
3221 CHAR address6
[] = "::1";
3222 CHAR address7
[] = "[::1]";
3223 CHAR address8
[] = "[::1]:65535";
3224 CHAR address9
[] = "2001::1";
3227 sockaddr
.sin_family
= AF_INET
;
3229 ret
= WSAStringToAddressA( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3230 ok( ret
== SOCKET_ERROR
, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
3231 WSAGetLastError() );
3233 len
= sizeof(sockaddr
);
3234 sockaddr
.sin_port
= 0;
3235 sockaddr
.sin_addr
.s_addr
= 0;
3237 ret
= WSAStringToAddressA( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3238 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0,
3239 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3241 len
= sizeof(sockaddr
);
3242 sockaddr
.sin_port
= 0;
3243 sockaddr
.sin_addr
.s_addr
= 0;
3245 ret
= WSAStringToAddressA( address2
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3246 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f,
3247 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3249 len
= sizeof(sockaddr
);
3250 sockaddr
.sin_port
= 0;
3251 sockaddr
.sin_addr
.s_addr
= 0;
3253 ret
= WSAStringToAddressA( address3
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3254 GLE
= WSAGetLastError();
3255 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff) ||
3256 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3257 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE
);
3259 len
= sizeof(sockaddr
);
3260 sockaddr
.sin_port
= 0;
3261 sockaddr
.sin_addr
.s_addr
= 0;
3263 ret
= WSAStringToAddressA( address4
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3264 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f && sockaddr
.sin_port
== 0xffff,
3265 "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
3267 len
= sizeof(sockaddr
);
3268 sockaddr
.sin_port
= 0;
3269 sockaddr
.sin_addr
.s_addr
= 0;
3271 ret
= WSAStringToAddressA( address5
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3272 GLE
= WSAGetLastError();
3273 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff && sockaddr
.sin_port
== 0xffff) ||
3274 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3275 "WSAStringToAddressA() failed unexpectedly: %d\n", GLE
);
3277 len
= sizeof(sockaddr6
);
3278 memset(&sockaddr6
, 0, len
);
3279 sockaddr6
.sin6_family
= AF_INET6
;
3281 ret
= WSAStringToAddressA( address6
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3283 GLE
= WSAGetLastError();
3284 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3285 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3287 len
= sizeof(sockaddr6
);
3288 memset(&sockaddr6
, 0, len
);
3289 sockaddr6
.sin6_family
= AF_INET6
;
3291 ret
= WSAStringToAddressA( address7
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3293 GLE
= WSAGetLastError();
3294 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3295 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3297 len
= sizeof(sockaddr6
);
3298 memset(&sockaddr6
, 0, len
);
3299 sockaddr6
.sin6_family
= AF_INET6
;
3301 ret
= WSAStringToAddressA( address8
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3303 GLE
= WSAGetLastError();
3304 ok( (ret
== 0 && sockaddr6
.sin6_port
== 0xffff) ||
3305 (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3306 "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE
);
3308 len
= sizeof(sockaddr
);
3310 ret
= WSAStringToAddressA( address9
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3311 GLE
= WSAGetLastError();
3312 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3313 "WSAStringToAddressA() should have failed with %d\n", GLE
);
3316 static void test_WSAStringToAddressW(void)
3319 SOCKADDR_IN sockaddr
, *sin
;
3320 SOCKADDR_IN6 sockaddr6
;
3321 SOCKADDR_STORAGE sockaddr_storage
;
3324 WCHAR address1
[] = { '0','.','0','.','0','.','0', 0 };
3325 WCHAR address2
[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
3326 WCHAR address3
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
3327 WCHAR address4
[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
3328 ':', '6', '5', '5', '3', '5', 0 };
3329 WCHAR address5
[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
3330 '6', '5', '5', '3', '5', 0 };
3331 WCHAR address6
[] = {':',':','1','\0'};
3332 WCHAR address7
[] = {'[',':',':','1',']','\0'};
3333 WCHAR address8
[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
3334 WCHAR address9
[] = {'2','0','0','1',':',':','1','\0'};
3337 sockaddr
.sin_family
= AF_INET
;
3339 ret
= WSAStringToAddressW( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3340 ok( ret
== SOCKET_ERROR
, "WSAStringToAddressW() failed unexpectedly: %d\n",
3341 WSAGetLastError() );
3343 len
= sizeof(sockaddr
);
3344 sockaddr
.sin_port
= 0;
3345 sockaddr
.sin_addr
.s_addr
= 0;
3347 ret
= WSAStringToAddressW( address1
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3348 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0,
3349 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3351 len
= sizeof(sockaddr
);
3352 sockaddr
.sin_port
= 0;
3353 sockaddr
.sin_addr
.s_addr
= 0;
3355 ret
= WSAStringToAddressW( address2
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3356 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f,
3357 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3359 len
= sizeof(sockaddr
);
3360 sockaddr
.sin_port
= 0;
3361 sockaddr
.sin_addr
.s_addr
= 0;
3363 ret
= WSAStringToAddressW( address3
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3364 GLE
= WSAGetLastError();
3365 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff) ||
3366 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3367 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3369 len
= sizeof(sockaddr
);
3370 sockaddr
.sin_port
= 0;
3371 sockaddr
.sin_addr
.s_addr
= 0;
3373 ret
= WSAStringToAddressW( address4
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3374 ok( !ret
&& sockaddr
.sin_addr
.s_addr
== 0x7f7f7f7f && sockaddr
.sin_port
== 0xffff,
3375 "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
3377 len
= sizeof(sockaddr
);
3378 sockaddr
.sin_port
= 0;
3379 sockaddr
.sin_addr
.s_addr
= 0;
3381 ret
= WSAStringToAddressW( address5
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3382 ok( (ret
== 0 && sockaddr
.sin_addr
.s_addr
== 0xffffffff && sockaddr
.sin_port
== 0xffff) ||
3383 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3384 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3386 /* Test with a larger buffer than necessary */
3387 len
= sizeof(sockaddr_storage
);
3388 sin
= (SOCKADDR_IN
*)&sockaddr_storage
;
3390 sin
->sin_addr
.s_addr
= 0;
3392 ret
= WSAStringToAddressW( address5
, AF_INET
, NULL
, (SOCKADDR
*)sin
, &len
);
3393 ok( (ret
== 0 && sin
->sin_addr
.s_addr
== 0xffffffff && sin
->sin_port
== 0xffff) ||
3394 (ret
== SOCKET_ERROR
&& (GLE
== ERROR_INVALID_PARAMETER
|| GLE
== WSAEINVAL
)),
3395 "WSAStringToAddressW() failed unexpectedly: %d\n", GLE
);
3396 ok( len
== sizeof(SOCKADDR_IN
) ||
3397 broken(len
== sizeof(SOCKADDR_STORAGE
)) /* NT4/2k */,
3398 "unexpected length %d\n", len
);
3400 len
= sizeof(sockaddr6
);
3401 memset(&sockaddr6
, 0, len
);
3402 sockaddr6
.sin6_family
= AF_INET6
;
3404 ret
= WSAStringToAddressW( address6
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3406 GLE
= WSAGetLastError();
3407 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3408 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3410 len
= sizeof(sockaddr6
);
3411 memset(&sockaddr6
, 0, len
);
3412 sockaddr6
.sin6_family
= AF_INET6
;
3414 ret
= WSAStringToAddressW( address7
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3416 GLE
= WSAGetLastError();
3417 ok( ret
== 0 || (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3418 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3420 len
= sizeof(sockaddr6
);
3421 memset(&sockaddr6
, 0, len
);
3422 sockaddr6
.sin6_family
= AF_INET6
;
3424 ret
= WSAStringToAddressW( address8
, AF_INET6
, NULL
, (SOCKADDR
*)&sockaddr6
,
3426 GLE
= WSAGetLastError();
3427 ok( (ret
== 0 && sockaddr6
.sin6_port
== 0xffff) ||
3428 (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3429 "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE
);
3431 len
= sizeof(sockaddr
);
3433 ret
= WSAStringToAddressW( address9
, AF_INET
, NULL
, (SOCKADDR
*)&sockaddr
, &len
);
3434 GLE
= WSAGetLastError();
3435 ok( (ret
== SOCKET_ERROR
&& GLE
== WSAEINVAL
),
3436 "WSAStringToAddressW() should have failed with %d\n", GLE
);
3439 static DWORD WINAPI
SelectReadThread(void *param
)
3441 select_thread_params
*par
= param
;
3444 struct sockaddr_in addr
;
3445 struct timeval select_timeout
;
3448 FD_SET(par
->s
, &readfds
);
3449 select_timeout
.tv_sec
=5;
3450 select_timeout
.tv_usec
=0;
3451 addr
.sin_family
= AF_INET
;
3452 addr
.sin_addr
.s_addr
= inet_addr(SERVERIP
);
3453 addr
.sin_port
= htons(SERVERPORT
);
3455 do_bind(par
->s
, (struct sockaddr
*)&addr
, sizeof(addr
));
3456 wsa_ok(listen(par
->s
, SOMAXCONN
), 0 ==, "SelectReadThread (%x): listen failed: %d\n");
3458 SetEvent(server_ready
);
3459 ret
= select(par
->s
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3460 par
->ReadKilled
= (ret
== 1);
3465 static DWORD WINAPI
SelectCloseThread(void *param
)
3467 SOCKET s
= *(SOCKET
*)param
;
3473 static void test_errors(void)
3476 SOCKADDR_IN SockAddr
;
3479 WSASetLastError(NO_ERROR
);
3480 sock
= socket(PF_INET
, SOCK_STREAM
, 0);
3481 ok( (sock
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3482 memset(&SockAddr
, 0, sizeof(SockAddr
));
3483 SockAddr
.sin_family
= AF_INET
;
3484 SockAddr
.sin_port
= htons(6924);
3485 SockAddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3487 ret
= connect(sock
, (PSOCKADDR
)&SockAddr
, sizeof(SockAddr
));
3488 ok( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got: %d\n", ret
);
3489 if (ret
== SOCKET_ERROR
)
3491 err
= WSAGetLastError();
3492 ok( (err
== WSAECONNREFUSED
), "expected WSAECONNREFUSED, got: %d\n", err
);
3497 fd_set set
= {1, {sock
}};
3500 timeval
.tv_usec
= 50000;
3502 ret
= select(1, NULL
, &set
, NULL
, &timeval
);
3503 ok( (ret
== 0), "expected 0 (timeout), got: %d\n", ret
);
3506 ret
= closesocket(sock
);
3507 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", WSAGetLastError());
3510 static void test_listen(void)
3513 int ret
, acceptc
, olen
= sizeof(acceptc
);
3514 struct sockaddr_in address
;
3516 memset(&address
, 0, sizeof(address
));
3517 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3518 address
.sin_family
= AF_INET
;
3519 address
.sin_port
= htons(SERVERPORT
);
3521 /* invalid socket tests */
3522 SetLastError(0xdeadbeef);
3523 ok ((listen(0, 0) == SOCKET_ERROR
), "listen did not fail\n");
3524 ret
= WSAGetLastError();
3525 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3527 SetLastError(0xdeadbeef);
3528 ok ((listen(0xdeadbeef, 0) == SOCKET_ERROR
), "listen did not fail\n");
3529 ret
= WSAGetLastError();
3530 ok (ret
== WSAENOTSOCK
, "expected 10038, received %d\n", ret
);
3533 fdA
= socket(AF_INET
, SOCK_STREAM
, 0);
3534 ok ((fdA
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3536 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3537 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3539 SetLastError(0xdeadbeef);
3540 ok ((listen(fdA
, -2) == SOCKET_ERROR
), "listen did not fail\n");
3541 ret
= WSAGetLastError();
3542 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3544 SetLastError(0xdeadbeef);
3545 ok ((listen(fdA
, 1) == SOCKET_ERROR
), "listen did not fail\n");
3546 ret
= WSAGetLastError();
3547 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3549 SetLastError(0xdeadbeef);
3550 ok ((listen(fdA
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3551 ret
= WSAGetLastError();
3552 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3554 ok (!bind(fdA
, (struct sockaddr
*) &address
, sizeof(address
)), "bind failed\n");
3556 SetLastError(0xdeadbeef);
3557 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3558 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3561 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3562 ok (!ret
, "getsockopt failed\n");
3563 ok (acceptc
== 0, "SO_ACCEPTCONN should be 0, received %d\n", acceptc
);
3565 ok (!listen(fdA
, 0), "listen failed\n");
3566 ok (!listen(fdA
, SOMAXCONN
), "double listen failed\n");
3569 ret
= getsockopt(fdA
, SOL_SOCKET
, SO_ACCEPTCONN
, (char*)&acceptc
, &olen
);
3570 ok (!ret
, "getsockopt failed\n");
3571 ok (acceptc
== 1, "SO_ACCEPTCONN should be 1, received %d\n", acceptc
);
3573 SetLastError(0xdeadbeef);
3574 ok ((listen(fdB
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3575 ret
= WSAGetLastError();
3576 ok (ret
== WSAEINVAL
, "expected 10022, received %d\n", ret
);
3578 ret
= closesocket(fdB
);
3579 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3581 fdB
= socket(AF_INET
, SOCK_STREAM
, 0);
3582 ok ((fdB
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3584 SetLastError(0xdeadbeef);
3585 ok (bind(fdB
, (struct sockaddr
*) &address
, sizeof(address
)), "bind should have failed\n");
3586 ret
= WSAGetLastError();
3587 ok (ret
== WSAEADDRINUSE
, "expected 10048, received %d\n", ret
);
3589 ret
= closesocket(fdA
);
3590 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3591 ret
= closesocket(fdB
);
3592 ok (ret
== 0, "closesocket failed unexpectedly: %d\n", ret
);
3595 #define FD_ZERO_ALL() { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); }
3596 #define FD_SET_ALL(s) { FD_SET(s, &readfds); FD_SET(s, &writefds); FD_SET(s, &exceptfds); }
3597 static void test_select(void)
3599 static char tmp_buf
[1024];
3601 SOCKET fdListen
, fdRead
, fdWrite
;
3602 fd_set readfds
, writefds
, exceptfds
;
3606 struct timeval select_timeout
;
3607 struct sockaddr_in address
;
3608 select_thread_params thread_params
;
3609 HANDLE thread_handle
;
3612 fdRead
= socket(AF_INET
, SOCK_STREAM
, 0);
3613 ok( (fdRead
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3614 fdWrite
= socket(AF_INET
, SOCK_STREAM
, 0);
3615 ok( (fdWrite
!= INVALID_SOCKET
), "socket failed unexpectedly: %d\n", WSAGetLastError() );
3618 if (fdWrite
> maxfd
)
3623 FD_SET_ALL(fdWrite
);
3624 select_timeout
.tv_sec
=0;
3625 select_timeout
.tv_usec
=0;
3627 ticks
= GetTickCount();
3628 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3629 ticks
= GetTickCount() - ticks
;
3630 ok(ret
== 0, "select should not return any socket handles\n");
3631 ok(ticks
< 10, "select was blocking for %u ms, expected < 10 ms\n", ticks
);
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");
3639 FD_SET_ALL(fdWrite
);
3640 select_timeout
.tv_sec
=0;
3641 select_timeout
.tv_usec
=500;
3643 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3644 ok(ret
== 0, "select should not return any socket handles\n");
3645 ok(!FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3646 ok(!FD_ISSET(fdWrite
, &writefds
), "FD should not be set\n");
3647 ok(!FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3648 ok(!FD_ISSET(fdWrite
, &exceptfds
), "FD should not be set\n");
3650 ok ((listen(fdWrite
, SOMAXCONN
) == SOCKET_ERROR
), "listen did not fail\n");
3651 ret
= closesocket(fdWrite
);
3652 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3654 thread_params
.s
= fdRead
;
3655 thread_params
.ReadKilled
= FALSE
;
3656 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
3657 thread_handle
= CreateThread (NULL
, 0, SelectReadThread
, &thread_params
, 0, &id
);
3658 ok ( (thread_handle
!= NULL
), "CreateThread failed unexpectedly: %d\n", GetLastError());
3660 WaitForSingleObject (server_ready
, INFINITE
);
3662 ret
= closesocket(fdRead
);
3663 ok ( (ret
== 0), "closesocket failed unexpectedly: %d\n", ret
);
3665 WaitForSingleObject (thread_handle
, 1000);
3666 ok ( (thread_params
.ReadKilled
) ||
3667 broken(thread_params
.ReadKilled
== 0), /*Win98*/
3668 "closesocket did not wakeup select\n");
3669 ret
= recv(fdRead
, &buffer
, 1, MSG_PEEK
);
3670 ok( (ret
== -1), "peek at closed socket expected -1 got %d\n", ret
);
3672 /* Test selecting invalid handles */
3676 ret
= select(maxfd
+1, 0, 0, 0, &select_timeout
);
3677 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3678 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3681 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3682 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3683 ok ( WSAGetLastError() == WSAEINVAL
, "expected WSAEINVAL, got %i\n", WSAGetLastError());
3685 FD_SET(INVALID_SOCKET
, &readfds
);
3687 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3688 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3689 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3690 ok ( !FD_ISSET(fdRead
, &readfds
), "FD should not be set\n");
3693 FD_SET(INVALID_SOCKET
, &writefds
);
3695 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3696 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3697 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3698 ok ( !FD_ISSET(fdRead
, &writefds
), "FD should not be set\n");
3701 FD_SET(INVALID_SOCKET
, &exceptfds
);
3703 ret
= select(maxfd
+1, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3704 ok ( (ret
== SOCKET_ERROR
), "expected SOCKET_ERROR, got %i\n", ret
);
3705 ok ( WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %i\n", WSAGetLastError());
3706 ok ( !FD_ISSET(fdRead
, &exceptfds
), "FD should not be set\n");
3708 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3710 if(fdWrite
> maxfd
) maxfd
= fdWrite
;
3713 FD_SET(fdRead
, &readfds
);
3714 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3715 ok(!ret
, "select returned %d\n", ret
);
3718 FD_SET(fdWrite
, &writefds
);
3719 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3720 ok(ret
== 1, "select returned %d\n", ret
);
3721 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3723 /* tests for overlapping fd_set pointers */
3725 FD_SET(fdWrite
, &readfds
);
3726 ret
= select(fdWrite
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3727 ok(ret
== 1, "select returned %d\n", ret
);
3728 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3731 FD_SET(fdWrite
, &readfds
);
3732 FD_SET(fdRead
, &readfds
);
3733 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3734 ok(ret
== 2, "select returned %d\n", ret
);
3735 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3736 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3738 ok(send(fdWrite
, "test", 4, 0) == 4, "failed to send data\n");
3740 FD_SET(fdRead
, &readfds
);
3741 ret
= select(fdRead
+1, &readfds
, NULL
, NULL
, &select_timeout
);
3742 ok(ret
== 1, "select returned %d\n", ret
);
3743 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3746 FD_SET(fdWrite
, &readfds
);
3747 FD_SET(fdRead
, &readfds
);
3748 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3749 ok(ret
== 2, "select returned %d\n", ret
);
3750 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3751 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3755 FD_SET(fdWrite
, &writefds
);
3756 ret
= select(fdWrite
+1, NULL
, &writefds
, NULL
, &select_timeout
);
3758 ok(send(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0) > 0, "failed to send data\n");
3761 FD_SET(fdWrite
, &readfds
);
3762 FD_SET(fdRead
, &readfds
);
3763 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3764 ok(ret
== 1, "select returned %d\n", ret
);
3765 ok(!FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is in the set\n");
3766 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3768 ok(send(fdRead
, "test", 4, 0) == 4, "failed to send data\n");
3771 FD_SET(fdWrite
, &readfds
);
3772 FD_SET(fdRead
, &readfds
);
3773 ret
= select(maxfd
+1, &readfds
, &readfds
, NULL
, &select_timeout
);
3774 ok(ret
== 2, "select returned %d\n", ret
);
3775 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3776 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3778 closesocket(fdRead
);
3779 closesocket(fdWrite
);
3781 /* select() works in 3 distinct states:
3782 * - to check if a connection attempt ended with success or error;
3783 * - to check if a pending connection is waiting for acceptance;
3784 * - to check for data to read, availability for write and OOB data
3786 * The tests below ensure that all conditions are tested.
3788 memset(&address
, 0, sizeof(address
));
3789 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
3790 address
.sin_family
= AF_INET
;
3791 len
= sizeof(address
);
3792 fdListen
= setup_server_socket(&address
, &len
);
3793 select_timeout
.tv_sec
= 1;
3794 select_timeout
.tv_usec
= 250000;
3796 /* When no events are pending select returns 0 with no error */
3798 FD_SET_ALL(fdListen
);
3799 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3800 ok(ret
== 0, "expected 0, got %d\n", ret
);
3802 /* When a socket is attempting to connect the listening socket receives the read descriptor */
3803 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
3805 FD_SET_ALL(fdListen
);
3806 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3807 ok(ret
== 1, "expected 1, got %d\n", ret
);
3808 ok(FD_ISSET(fdListen
, &readfds
), "fdListen socket is not in the set\n");
3809 len
= sizeof(address
);
3810 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
3811 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
3813 /* The connector is signaled through the write descriptor */
3815 FD_SET_ALL(fdListen
);
3817 FD_SET_ALL(fdWrite
);
3818 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3819 ok(ret
== 2, "expected 2, got %d\n", ret
);
3820 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3821 ok(FD_ISSET(fdRead
, &writefds
), "fdRead socket is not in the set\n");
3824 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
3825 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3826 ok(id
== 0, "expected 0, got %d\n", id
);
3828 /* When data is received the receiver gets the read descriptor */
3829 ret
= send(fdWrite
, "1234", 4, 0);
3830 ok(ret
== 4, "expected 4, got %d\n", ret
);
3832 FD_SET_ALL(fdListen
);
3833 FD_SET(fdRead
, &readfds
);
3834 FD_SET(fdRead
, &exceptfds
);
3835 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3836 ok(ret
== 1, "expected 1, got %d\n", ret
);
3837 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3838 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3839 ok(ret
== 4, "expected 4, got %d\n", ret
);
3840 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
3842 /* When OOB data is received the socket is set in the except descriptor */
3843 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3844 ok(ret
== 1, "expected 1, got %d\n", ret
);
3846 FD_SET_ALL(fdListen
);
3847 FD_SET(fdRead
, &readfds
);
3848 FD_SET(fdRead
, &exceptfds
);
3849 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3850 ok(ret
== 1, "expected 1, got %d\n", ret
);
3851 ok(FD_ISSET(fdRead
, &exceptfds
), "fdRead socket is not in the set\n");
3853 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3854 ok(ret
== 1, "expected 1, got %d\n", ret
);
3855 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3857 /* If the socket is OOBINLINED it will not receive the OOB in except fds */
3859 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
3860 ok(ret
== 0, "expected 0, got %d\n", ret
);
3861 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
3862 ok(ret
== 1, "expected 1, got %d\n", ret
);
3864 FD_SET_ALL(fdListen
);
3865 FD_SET(fdRead
, &readfds
);
3866 FD_SET(fdRead
, &exceptfds
);
3867 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3868 ok(ret
== 1, "expected 1, got %d\n", ret
);
3869 ok(FD_ISSET(fdRead
, &readfds
), "fdRead socket is not in the set\n");
3871 SetLastError(0xdeadbeef);
3872 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
3873 if (ret
== SOCKET_ERROR
) /* can't recv with MSG_OOB if OOBINLINED */
3875 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %d\n", GetLastError());
3876 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
3877 ok(ret
== 1, "expected 1, got %d\n", ret
);
3878 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
3880 else ok(broken(ret
== 1) /* <= NT4 */, "expected error, got 1\n");
3882 /* When the connection is closed the socket is set in the read descriptor */
3883 ret
= closesocket(fdRead
);
3884 ok(ret
== 0, "expected 0, got %d\n", ret
);
3886 FD_SET_ALL(fdListen
);
3887 FD_SET(fdWrite
, &readfds
);
3888 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3889 ok(ret
== 1, "expected 1, got %d\n", ret
);
3890 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3891 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
3892 ok(ret
== 0, "expected 0, got %d\n", ret
);
3894 /* When a connection is attempted to a non-listening socket it will get to the except descriptor */
3895 ret
= closesocket(fdWrite
);
3896 ok(ret
== 0, "expected 0, got %d\n", ret
);
3897 ret
= closesocket(fdListen
);
3898 ok(ret
== 0, "expected 0, got %d\n", ret
);
3899 len
= sizeof(address
);
3900 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
3902 FD_SET(fdWrite
, &writefds
);
3903 FD_SET(fdWrite
, &exceptfds
);
3904 select_timeout
.tv_sec
= 2; /* requires more time to realize it will not connect */
3905 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3906 ok(ret
== 1, "expected 1, got %d\n", ret
);
3909 ret
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
3910 ok(!ret
, "getsockopt failed with %d\n", WSAGetLastError());
3911 ok(id
== WSAECONNREFUSED
, "expected 10061, got %d\n", id
);
3912 ok(FD_ISSET(fdWrite
, &exceptfds
), "fdWrite socket is not in the set\n");
3913 ok(select_timeout
.tv_usec
== 250000, "select timeout should not have changed\n");
3914 closesocket(fdWrite
);
3916 /* Try select() on a closed socket after connection */
3917 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3918 closesocket(fdRead
);
3920 FD_SET_ALL(fdWrite
);
3922 SetLastError(0xdeadbeef);
3923 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3924 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3926 ok(GetLastError() == WSAENOTSOCK
, "expected 10038, got %d\n", GetLastError());
3927 /* descriptor sets are unchanged */
3928 ok(readfds
.fd_count
== 2, "expected 2, got %d\n", readfds
.fd_count
);
3929 ok(exceptfds
.fd_count
== 2, "expected 2, got %d\n", exceptfds
.fd_count
);
3930 closesocket(fdWrite
);
3932 /* Close the socket currently being selected in a thread - bug 38399 */
3933 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3934 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3935 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3937 FD_SET_ALL(fdWrite
);
3938 ret
= select(0, &readfds
, NULL
, &exceptfds
, &select_timeout
);
3939 ok(ret
== 1, "expected 1, got %d\n", ret
);
3940 ok(FD_ISSET(fdWrite
, &readfds
), "fdWrite socket is not in the set\n");
3941 WaitForSingleObject (thread_handle
, 1000);
3942 closesocket(fdRead
);
3943 /* test again with only the except descriptor */
3944 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
3945 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
3946 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
3948 FD_SET(fdWrite
, &exceptfds
);
3949 SetLastError(0xdeadbeef);
3950 ret
= select(0, NULL
, NULL
, &exceptfds
, &select_timeout
);
3952 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
3954 ok(GetLastError() == WSAENOTSOCK
, "expected 10038, got %d\n", GetLastError());
3955 WaitForSingleObject (thread_handle
, 1000);
3956 closesocket(fdRead
);
3958 /* test UDP behavior of unbound sockets */
3959 select_timeout
.tv_sec
= 0;
3960 select_timeout
.tv_usec
= 250000;
3961 fdWrite
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
3962 ok(fdWrite
!= INVALID_SOCKET
, "socket call failed\n");
3964 FD_SET_ALL(fdWrite
);
3965 ret
= select(0, &readfds
, &writefds
, &exceptfds
, &select_timeout
);
3966 ok(ret
== 1, "expected 1, got %d\n", ret
);
3967 ok(FD_ISSET(fdWrite
, &writefds
), "fdWrite socket is not in the set\n");
3968 closesocket(fdWrite
);
3973 static DWORD WINAPI
AcceptKillThread(void *param
)
3975 select_thread_params
*par
= param
;
3976 struct sockaddr_in address
;
3977 int len
= sizeof(address
);
3978 SOCKET client_socket
;
3980 SetEvent(server_ready
);
3981 client_socket
= accept(par
->s
, (struct sockaddr
*) &address
, &len
);
3982 if (client_socket
!= INVALID_SOCKET
)
3983 closesocket(client_socket
);
3984 par
->ReadKilled
= (client_socket
== INVALID_SOCKET
);
3989 static int CALLBACK
AlwaysDeferConditionFunc(LPWSABUF lpCallerId
, LPWSABUF lpCallerData
, LPQOS pQos
,
3990 LPQOS lpGQOS
, LPWSABUF lpCalleeId
, LPWSABUF lpCalleeData
,
3991 GROUP
*g
, DWORD_PTR dwCallbackData
)
3996 static SOCKET
setup_server_socket(struct sockaddr_in
*addr
, int *len
)
3999 SOCKET server_socket
;
4001 server_socket
= socket(AF_INET
, SOCK_STREAM
, 0);
4002 if (server_socket
== INVALID_SOCKET
)
4004 trace("error creating server socket: %d\n", WSAGetLastError());
4005 return INVALID_SOCKET
;
4009 ret
= setsockopt(server_socket
, SOL_SOCKET
, SO_REUSEADDR
, (char *)&val
, sizeof(val
));
4012 trace("error setting SO_REUSEADDR: %d\n", WSAGetLastError());
4013 closesocket(server_socket
);
4014 return INVALID_SOCKET
;
4017 ret
= bind(server_socket
, (struct sockaddr
*)addr
, *len
);
4020 trace("error binding server socket: %d\n", WSAGetLastError());
4023 ret
= getsockname(server_socket
, (struct sockaddr
*)addr
, len
);
4026 skip("failed to lookup bind address: %d\n", WSAGetLastError());
4027 closesocket(server_socket
);
4028 return INVALID_SOCKET
;
4031 ret
= listen(server_socket
, 5);
4034 trace("error making server socket listen: %d\n", WSAGetLastError());
4035 closesocket(server_socket
);
4036 return INVALID_SOCKET
;
4039 return server_socket
;
4042 static SOCKET
setup_connector_socket(struct sockaddr_in
*addr
, int len
, BOOL nonblock
)
4047 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
4048 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket %d\n", WSAGetLastError());
4051 set_blocking(connector
, !nonblock
);
4053 ret
= connect(connector
, (struct sockaddr
*)addr
, len
);
4055 ok(!ret
, "connecting to accepting socket failed %d\n", WSAGetLastError());
4056 else if (ret
== SOCKET_ERROR
)
4058 DWORD error
= WSAGetLastError();
4059 ok(error
== WSAEWOULDBLOCK
|| error
== WSAEINPROGRESS
,
4060 "expected 10035 or 10036, got %d\n", error
);
4066 static void test_accept(void)
4069 SOCKET server_socket
, accepted
= INVALID_SOCKET
, connector
;
4070 struct sockaddr_in address
;
4071 SOCKADDR_STORAGE ss
;
4073 select_thread_params thread_params
;
4074 HANDLE thread_handle
= NULL
;
4077 memset(&address
, 0, sizeof(address
));
4078 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
4079 address
.sin_family
= AF_INET
;
4081 socklen
= sizeof(address
);
4082 server_socket
= setup_server_socket(&address
, &socklen
);
4083 if (server_socket
== INVALID_SOCKET
)
4085 trace("error creating server socket: %d\n", WSAGetLastError());
4089 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4090 if (connector
== INVALID_SOCKET
) goto done
;
4092 trace("Blocking accept next\n");
4094 accepted
= WSAAccept(server_socket
, NULL
, NULL
, AlwaysDeferConditionFunc
, 0);
4095 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
4097 accepted
= accept(server_socket
, NULL
, 0);
4098 ok(accepted
!= INVALID_SOCKET
, "Failed to accept deferred connection, error %d\n", WSAGetLastError());
4100 server_ready
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
4101 if (server_ready
== INVALID_HANDLE_VALUE
)
4103 trace("error creating event: %d\n", GetLastError());
4107 thread_params
.s
= server_socket
;
4108 thread_params
.ReadKilled
= FALSE
;
4109 thread_handle
= CreateThread(NULL
, 0, AcceptKillThread
, &thread_params
, 0, &id
);
4110 if (thread_handle
== NULL
)
4112 trace("error creating thread: %d\n", GetLastError());
4116 WaitForSingleObject(server_ready
, INFINITE
);
4118 ret
= closesocket(server_socket
);
4121 trace("closesocket failed: %d\n", WSAGetLastError());
4125 WaitForSingleObject(thread_handle
, 1000);
4126 ok(thread_params
.ReadKilled
|| broken(!thread_params
.ReadKilled
) /* Win98/ME, after accept */,
4127 "closesocket did not wakeup accept\n");
4129 closesocket(accepted
);
4130 closesocket(connector
);
4131 accepted
= connector
= INVALID_SOCKET
;
4133 socklen
= sizeof(address
);
4134 server_socket
= setup_server_socket(&address
, &socklen
);
4135 if (server_socket
== INVALID_SOCKET
) goto done
;
4137 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4138 if (connector
== INVALID_SOCKET
) goto done
;
4141 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4142 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4143 ok(!socklen
, "got %d\n", socklen
);
4144 closesocket(connector
);
4145 connector
= INVALID_SOCKET
;
4147 socklen
= sizeof(address
);
4148 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4149 if (connector
== INVALID_SOCKET
) goto done
;
4151 accepted
= WSAAccept(server_socket
, NULL
, NULL
, NULL
, 0);
4152 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4153 closesocket(accepted
);
4154 closesocket(connector
);
4155 accepted
= connector
= INVALID_SOCKET
;
4157 socklen
= sizeof(address
);
4158 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4159 if (connector
== INVALID_SOCKET
) goto done
;
4161 socklen
= sizeof(ss
);
4162 memset(&ss
, 0, sizeof(ss
));
4163 accepted
= WSAAccept(server_socket
, (struct sockaddr
*)&ss
, &socklen
, NULL
, 0);
4164 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4165 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4166 ok(ss
.ss_family
, "family not set\n");
4167 closesocket(accepted
);
4168 closesocket(connector
);
4169 accepted
= connector
= INVALID_SOCKET
;
4171 socklen
= sizeof(address
);
4172 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4173 if (connector
== INVALID_SOCKET
) goto done
;
4176 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4177 ok(accepted
== INVALID_SOCKET
&& WSAGetLastError() == WSAEFAULT
, "got %d\n", WSAGetLastError());
4178 ok(!socklen
, "got %d\n", socklen
);
4179 closesocket(connector
);
4180 accepted
= connector
= INVALID_SOCKET
;
4182 socklen
= sizeof(address
);
4183 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4184 if (connector
== INVALID_SOCKET
) goto done
;
4186 accepted
= accept(server_socket
, NULL
, NULL
);
4187 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4188 closesocket(accepted
);
4189 closesocket(connector
);
4190 accepted
= connector
= INVALID_SOCKET
;
4192 socklen
= sizeof(address
);
4193 connector
= setup_connector_socket(&address
, socklen
, FALSE
);
4194 if (connector
== INVALID_SOCKET
) goto done
;
4196 socklen
= sizeof(ss
);
4197 memset(&ss
, 0, sizeof(ss
));
4198 accepted
= accept(server_socket
, (struct sockaddr
*)&ss
, &socklen
);
4199 ok(accepted
!= INVALID_SOCKET
, "Failed to accept connection, %d\n", WSAGetLastError());
4200 ok(socklen
!= sizeof(ss
), "unexpected length\n");
4201 ok(ss
.ss_family
, "family not set\n");
4204 if (accepted
!= INVALID_SOCKET
)
4205 closesocket(accepted
);
4206 if (connector
!= INVALID_SOCKET
)
4207 closesocket(connector
);
4208 if (thread_handle
!= NULL
)
4209 CloseHandle(thread_handle
);
4210 if (server_ready
!= INVALID_HANDLE_VALUE
)
4211 CloseHandle(server_ready
);
4212 if (server_socket
!= INVALID_SOCKET
)
4213 closesocket(server_socket
);
4216 static void test_extendedSocketOptions(void)
4220 struct sockaddr_in sa
;
4221 int sa_len
= sizeof(struct sockaddr_in
);
4222 int optval
, optlen
= sizeof(int), ret
;
4226 if(WSAStartup(MAKEWORD(2,0), &wsa
)){
4227 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4231 memset(&sa
, 0, sa_len
);
4233 sa
.sin_family
= AF_INET
;
4234 sa
.sin_port
= htons(0);
4235 sa
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
4237 if((sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4238 trace("Creating the socket failed: %d\n", WSAGetLastError());
4243 if(bind(sock
, (struct sockaddr
*) &sa
, sa_len
) < 0){
4244 trace("Failed to bind socket: %d\n", WSAGetLastError());
4250 ret
= getsockopt(sock
, SOL_SOCKET
, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4252 ok(ret
== 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret
);
4253 ok((optval
== 65507) || (optval
== 65527),
4254 "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval
);
4256 /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
4257 SetLastError(0xdeadbeef);
4258 optval
= 0xdeadbeef;
4259 optlen
= sizeof(int);
4260 ret
= getsockopt(sock
, 0xffffffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4261 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4262 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4263 ret
, WSAGetLastError(), optval
, optval
);
4265 /* more invalid values for level */
4266 SetLastError(0xdeadbeef);
4267 optval
= 0xdeadbeef;
4268 optlen
= sizeof(int);
4269 ret
= getsockopt(sock
, 0x1234ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4270 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4271 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4272 ret
, WSAGetLastError(), optval
, optval
);
4274 SetLastError(0xdeadbeef);
4275 optval
= 0xdeadbeef;
4276 optlen
= sizeof(int);
4277 ret
= getsockopt(sock
, 0x8000ffff, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4278 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4279 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4280 ret
, WSAGetLastError(), optval
, optval
);
4282 SetLastError(0xdeadbeef);
4283 optval
= 0xdeadbeef;
4284 optlen
= sizeof(int);
4285 ret
= getsockopt(sock
, 0x00008000, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4286 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4287 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4288 ret
, WSAGetLastError(), optval
, optval
);
4290 SetLastError(0xdeadbeef);
4291 optval
= 0xdeadbeef;
4292 optlen
= sizeof(int);
4293 ret
= getsockopt(sock
, 0x00000800, SO_MAX_MSG_SIZE
, (char *)&optval
, &optlen
);
4294 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAEINVAL
),
4295 "got %d with %d and optval: 0x%x/%d (expected SOCKET_ERROR with WSAEINVAL)\n",
4296 ret
, WSAGetLastError(), optval
, optval
);
4298 SetLastError(0xdeadbeef);
4299 optlen
= sizeof(LINGER
);
4300 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
4301 ok( (ret
== SOCKET_ERROR
) && (WSAGetLastError() == WSAENOPROTOOPT
),
4302 "getsockopt should fail for UDP sockets setting last error to WSAENOPROTOOPT, got %d with %d\n",
4303 ret
, WSAGetLastError());
4306 if((sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4307 trace("Creating the socket failed: %d\n", WSAGetLastError());
4312 if(bind(sock
, (struct sockaddr
*) &sa
, sa_len
) < 0){
4313 trace("Failed to bind socket: %d\n", WSAGetLastError());
4319 ret
= getsockopt(sock
, SOL_SOCKET
, SO_LINGER
, (char *)&linger_val
, &optlen
);
4320 ok(ret
== 0, "getsockopt failed to query SO_LINGER, return value is 0x%08x\n", ret
);
4322 optlen
= sizeof(BOOL
);
4323 ret
= getsockopt(sock
, SOL_SOCKET
, SO_DONTLINGER
, (char *)&bool_opt_val
, &optlen
);
4324 ok(ret
== 0, "getsockopt failed to query SO_DONTLINGER, return value is 0x%08x\n", ret
);
4325 ok((linger_val
.l_onoff
&& !bool_opt_val
) || (!linger_val
.l_onoff
&& bool_opt_val
),
4326 "Return value of SO_DONTLINGER is %d, but SO_LINGER returned l_onoff == %d.\n",
4327 bool_opt_val
, linger_val
.l_onoff
);
4333 static void test_getsockname(void)
4337 struct sockaddr_in sa_set
, sa_get
;
4338 int sa_set_len
= sizeof(struct sockaddr_in
);
4339 int sa_get_len
= sa_set_len
;
4340 static const unsigned char null_padding
[] = {0,0,0,0,0,0,0,0};
4344 if(WSAStartup(MAKEWORD(2,0), &wsa
)){
4345 trace("Winsock failed: %d. Aborting test\n", WSAGetLastError());
4349 memset(&sa_set
, 0, sa_set_len
);
4351 sa_set
.sin_family
= AF_INET
;
4352 sa_set
.sin_port
= htons(0);
4353 sa_set
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
4355 if((sock
= socket(PF_INET
, SOCK_STREAM
, IPPROTO_IP
)) == INVALID_SOCKET
) {
4356 trace("Creating the socket failed: %d\n", WSAGetLastError());
4362 if (getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
) == 0)
4363 ok(0, "getsockname on unbound socket should fail\n");
4365 ok(WSAGetLastError() == WSAEINVAL
, "getsockname on unbound socket "
4366 "failed with %d, expected %d\n", WSAGetLastError(), WSAEINVAL
);
4367 ok(memcmp(&sa_get
, &sa_set
, sizeof(sa_get
)) == 0,
4368 "failed getsockname modified sockaddr when it shouldn't\n");
4371 if(bind(sock
, (struct sockaddr
*) &sa_set
, sa_set_len
) < 0){
4372 trace("Failed to bind socket: %d\n", WSAGetLastError());
4378 if(getsockname(sock
, (struct sockaddr
*) &sa_get
, &sa_get_len
) != 0){
4379 trace("Failed to call getsockname: %d\n", WSAGetLastError());
4385 ret
= memcmp(sa_get
.sin_zero
, null_padding
, 8);
4386 ok(ret
== 0 || broken(ret
!= 0), /* NT4 */
4387 "getsockname did not zero the sockaddr_in structure\n");
4391 h
= gethostbyname("");
4392 if (h
&& h
->h_length
== 4) /* this test is only meaningful in IPv4 */
4395 for (i
= 0; h
->h_addr_list
[i
]; i
++)
4399 ip
.s_addr
= *(ULONG
*) h
->h_addr_list
[i
];
4401 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
4402 ok(sock
!= INVALID_SOCKET
, "socket failed with %d\n", GetLastError());
4404 memset(&sa_set
, 0, sizeof(sa_set
));
4405 sa_set
.sin_family
= AF_INET
;
4406 sa_set
.sin_addr
.s_addr
= ip
.s_addr
;
4407 /* The same address we bind must be the same address we get */
4408 ret
= bind(sock
, (struct sockaddr
*)&sa_set
, sizeof(sa_set
));
4409 ok(ret
== 0, "bind failed with %d\n", GetLastError());
4410 sa_get_len
= sizeof(sa_get
);
4411 ret
= getsockname(sock
, (struct sockaddr
*)&sa_get
, &sa_get_len
);
4412 ok(ret
== 0, "getsockname failed with %d\n", GetLastError());
4413 strcpy(ipstr
, inet_ntoa(sa_get
.sin_addr
));
4414 trace("testing bind on interface %s\n", ipstr
);
4415 ok(sa_get
.sin_addr
.s_addr
== sa_set
.sin_addr
.s_addr
,
4416 "address does not match: %s != %s\n", ipstr
, inet_ntoa(sa_set
.sin_addr
));
4425 static void test_dns(void)
4436 h
= gethostbyname("");
4437 ok(h
!= NULL
, "gethostbyname(\"\") failed with %d\n", h_errno
);
4439 /* Use an address with valid alias names if possible */
4440 h
= gethostbyname("source.winehq.org");
4443 skip("Can't test the hostent structure because gethostbyname failed\n");
4447 /* The returned struct must be allocated in a very strict way. First we need to
4448 * count how many aliases there are because they must be located right after
4449 * the struct hostent size. Knowing the amount of aliases we know the exact
4450 * location of the first IP returned. Rule valid for >= XP, for older OS's
4451 * it's somewhat the opposite. */
4453 if(h
->h_addr_list
== addr
.mem
) /* <= W2K */
4455 win_skip("Skipping hostent tests since this OS is unsupported\n");
4459 ok(h
->h_aliases
== addr
.mem
,
4460 "hostent->h_aliases should be in %p, it is in %p\n", addr
.mem
, h
->h_aliases
);
4462 for(ptr
= h
->h_aliases
, acount
= 1; *ptr
; ptr
++) acount
++;
4463 addr
.chr
+= sizeof(*ptr
) * acount
;
4464 ok(h
->h_addr_list
== addr
.mem
,
4465 "hostent->h_addr_list should be in %p, it is in %p\n", addr
.mem
, h
->h_addr_list
);
4467 for(ptr
= h
->h_addr_list
, acount
= 1; *ptr
; ptr
++) acount
++;
4469 addr
.chr
+= sizeof(*ptr
) * acount
;
4470 ok(h
->h_addr_list
[0] == addr
.mem
,
4471 "hostent->h_addr_list[0] should be in %p, it is in %p\n", addr
.mem
, h
->h_addr_list
[0]);
4474 /* Our winsock headers don't define gethostname because it conflicts with the
4475 * definition in unistd.h. Define it here to get rid of the warning. */
4477 int WINAPI
gethostname(char *name
, int namelen
);
4479 static void test_gethostbyname(void)
4482 struct in_addr
**addr_list
;
4483 char name
[256], first_ip
[16];
4485 PMIB_IPFORWARDTABLE routes
= NULL
;
4486 PIP_ADAPTER_INFO adapters
= NULL
, k
;
4487 DWORD adap_size
= 0, route_size
= 0;
4488 BOOL found_default
= FALSE
;
4489 BOOL local_ip
= FALSE
;
4491 ret
= gethostname(name
, sizeof(name
));
4492 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4494 he
= gethostbyname(name
);
4495 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4496 addr_list
= (struct in_addr
**)he
->h_addr_list
;
4497 strcpy(first_ip
, inet_ntoa(*addr_list
[0]));
4499 trace("List of local IPs:\n");
4500 for(count
= 0; addr_list
[count
] != NULL
; count
++)
4502 char *ip
= inet_ntoa(*addr_list
[count
]);
4503 if (!strcmp(ip
, "127.0.0.1"))
4510 ok (count
== 1, "expected 127.0.0.1 to be the only IP returned\n");
4511 skip("Only the loopback address is present, skipping tests\n");
4515 if (!pGetAdaptersInfo
|| !pGetIpForwardTable
)
4517 win_skip("GetAdaptersInfo and/or GetIpForwardTable not found, skipping tests\n");
4521 ret
= pGetAdaptersInfo(NULL
, &adap_size
);
4522 ok (ret
== ERROR_BUFFER_OVERFLOW
, "GetAdaptersInfo failed with a different error: %d\n", ret
);
4523 ret
= pGetIpForwardTable(NULL
, &route_size
, FALSE
);
4524 ok (ret
== ERROR_INSUFFICIENT_BUFFER
, "GetIpForwardTable failed with a different error: %d\n", ret
);
4526 adapters
= HeapAlloc(GetProcessHeap(), 0, adap_size
);
4527 routes
= HeapAlloc(GetProcessHeap(), 0, route_size
);
4529 ret
= pGetAdaptersInfo(adapters
, &adap_size
);
4530 ok (ret
== NO_ERROR
, "GetAdaptersInfo failed, error: %d\n", ret
);
4531 ret
= pGetIpForwardTable(routes
, &route_size
, FALSE
);
4532 ok (ret
== NO_ERROR
, "GetIpForwardTable failed, error: %d\n", ret
);
4534 /* This test only has meaning if there is more than one IP configured */
4535 if (adapters
->Next
== NULL
&& count
== 1)
4537 skip("Only one IP is present, skipping tests\n");
4541 for (i
= 0; !found_default
&& i
< routes
->dwNumEntries
; i
++)
4543 /* default route (ip 0.0.0.0) ? */
4544 if (routes
->table
[i
].dwForwardDest
) continue;
4546 for (k
= adapters
; k
!= NULL
; k
= k
->Next
)
4550 if (k
->Index
!= routes
->table
[i
].dwForwardIfIndex
) continue;
4552 /* the first IP returned from gethostbyname must be a default route */
4553 ip
= k
->IpAddressList
.IpAddress
.String
;
4554 if (!strcmp(first_ip
, ip
))
4556 found_default
= TRUE
;
4561 ok (found_default
, "failed to find the first IP from gethostbyname!\n");
4564 HeapFree(GetProcessHeap(), 0, adapters
);
4565 HeapFree(GetProcessHeap(), 0, routes
);
4568 static void test_gethostbyname_hack(void)
4572 static BYTE loopback
[] = {127, 0, 0, 1};
4573 static BYTE magic_loopback
[] = {127, 12, 34, 56};
4576 ret
= gethostname(name
, 256);
4577 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4579 he
= gethostbyname("localhost");
4580 ok(he
!= NULL
, "gethostbyname(\"localhost\") failed: %d\n", h_errno
);
4583 if(he
->h_length
!= 4)
4585 skip("h_length is %d, not IPv4, skipping test.\n", he
->h_length
);
4589 ok(memcmp(he
->h_addr_list
[0], loopback
, he
->h_length
) == 0,
4590 "gethostbyname(\"localhost\") returned %d.%d.%d.%d\n",
4591 he
->h_addr_list
[0][0], he
->h_addr_list
[0][1], he
->h_addr_list
[0][2],
4592 he
->h_addr_list
[0][3]);
4595 if(strcmp(name
, "localhost") == 0)
4597 skip("hostname seems to be \"localhost\", skipping test.\n");
4601 he
= gethostbyname(name
);
4602 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, h_errno
);
4605 if(he
->h_length
!= 4)
4607 skip("h_length is %d, not IPv4, skipping test.\n", he
->h_length
);
4611 if (he
->h_addr_list
[0][0] == 127)
4613 ok(memcmp(he
->h_addr_list
[0], magic_loopback
, he
->h_length
) == 0,
4614 "gethostbyname(\"%s\") returned %d.%d.%d.%d not 127.12.34.56\n",
4615 name
, he
->h_addr_list
[0][0], he
->h_addr_list
[0][1],
4616 he
->h_addr_list
[0][2], he
->h_addr_list
[0][3]);
4620 gethostbyname("nonexistent.winehq.org");
4621 /* Don't check for the return value, as some braindead ISPs will kindly
4622 * resolve nonexistent host names to addresses of the ISP's spam pages. */
4625 static void test_gethostname(void)
4631 WSASetLastError(0xdeadbeef);
4632 ret
= gethostname(NULL
, 256);
4633 ok(ret
== -1, "gethostname() returned %d\n", ret
);
4634 ok(WSAGetLastError() == WSAEFAULT
, "gethostname with null buffer "
4635 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT
);
4637 ret
= gethostname(name
, sizeof(name
));
4638 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4639 he
= gethostbyname(name
);
4640 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4643 WSASetLastError(0xdeadbeef);
4644 strcpy(name
, "deadbeef");
4645 ret
= gethostname(name
, len
);
4646 ok(ret
== -1, "gethostname() returned %d\n", ret
);
4647 ok(!strcmp(name
, "deadbeef"), "name changed unexpected!\n");
4648 ok(WSAGetLastError() == WSAEFAULT
, "gethostname with insufficient length "
4649 "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT
);
4652 ret
= gethostname(name
, len
);
4653 ok(ret
== 0, "gethostname() call failed: %d\n", WSAGetLastError());
4654 he
= gethostbyname(name
);
4655 ok(he
!= NULL
, "gethostbyname(\"%s\") failed: %d\n", name
, WSAGetLastError());
4658 static void test_inet_addr(void)
4662 addr
= inet_addr(NULL
);
4663 ok(addr
== INADDR_NONE
, "inet_addr succeeded unexpectedly\n");
4666 static void test_addr_to_print(void)
4672 struct in6_addr in6
;
4674 u_long addr0_Num
= 0x00000000;
4675 PCSTR addr0_Str
= "0.0.0.0";
4676 u_long addr1_Num
= 0x20201015;
4677 PCSTR addr1_Str
= "21.16.32.32";
4678 u_char addr2_Num
[16] = {0,0,0,0,0,0,0,0,0,0,0xff,0xfe,0xcC,0x98,0xbd,0x74};
4679 PCSTR addr2_Str
= "::fffe:cc98:bd74";
4680 u_char addr3_Num
[16] = {0x20,0x30,0xa4,0xb1};
4681 PCSTR addr3_Str
= "2030:a4b1::";
4682 u_char addr4_Num
[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0xcC,0x98,0xbd,0x74};
4683 PCSTR addr4_Str
= "::204.152.189.116";
4685 /* Test IPv4 addresses */
4686 in
.s_addr
= addr0_Num
;
4688 pdst
= inet_ntoa(*((struct in_addr
*)&in
.s_addr
));
4689 ok(pdst
!= NULL
, "inet_ntoa failed %s\n", dst
);
4690 ok(!strcmp(pdst
, addr0_Str
),"Address %s != %s\n", pdst
, addr0_Str
);
4692 /* Test that inet_ntoa and inet_ntop return the same value */
4693 in
.S_un
.S_addr
= addr1_Num
;
4694 pdst
= inet_ntoa(*((struct in_addr
*)&in
.s_addr
));
4695 ok(pdst
!= NULL
, "inet_ntoa failed %s\n", dst
);
4696 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4698 /* InetNtop became available in Vista and Win2008 */
4701 win_skip("InetNtop not present, not executing tests\n");
4705 /* Second part of test */
4706 pdst
= pInetNtop(AF_INET
,(void*)&in
.s_addr
, dst
, sizeof(dst
));
4707 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst
);
4708 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4710 /* Test invalid parm conditions */
4711 pdst
= pInetNtop(1, (void*)&in
.s_addr
, dst
, sizeof(dst
));
4712 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4713 ok(WSAGetLastError() == WSAEAFNOSUPPORT
, "Should be WSAEAFNOSUPPORT\n");
4715 /* Test Null destination */
4717 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, NULL
, sizeof(dst
));
4718 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4719 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4720 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4722 /* Test zero length passed */
4725 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, 0);
4726 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4727 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4728 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4730 /* Test length one shorter than the address length */
4733 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, 6);
4734 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4735 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4736 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4738 /* Test longer length is ok */
4741 pdst
= pInetNtop(AF_INET
, (void*)&in
.s_addr
, dst
, sizeof(dst
)+1);
4742 ok(pdst
!= NULL
, "The pointer should be returned (%p)\n", pdst
);
4743 ok(!strcmp(pdst
, addr1_Str
),"Address %s != %s\n", pdst
, addr1_Str
);
4745 /* Test the IPv6 addresses */
4747 /* Test an zero prefixed IPV6 address */
4748 memcpy(in6
.u
.Byte
, addr2_Num
, sizeof(addr2_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
, addr2_Str
),"Address %s != %s\n", pdst
, addr2_Str
);
4753 /* Test an zero suffixed IPV6 address */
4754 memcpy(in6
.s6_addr
, addr3_Num
, sizeof(addr3_Num
));
4755 pdst
= pInetNtop(AF_INET6
,(void*)&in6
.s6_addr
, dst6
, sizeof(dst6
));
4756 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst6
);
4757 ok(!strcmp(pdst
, addr3_Str
),"Address %s != %s\n", pdst
, addr3_Str
);
4759 /* Test the IPv6 address contains the IPv4 address in IPv4 notation */
4760 memcpy(in6
.s6_addr
, addr4_Num
, sizeof(addr4_Num
));
4761 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, sizeof(dst6
));
4762 ok(pdst
!= NULL
, "InetNtop failed %s\n", dst6
);
4763 ok(!strcmp(pdst
, addr4_Str
),"Address %s != %s\n", pdst
, addr4_Str
);
4765 /* Test invalid parm conditions */
4766 memcpy(in6
.u
.Byte
, addr2_Num
, sizeof(addr2_Num
));
4768 /* Test Null destination */
4770 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, NULL
, sizeof(dst6
));
4771 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4772 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4773 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4775 /* Test zero length passed */
4778 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 0);
4779 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4780 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4781 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4783 /* Test length one shorter than the address length */
4786 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 16);
4787 ok(pdst
== NULL
, "The pointer should not be returned (%p)\n", pdst
);
4788 ok(WSAGetLastError() == STATUS_INVALID_PARAMETER
|| WSAGetLastError() == WSAEINVAL
/* Win7 */,
4789 "Should be STATUS_INVALID_PARAMETER or WSAEINVAL not 0x%x\n", WSAGetLastError());
4791 /* Test longer length is ok */
4794 pdst
= pInetNtop(AF_INET6
, (void*)&in6
.s6_addr
, dst6
, 18);
4795 ok(pdst
!= NULL
, "The pointer should be returned (%p)\n", pdst
);
4797 static void test_inet_pton(void)
4803 const char *printable
, *collapsed
, *raw_data
;
4805 {AF_UNSPEC
, -1, WSAEFAULT
, /* Test 0 */
4807 {AF_INET
, -1, WSAEFAULT
,
4809 {AF_INET6
, -1, WSAEFAULT
,
4811 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4812 "127.0.0.1", NULL
, NULL
},
4814 "127.0.0.1", "127.0.0.1",
4815 "\x7f\x00\x00\x01"},
4817 "127.0.0.1", "127.0.0.1", NULL
},
4819 "::1/128", NULL
, NULL
},
4821 "::1/128", NULL
, NULL
},
4822 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4823 "broken", NULL
, NULL
},
4825 "broken", NULL
, NULL
},
4826 {AF_INET6
, 0, 0, /* Test 10 */
4827 "broken", NULL
, NULL
},
4828 {AF_UNSPEC
, -1, WSAEAFNOSUPPORT
,
4829 "177.32.45.20", NULL
, NULL
},
4831 "177.32.45.20", "177.32.45.20",
4832 "\xb1\x20\x2d\x14"},
4834 "177.32.45.20", NULL
, NULL
},
4836 "2607:f0d0:1002:51::4", NULL
, NULL
},
4838 "2607:f0d0:1002:51::4", "2607:f0d0:1002:51::4",
4839 "\x26\x07\xf0\xd0\x10\x02\x00\x51\x00\x00\x00\x00\x00\x00\x00\x04"},
4841 "::177.32.45.20", NULL
, NULL
},
4843 "::177.32.45.20", "::177.32.45.20",
4844 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x20\x2d\x14"},
4846 "fe80::0202:b3ff:fe1e:8329", NULL
, NULL
},
4848 "fe80::0202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
4849 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
4850 {AF_INET6
, 1, 0, /* Test 20 */
4851 "fe80::202:b3ff:fe1e:8329", "fe80::202:b3ff:fe1e:8329",
4852 "\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x02\xb3\xff\xfe\x1e\x83\x29"},
4858 "a.b.c", NULL
, NULL
},
4860 "a.b.c.d", NULL
, NULL
},
4862 "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba::3257:9652",
4863 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
4865 "2001:cdba::3257:9652", "2001:cdba::3257:9652",
4866 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"},
4868 "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652",
4869 "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}
4873 char buffer
[64],str
[64];
4874 WCHAR printableW
[64], collapsedW
[64];
4878 /* InetNtop and InetPton became available in Vista and Win2008 */
4879 if (!pInetNtop
|| !pInetNtopW
|| !pInetPtonA
|| !pInetPtonW
)
4881 win_skip("InetNtop and/or InetPton not present, not executing tests\n");
4885 for (i
= 0; i
< sizeof(tests
) / sizeof(tests
[0]); i
++)
4887 WSASetLastError(0xdeadbeef);
4888 ret
= pInetPtonA(tests
[i
].family
, tests
[i
].printable
, buffer
);
4889 ok (ret
== tests
[i
].ret
, "Test [%d]: Expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
4890 if (tests
[i
].ret
== -1)
4892 err
= WSAGetLastError();
4893 ok (tests
[i
].err
== err
, "Test [%d]: Expected 0x%x, got 0x%x\n", i
, tests
[i
].err
, err
);
4895 if (tests
[i
].ret
!= 1) continue;
4896 ok (memcmp(buffer
, tests
[i
].raw_data
,
4897 tests
[i
].family
== AF_INET
? sizeof(struct in_addr
) : sizeof(struct in6_addr
)) == 0,
4898 "Test [%d]: Expected binary data differs\n", i
);
4900 /* Test the result from Pton with Ntop */
4901 strcpy (str
, "deadbeef");
4902 ptr
= pInetNtop(tests
[i
].family
, buffer
, str
, sizeof(str
));
4903 ok (ptr
!= NULL
, "Test [%d]: Failed with NULL\n", i
);
4904 ok (ptr
== str
, "Test [%d]: Pointers differ (%p != %p)\n", i
, ptr
, str
);
4906 ok (strcmp(ptr
, tests
[i
].collapsed
) == 0, "Test [%d]: Expected '%s', got '%s'\n",
4907 i
, tests
[i
].collapsed
, ptr
);
4910 for (i
= 0; i
< sizeof(tests
) / sizeof(tests
[0]); i
++)
4912 if (tests
[i
].printable
)
4913 MultiByteToWideChar(CP_ACP
, 0, tests
[i
].printable
, -1, printableW
,
4914 sizeof(printableW
) / sizeof(printableW
[0]));
4915 WSASetLastError(0xdeadbeef);
4916 ret
= pInetPtonW(tests
[i
].family
, tests
[i
].printable
? printableW
: NULL
, buffer
);
4917 ok(ret
== tests
[i
].ret
, "Test [%d]: Expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
4918 if (tests
[i
].ret
== -1)
4920 err
= WSAGetLastError();
4921 ok(tests
[i
].err
== err
, "Test [%d]: Expected 0x%x, got 0x%x\n", i
, tests
[i
].err
, err
);
4923 if (tests
[i
].ret
!= 1) continue;
4924 ok(memcmp(buffer
, tests
[i
].raw_data
,
4925 tests
[i
].family
== AF_INET
? sizeof(struct in_addr
) : sizeof(struct in6_addr
)) == 0,
4926 "Test [%d]: Expected binary data differs\n", i
);
4928 /* Test the result from Pton with Ntop */
4929 printableW
[0] = 0xdead;
4930 ptrW
= pInetNtopW(tests
[i
].family
, buffer
, printableW
, sizeof(printableW
) / sizeof(printableW
[0]));
4931 ok (ptrW
!= NULL
, "Test [%d]: Failed with NULL\n", i
);
4932 ok (ptrW
== printableW
, "Test [%d]: Pointers differ (%p != %p)\n", i
, ptrW
, printableW
);
4933 if (!ptrW
) continue;
4935 MultiByteToWideChar(CP_ACP
, 0, tests
[i
].collapsed
, -1, collapsedW
,
4936 sizeof(collapsedW
) / sizeof(collapsedW
[0]));
4937 ok (lstrcmpW(ptrW
, collapsedW
) == 0, "Test [%d]: Expected '%s', got '%s'\n",
4938 i
, tests
[i
].collapsed
, wine_dbgstr_w(ptrW
));
4942 static void test_ioctlsocket(void)
4944 SOCKET sock
, src
, dst
;
4945 struct tcp_keepalive kalive
;
4947 static const LONG cmds
[] = {FIONBIO
, FIONREAD
, SIOCATMARK
};
4953 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
4954 ok(sock
!= INVALID_SOCKET
, "Creating the socket failed: %d\n", WSAGetLastError());
4955 if(sock
== INVALID_SOCKET
)
4957 skip("Can't continue without a socket.\n");
4961 for(i
= 0; i
< sizeof(cmds
)/sizeof(cmds
[0]); i
++)
4963 /* broken apps like defcon pass the argp value directly instead of a pointer to it */
4964 ret
= ioctlsocket(sock
, cmds
[i
], (u_long
*)1);
4965 ok(ret
== SOCKET_ERROR
, "ioctlsocket succeeded unexpectedly\n");
4966 ret
= WSAGetLastError();
4967 ok(ret
== WSAEFAULT
, "expected WSAEFAULT, got %d instead\n", ret
);
4970 /* A fresh and not connected socket has no urgent data, this test shows
4971 * that normal(not urgent) data returns a non-zero value for SIOCATMARK. */
4973 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4974 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4975 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4977 /* when SO_OOBINLINE is set SIOCATMARK must always return TRUE */
4979 ret
= setsockopt(sock
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
4980 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
4982 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4983 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4984 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4986 /* disable SO_OOBINLINE and get the same old behavior */
4988 ret
= setsockopt(sock
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
4989 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
4991 ret
= ioctlsocket(sock
, SIOCATMARK
, &arg
);
4992 ok(ret
!= SOCKET_ERROR
, "ioctlsocket failed unexpectedly\n");
4993 ok(arg
, "SIOCATMARK expected a non-zero value\n");
4995 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &arg
, 0, NULL
, 0, &arg
, NULL
, NULL
);
4996 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
4997 ret
= WSAGetLastError();
4998 ok(ret
== WSAEFAULT
|| broken(ret
== WSAEINVAL
), "expected WSAEFAULT, got %d instead\n", ret
);
5000 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, NULL
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5001 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5002 ret
= WSAGetLastError();
5003 ok(ret
== WSAEFAULT
|| broken(ret
== WSAEINVAL
), "expected WSAEFAULT, got %d instead\n", ret
);
5005 /* broken used to catch W95, W98, NT4 */
5006 make_keepalive(kalive
, 0, 0, 0);
5007 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5008 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5010 make_keepalive(kalive
, 1, 0, 0);
5011 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5012 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5014 make_keepalive(kalive
, 1, 1000, 1000);
5015 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5016 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5018 make_keepalive(kalive
, 1, 10000, 10000);
5019 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5020 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5022 make_keepalive(kalive
, 1, 100, 100);
5023 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5024 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5026 make_keepalive(kalive
, 0, 100, 100);
5027 ret
= WSAIoctl(sock
, SIO_KEEPALIVE_VALS
, &kalive
, sizeof(struct tcp_keepalive
), NULL
, 0, &arg
, NULL
, NULL
);
5028 ok(ret
== 0 || broken(ret
== SOCKET_ERROR
), "WSAIoctl failed unexpectedly\n");
5032 if (tcp_socketpair(&src
, &dst
) != 0)
5034 ok(0, "creating socket pair failed, skipping test\n");
5038 /* test FIONREAD on TCP sockets */
5039 optval
= 0xdeadbeef;
5040 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5041 ok(ret
== 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5042 ok(optval
== 0, "FIONREAD should have returned 0 bytes, got %d instead\n", optval
);
5044 optval
= 0xdeadbeef;
5045 ok(send(src
, "TEST", 4, 0) == 4, "failed to send test data\n");
5047 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5048 ok(ret
== 0, "WSAIoctl failed unexpectedly with error %d\n", WSAGetLastError());
5049 ok(optval
== 4, "FIONREAD should have returned 4 bytes, got %d instead\n", optval
);
5051 /* trying to read from an OOB inlined socket with MSG_OOB results in WSAEINVAL */
5052 set_blocking(dst
, FALSE
);
5054 SetLastError(0xdeadbeef);
5055 ret
= recv(dst
, &data
, 1, i
);
5056 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5057 ret
= GetLastError();
5058 ok(ret
== WSAEWOULDBLOCK
, "expected 10035, got %d\n", ret
);
5059 bufs
.len
= sizeof(char);
5061 ret
= WSARecv(dst
, &bufs
, 1, &bytes_rec
, &i
, NULL
, NULL
);
5062 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5063 ret
= GetLastError();
5064 ok(ret
== WSAEWOULDBLOCK
, "expected 10035, got %d\n", ret
);
5066 ret
= setsockopt(dst
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&optval
, sizeof(optval
));
5067 ok(ret
!= SOCKET_ERROR
, "setsockopt failed unexpectedly\n");
5069 SetLastError(0xdeadbeef);
5070 ret
= recv(dst
, &data
, 1, i
);
5071 if (ret
== SOCKET_ERROR
)
5073 ret
= GetLastError();
5074 ok(ret
== WSAEINVAL
, "expected 10022, got %d\n", ret
);
5075 bufs
.len
= sizeof(char);
5077 ret
= WSARecv(dst
, &bufs
, 1, &bytes_rec
, &i
, NULL
, NULL
);
5078 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
5079 ret
= GetLastError();
5080 ok(ret
== WSAEINVAL
, "expected 10022, got %d\n", ret
);
5082 else ok(broken(ret
== 1) /* <= NT4 */, "expected error, got 1\n");
5085 optval
= 0xdeadbeef;
5086 ret
= WSAIoctl(dst
, FIONREAD
, NULL
, 0, &optval
, sizeof(optval
), &arg
, NULL
, NULL
);
5087 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
5088 ok(optval
== 0xdeadbeef, "FIONREAD should not have changed last error, got %d instead\n", optval
);
5092 static BOOL drain_pause
= FALSE
;
5093 static DWORD WINAPI
drain_socket_thread(LPVOID arg
)
5096 SOCKET sock
= *(SOCKET
*)arg
;
5099 while ((ret
= recv(sock
, buffer
, sizeof(buffer
), 0)) != 0)
5103 if (WSAGetLastError() == WSAEWOULDBLOCK
)
5107 FD_SET(sock
, &readset
);
5108 select(sock
+1, &readset
, NULL
, NULL
, NULL
);
5119 static void test_send(void)
5121 SOCKET src
= INVALID_SOCKET
;
5122 SOCKET dst
= INVALID_SOCKET
;
5123 HANDLE hThread
= NULL
;
5124 const int buflen
= 1024*1024;
5125 char *buffer
= NULL
;
5126 int ret
, i
, zero
= 0;
5130 DWORD id
, bytes_sent
, dwRet
;
5132 memset(&ov
, 0, sizeof(ov
));
5134 if (tcp_socketpair(&src
, &dst
) != 0)
5136 ok(0, "creating socket pair failed, skipping test\n");
5140 set_blocking(dst
, FALSE
);
5141 /* force disable buffering so we can get a pending overlapped request */
5142 ret
= setsockopt(dst
, SOL_SOCKET
, SO_SNDBUF
, (char *) &zero
, sizeof(zero
));
5143 ok(!ret
, "setsockopt SO_SNDBUF failed: %d - %d\n", ret
, GetLastError());
5145 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
5146 if (hThread
== NULL
)
5148 ok(0, "CreateThread failed, error %d\n", GetLastError());
5152 buffer
= HeapAlloc(GetProcessHeap(), 0, buflen
);
5155 ok(0, "HeapAlloc failed, error %d\n", GetLastError());
5159 /* fill the buffer with some nonsense */
5160 for (i
= 0; i
< buflen
; ++i
)
5162 buffer
[i
] = (char) i
;
5165 ret
= send(src
, buffer
, buflen
, 0);
5167 ok(ret
== buflen
, "send should have sent %d bytes, but it only sent %d\n", buflen
, ret
);
5169 ok(0, "send failed, error %d\n", WSAGetLastError());
5174 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5175 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
5180 WSASetLastError(12345);
5181 ret
= WSASend(dst
, &buf
, 1, &bytes_sent
, 0, &ov
, NULL
);
5182 ok((ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
) || broken(bytes_sent
== buflen
),
5183 "Failed to start overlapped send %d - %d - %d/%d\n", ret
, WSAGetLastError(), bytes_sent
, buflen
);
5185 /* don't check for completion yet, we may need to drain the buffer while still sending */
5186 set_blocking(src
, FALSE
);
5187 for (i
= 0; i
< buflen
; ++i
)
5191 ret
= recv(src
, buffer
, 1, 0);
5192 while (ret
== SOCKET_ERROR
&& GetLastError() == WSAEWOULDBLOCK
&& j
< 100)
5196 ret
= recv(src
, buffer
, 1, 0);
5199 ok(ret
== 1, "Failed to receive data %d - %d (got %d/%d)\n", ret
, GetLastError(), i
, buflen
);
5203 ok(buffer
[0] == (char) i
, "Received bad data at position %d\n", i
);
5206 dwRet
= WaitForSingleObject(ov
.hEvent
, 1000);
5207 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5208 if (dwRet
== WAIT_OBJECT_0
)
5210 bret
= GetOverlappedResult((HANDLE
)dst
, &ov
, &bytes_sent
, FALSE
);
5211 ok((bret
&& bytes_sent
== buflen
) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5212 "Got %d instead of %d (%d - %d)\n", bytes_sent
, buflen
, bret
, GetLastError());
5215 WSASetLastError(12345);
5216 ret
= WSASend(INVALID_SOCKET
, &buf
, 1, NULL
, 0, &ov
, NULL
);
5217 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
5218 "WSASend failed %d - %d\n", ret
, WSAGetLastError());
5220 WSASetLastError(12345);
5221 ret
= WSASend(dst
, &buf
, 1, NULL
, 0, &ov
, NULL
);
5222 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == ERROR_IO_PENDING
,
5223 "Failed to start overlapped send %d - %d\n", ret
, WSAGetLastError());
5226 if (src
!= INVALID_SOCKET
)
5228 if (dst
!= INVALID_SOCKET
)
5230 if (hThread
!= NULL
)
5232 dwRet
= WaitForSingleObject(hThread
, 500);
5233 ok(dwRet
== WAIT_OBJECT_0
, "failed to wait for thread termination: %d\n", GetLastError());
5234 CloseHandle(hThread
);
5237 CloseHandle(ov
.hEvent
);
5238 HeapFree(GetProcessHeap(), 0, buffer
);
5241 typedef struct async_message
5245 struct async_message
*next
;
5248 static struct async_message
*messages_received
;
5250 #define WM_SOCKET (WM_USER+100)
5251 static LRESULT CALLBACK
ws2_test_WndProc(HWND hwnd
, UINT msg
, WPARAM wparam
, LPARAM lparam
)
5253 struct async_message
*message
;
5258 message
= HeapAlloc(GetProcessHeap(), 0, sizeof(*message
));
5259 message
->socket
= (SOCKET
) wparam
;
5260 message
->lparam
= lparam
;
5261 message
->next
= NULL
;
5263 if (messages_received
)
5265 struct async_message
*last
= messages_received
;
5266 while (last
->next
) last
= last
->next
;
5267 last
->next
= message
;
5270 messages_received
= message
;
5274 return DefWindowProcA(hwnd
, msg
, wparam
, lparam
);
5277 static void get_event_details(int event
, int *bit
, char *name
)
5282 if (bit
) *bit
= FD_ACCEPT_BIT
;
5283 if (name
) strcpy(name
, "FD_ACCEPT");
5286 if (bit
) *bit
= FD_CONNECT_BIT
;
5287 if (name
) strcpy(name
, "FD_CONNECT");
5290 if (bit
) *bit
= FD_READ_BIT
;
5291 if (name
) strcpy(name
, "FD_READ");
5294 if (bit
) *bit
= FD_OOB_BIT
;
5295 if (name
) strcpy(name
, "FD_OOB");
5298 if (bit
) *bit
= FD_WRITE_BIT
;
5299 if (name
) strcpy(name
, "FD_WRITE");
5302 if (bit
) *bit
= FD_CLOSE_BIT
;
5303 if (name
) strcpy(name
, "FD_CLOSE");
5307 if (name
) sprintf(name
, "bad%x", event
);
5311 static const char *dbgstr_event_seq(const LPARAM
*seq
)
5313 static char message
[1024];
5321 get_event_details(WSAGETSELECTEVENT(*seq
), NULL
, name
);
5322 len
+= sprintf(message
+ len
, "%s(%d) ", name
, WSAGETSELECTERROR(*seq
));
5326 strcpy( message
+ len
, "]" );
5330 static char *dbgstr_event_seq_result(SOCKET s
, WSANETWORKEVENTS
*netEvents
)
5332 static char message
[1024];
5333 struct async_message
*curr
= messages_received
;
5334 int index
, error
, bit
= 0;
5344 if (bit
>= FD_MAX_EVENTS
) break;
5345 if ( !(netEvents
->lNetworkEvents
& (1 << bit
)) )
5350 get_event_details(1 << bit
, &index
, name
);
5351 error
= netEvents
->iErrorCode
[index
];
5357 if (curr
->socket
!= s
)
5362 get_event_details(WSAGETSELECTEVENT(curr
->lparam
), NULL
, name
);
5363 error
= WSAGETSELECTERROR(curr
->lparam
);
5367 len
+= sprintf(message
+ len
, "%s(%d) ", name
, error
);
5370 strcpy( message
+ len
, "]" );
5374 static void flush_events(SOCKET s
, HANDLE hEvent
)
5376 WSANETWORKEVENTS netEvents
;
5377 struct async_message
*prev
= NULL
, *curr
= messages_received
;
5381 if (hEvent
!= INVALID_HANDLE_VALUE
)
5383 dwRet
= WaitForSingleObject(hEvent
, 100);
5384 if (dwRet
== WAIT_OBJECT_0
)
5386 ret
= WSAEnumNetworkEvents(s
, hEvent
, &netEvents
);
5388 ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret
);
5395 if (curr
->socket
== s
)
5397 if (prev
) prev
->next
= curr
->next
;
5398 else messages_received
= curr
->next
;
5400 HeapFree(GetProcessHeap(), 0, curr
);
5402 if (prev
) curr
= prev
->next
;
5403 else curr
= messages_received
;
5414 static int match_event_sequence(SOCKET s
, WSANETWORKEVENTS
*netEvents
, const LPARAM
*seq
)
5416 int event
, index
, error
, events
;
5417 struct async_message
*curr
;
5421 events
= netEvents
->lNetworkEvents
;
5424 event
= WSAGETSELECTEVENT(*seq
);
5425 error
= WSAGETSELECTERROR(*seq
);
5426 get_event_details(event
, &index
, NULL
);
5428 if (!(events
& event
) && index
!= -1)
5430 if (events
& event
&& index
!= -1)
5432 if (netEvents
->iErrorCode
[index
] != error
)
5443 curr
= messages_received
;
5446 if (curr
->socket
== s
)
5448 if (!*seq
) return 0;
5449 if (*seq
!= curr
->lparam
) return 0;
5460 /* checks for a sequence of events, (order only checked if window is used) */
5461 static void ok_event_sequence(SOCKET s
, HANDLE hEvent
, const LPARAM
*seq
, const LPARAM
**broken_seqs
, int completelyBroken
)
5464 WSANETWORKEVENTS events
, *netEvents
= NULL
;
5468 if (hEvent
!= INVALID_HANDLE_VALUE
)
5470 netEvents
= &events
;
5472 dwRet
= WaitForSingleObject(hEvent
, 200);
5473 if (dwRet
== WAIT_OBJECT_0
)
5475 ret
= WSAEnumNetworkEvents(s
, hEvent
, netEvents
);
5478 winetest_ok(0, "WSAEnumNetworkEvents failed, error %d\n", ret
);
5483 memset(netEvents
, 0, sizeof(*netEvents
));
5488 /* Run the message loop a little */
5489 while (PeekMessageA( &msg
, 0, 0, 0, PM_REMOVE
))
5491 DispatchMessageA(&msg
);
5495 if (match_event_sequence(s
, netEvents
, seq
))
5497 winetest_ok(1, "Sequence matches expected: %s\n", dbgstr_event_seq(seq
));
5498 flush_events(s
, hEvent
);
5504 for (; *broken_seqs
; broken_seqs
++)
5506 if (match_event_sequence(s
, netEvents
, *broken_seqs
))
5508 winetest_ok(broken(1), "Sequence matches broken: %s, expected %s\n", dbgstr_event_seq_result(s
, netEvents
), dbgstr_event_seq(seq
));
5509 flush_events(s
, hEvent
);
5515 winetest_ok(broken(completelyBroken
), "Expected event sequence %s, got %s\n", dbgstr_event_seq(seq
),
5516 dbgstr_event_seq_result(s
, netEvents
));
5517 flush_events(s
, hEvent
);
5520 #define ok_event_seq (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : ok_event_sequence
5522 static void test_events(int useMessages
)
5524 SOCKET server
= INVALID_SOCKET
;
5525 SOCKET src
= INVALID_SOCKET
, src2
= INVALID_SOCKET
;
5526 SOCKET dst
= INVALID_SOCKET
, dst2
= INVALID_SOCKET
;
5527 struct sockaddr_in addr
;
5528 HANDLE hThread
= NULL
;
5529 HANDLE hEvent
= INVALID_HANDLE_VALUE
, hEvent2
= INVALID_HANDLE_VALUE
;
5530 WNDCLASSEXA wndclass
;
5532 char *buffer
= NULL
;
5533 int bufferSize
= 1024*1024;
5537 DWORD bytesReturned
;
5543 static char szClassName
[] = "wstestclass";
5544 const LPARAM
*broken_seq
[3];
5545 static const LPARAM empty_seq
[] = { 0 };
5546 static const LPARAM close_seq
[] = { WSAMAKESELECTREPLY(FD_CLOSE
, 0), 0 };
5547 static const LPARAM write_seq
[] = { WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5548 static const LPARAM read_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0), 0 };
5549 static const LPARAM oob_seq
[] = { WSAMAKESELECTREPLY(FD_OOB
, 0), 0 };
5550 static const LPARAM connect_seq
[] = { WSAMAKESELECTREPLY(FD_CONNECT
, 0),
5551 WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5552 static const LPARAM read_read_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5553 WSAMAKESELECTREPLY(FD_READ
, 0), 0 };
5554 static const LPARAM read_write_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5555 WSAMAKESELECTREPLY(FD_WRITE
, 0), 0 };
5556 static const LPARAM read_close_seq
[] = { WSAMAKESELECTREPLY(FD_READ
, 0),
5557 WSAMAKESELECTREPLY(FD_CLOSE
, 0), 0 };
5559 memset(&ov
, 0, sizeof(ov
));
5560 memset(&ov2
, 0, sizeof(ov2
));
5562 /* don't use socketpair, we want connection event */
5563 src
= socket(AF_INET
, SOCK_STREAM
, 0);
5564 if (src
== INVALID_SOCKET
)
5566 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5570 ret
= set_blocking(src
, TRUE
);
5571 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
5573 src2
= socket(AF_INET
, SOCK_STREAM
, 0);
5574 if (src2
== INVALID_SOCKET
)
5576 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5580 ret
= set_blocking(src2
, TRUE
);
5581 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
5584 if (getsockopt(src
, SOL_SOCKET
, SO_OOBINLINE
, (void *)&bret
, &len
) == SOCKET_ERROR
)
5586 ok(0, "failed to get oobinline status, %d\n", GetLastError());
5589 ok(bret
== FALSE
, "OOB not inline\n");
5593 trace("Event test using messages\n");
5595 wndclass
.cbSize
= sizeof(wndclass
);
5596 wndclass
.style
= CS_HREDRAW
| CS_VREDRAW
;
5597 wndclass
.lpfnWndProc
= ws2_test_WndProc
;
5598 wndclass
.cbClsExtra
= 0;
5599 wndclass
.cbWndExtra
= 0;
5600 wndclass
.hInstance
= GetModuleHandleA(NULL
);
5601 wndclass
.hIcon
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
5602 wndclass
.hIconSm
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
5603 wndclass
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_ARROW
);
5604 wndclass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
5605 wndclass
.lpszClassName
= szClassName
;
5606 wndclass
.lpszMenuName
= NULL
;
5607 RegisterClassExA(&wndclass
);
5609 hWnd
= CreateWindowA(szClassName
, "WS2Test", WS_OVERLAPPEDWINDOW
,
5610 0, 0, 500, 500, NULL
, NULL
, GetModuleHandleA(NULL
), NULL
);
5613 ok(0, "failed to create window: %d\n", GetLastError());
5617 ret
= WSAAsyncSelect(src
, hWnd
, WM_SOCKET
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5620 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
5624 ok(set_blocking(src
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5625 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5627 ret
= WSAAsyncSelect(src2
, hWnd
, WM_SOCKET
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5630 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
5634 ok(set_blocking(src2
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5635 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5639 trace("Event test using events\n");
5641 hEvent
= WSACreateEvent();
5642 if (hEvent
== INVALID_HANDLE_VALUE
)
5644 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5648 hEvent2
= WSACreateEvent();
5649 if (hEvent2
== INVALID_HANDLE_VALUE
)
5651 ok(0, "WSACreateEvent failed, error %d\n", GetLastError());
5655 ret
= WSAEventSelect(src
, hEvent
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5658 ok(0, "WSAEventSelect failed, error %d\n", ret
);
5662 ok(set_blocking(src
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5663 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5665 ret
= WSAEventSelect(src2
, hEvent2
, FD_CONNECT
| FD_READ
| FD_OOB
| FD_WRITE
| FD_CLOSE
);
5668 ok(0, "WSAEventSelect failed, error %d\n", ret
);
5672 ok(set_blocking(src2
, TRUE
) == SOCKET_ERROR
, "set_blocking should failed!\n");
5673 ok(WSAGetLastError() == WSAEINVAL
, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
5676 server
= socket(AF_INET
, SOCK_STREAM
, 0);
5677 if (server
== INVALID_SOCKET
)
5679 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5683 memset(&addr
, 0, sizeof(addr
));
5684 addr
.sin_family
= AF_INET
;
5685 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
5686 ret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
5689 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5694 ret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
5697 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5701 ret
= listen(server
, 2);
5704 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5708 ret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
5709 if (ret
== SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK
)
5711 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5715 ret
= connect(src2
, (struct sockaddr
*)&addr
, sizeof(addr
));
5716 if (ret
== SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK
)
5718 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5723 dst
= accept(server
, (struct sockaddr
*)&addr
, &len
);
5724 if (dst
== INVALID_SOCKET
)
5726 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5731 dst2
= accept(server
, (struct sockaddr
*)&addr
, &len
);
5732 if (dst2
== INVALID_SOCKET
)
5734 ok(0, "creating socket pair failed (%d), skipping test\n", GetLastError());
5738 closesocket(server
);
5739 server
= INVALID_SOCKET
;
5741 /* On Windows it seems when a non-blocking socket sends to a
5742 blocking socket on the same host, the send() is BLOCKING,
5743 so make both sockets non-blocking. src is already non-blocking
5744 from the async select */
5746 if (set_blocking(dst
, FALSE
))
5748 ok(0, "ioctlsocket failed, error %d\n", WSAGetLastError());
5752 buffer
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, bufferSize
);
5755 ok(0, "could not allocate memory for test\n");
5759 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5760 if (ov
.hEvent
== NULL
)
5762 ok(0, "could not create event object, errno = %d\n", GetLastError());
5766 ov2
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
5767 if (ov2
.hEvent
== NULL
)
5769 ok(0, "could not create event object, errno = %d\n", GetLastError());
5773 /* FD_WRITE should be set initially, and allow us to send at least 1 byte */
5774 ok_event_seq(src
, hEvent
, connect_seq
, NULL
, 1);
5775 ok_event_seq(src2
, hEvent2
, connect_seq
, NULL
, 1);
5776 /* broken on all windows - FD_CONNECT error is garbage */
5778 /* Test simple send/recv */
5779 SetLastError(0xdeadbeef);
5780 ret
= send(dst
, buffer
, 100, 0);
5781 ok(ret
== 100, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5782 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5783 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5785 SetLastError(0xdeadbeef);
5786 ret
= recv(src
, buffer
, 1, MSG_PEEK
);
5787 ok(ret
== 1, "Failed to peek at recv buffer %d err %d\n", ret
, GetLastError());
5788 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5789 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5791 SetLastError(0xdeadbeef);
5792 ret
= recv(src
, buffer
, 50, 0);
5793 ok(ret
== 50, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5794 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5795 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5797 ret
= recv(src
, buffer
, 50, 0);
5798 ok(ret
== 50, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5799 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5801 /* fun fact - events are re-enabled even on failure, but only for messages */
5802 ret
= send(dst
, "1", 1, 0);
5803 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5804 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5806 ret
= recv(src
, buffer
, -1, 0);
5807 ok(ret
== SOCKET_ERROR
&& (GetLastError() == WSAEFAULT
|| GetLastError() == WSAENOBUFS
),
5808 "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5811 broken_seq
[0] = empty_seq
; /* win9x */
5812 broken_seq
[1] = NULL
;
5813 todo_wine
ok_event_seq(src
, hEvent
, read_seq
, broken_seq
, 0);
5816 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5818 SetLastError(0xdeadbeef);
5819 ret
= recv(src
, buffer
, 1, 0);
5820 ok(ret
== 1, "Failed to recv buffer %d err %d\n", ret
, GetLastError());
5821 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5822 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5824 /* Interaction with overlapped */
5825 bufs
.len
= sizeof(char);
5827 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
5828 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5829 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5831 bufs
.len
= sizeof(char);
5832 bufs
.buf
= buffer
+1;
5833 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov2
, NULL
);
5834 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5835 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5837 ret
= send(dst
, "12", 2, 0);
5838 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5839 broken_seq
[0] = read_read_seq
; /* win9x */
5840 broken_seq
[1] = NULL
;
5841 ok_event_seq(src
, hEvent
, empty_seq
, broken_seq
, 0);
5843 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5844 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5845 if (dwRet
== WAIT_OBJECT_0
)
5847 bret
= GetOverlappedResult((HANDLE
)src
, &ov
, &bytesReturned
, FALSE
);
5848 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5849 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5850 ok(buffer
[0] == '1', "Got %c instead of 1\n", buffer
[0]);
5853 dwRet
= WaitForSingleObject(ov2
.hEvent
, 100);
5854 ok(dwRet
== WAIT_OBJECT_0
, "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5855 if (dwRet
== WAIT_OBJECT_0
)
5857 bret
= GetOverlappedResult((HANDLE
)src
, &ov2
, &bytesReturned
, FALSE
);
5858 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5859 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5860 ok(buffer
[1] == '2', "Got %c instead of 2\n", buffer
[1]);
5863 SetLastError(0xdeadbeef);
5864 ret
= send(dst
, "1", 1, 0);
5865 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5866 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
5867 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5869 ret
= recv(src
, buffer
, 1, 0);
5870 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5871 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5873 /* Notifications are delivered as soon as possible, blocked only on
5874 * async requests on the same type */
5875 bufs
.len
= sizeof(char);
5877 ret
= WSARecv(src
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
5878 ok(ret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
,
5879 "WSARecv failed - %d error %d\n", ret
, GetLastError());
5882 ret
= send(dst
, "1", 1, MSG_OOB
);
5883 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5884 ok_event_seq(src
, hEvent
, oob_seq
, NULL
, 0);
5887 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5888 ok(dwRet
== WAIT_TIMEOUT
, "OOB message activated read?: %d - %d\n", dwRet
, GetLastError());
5890 ret
= send(dst
, "2", 1, 0);
5891 ok(ret
== 1, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5892 broken_seq
[0] = read_seq
; /* win98 */
5893 broken_seq
[1] = NULL
;
5894 ok_event_seq(src
, hEvent
, empty_seq
, broken_seq
, 0);
5896 dwRet
= WaitForSingleObject(ov
.hEvent
, 100);
5897 ok(dwRet
== WAIT_OBJECT_0
|| broken(dwRet
== WAIT_TIMEOUT
),
5898 "Failed to wait for recv message: %d - %d\n", dwRet
, GetLastError());
5899 if (dwRet
== WAIT_OBJECT_0
)
5901 bret
= GetOverlappedResult((HANDLE
)src
, &ov
, &bytesReturned
, FALSE
);
5902 ok((bret
&& bytesReturned
== 1) || broken(!bret
&& GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */,
5903 "Got %d instead of 1 (%d - %d)\n", bytesReturned
, bret
, GetLastError());
5904 ok(buffer
[0] == '2', "Got %c instead of 2\n", buffer
[0]);
5906 else if (dwRet
== WAIT_TIMEOUT
)
5908 /* this happens on win98. We get an FD_READ later on the next test */
5909 CancelIo((HANDLE
) src
);
5913 ret
= recv(src
, buffer
, 1, MSG_OOB
);
5914 todo_wine
ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5915 /* We get OOB notification, but no data on wine */
5916 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5919 /* Flood the send queue */
5920 hThread
= CreateThread(NULL
, 0, drain_socket_thread
, &dst
, 0, &id
);
5921 if (hThread
== NULL
)
5923 ok(0, "CreateThread failed, error %d\n", GetLastError());
5927 /* Now FD_WRITE should not be set, because the socket send buffer isn't full yet */
5928 ok_event_seq(src
, hEvent
, empty_seq
, NULL
, 0);
5930 /* Now if we send a ton of data and the 'server' does not drain it fast
5931 * enough (set drain_pause to be sure), the socket send buffer will only
5932 * take some of it, and we will get a short write. This will trigger
5933 * another FD_WRITE event as soon as data is sent and more space becomes
5934 * available, but not any earlier. */
5938 ret
= send(src
, buffer
, bufferSize
, 0);
5939 } while (ret
== bufferSize
);
5940 drain_pause
= FALSE
;
5941 if (ret
>= 0 || WSAGetLastError() == WSAEWOULDBLOCK
)
5943 Sleep(400); /* win9x */
5944 broken_seq
[0] = read_write_seq
;
5945 broken_seq
[1] = NULL
;
5946 ok_event_seq(src
, hEvent
, write_seq
, broken_seq
, 0);
5950 ok(0, "sending a lot of data failed with error %d\n", WSAGetLastError());
5953 /* Test how FD_CLOSE is handled */
5954 ret
= send(dst
, "12", 2, 0);
5955 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5957 /* Wait a little and let the send complete */
5960 dst
= INVALID_SOCKET
;
5963 /* We can never implement this in wine, best we can hope for is
5964 sending FD_CLOSE after the reads complete */
5965 broken_seq
[0] = read_seq
; /* win9x */
5966 broken_seq
[1] = NULL
;
5967 todo_wine
ok_event_seq(src
, hEvent
, read_close_seq
, broken_seq
, 0);
5969 ret
= recv(src
, buffer
, 1, 0);
5970 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5971 ok_event_seq(src
, hEvent
, read_seq
, NULL
, 0);
5973 ret
= recv(src
, buffer
, 1, 0);
5974 ok(ret
== 1, "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5975 /* want it? it's here, but you can't have it */
5976 broken_seq
[0] = close_seq
; /* win9x */
5977 broken_seq
[1] = NULL
;
5978 todo_wine
ok_event_seq(src
, hEvent
, empty_seq
, /* wine sends FD_CLOSE here */
5981 /* Test how FD_CLOSE is handled */
5982 ret
= send(dst2
, "12", 2, 0);
5983 ok(ret
== 2, "Failed to send buffer %d err %d\n", ret
, GetLastError());
5986 shutdown(dst2
, SD_SEND
);
5989 /* Some of the below are technically todo_wine, but our event sequence is still valid, so to prevent
5990 regressions, don't mark them as todo_wine, and mark windows as broken */
5991 broken_seq
[0] = read_close_seq
;
5992 broken_seq
[1] = close_seq
;
5993 broken_seq
[2] = NULL
;
5994 ok_event_seq(src2
, hEvent2
, read_seq
, broken_seq
, 0);
5996 ret
= recv(src2
, buffer
, 1, 0);
5997 ok(ret
== 1 || broken(!ret
), "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
5998 broken_seq
[0] = close_seq
; /* win98 */
5999 broken_seq
[1] = NULL
;
6000 ok_event_seq(src2
, hEvent2
, read_seq
, broken_seq
, 0);
6002 ret
= recv(src2
, buffer
, 1, 0);
6003 ok(ret
== 1 || broken(!ret
), "Failed to empty buffer: %d - %d\n", ret
, GetLastError());
6004 broken_seq
[0] = empty_seq
;
6005 broken_seq
[1] = NULL
;
6006 ok_event_seq(src2
, hEvent2
, close_seq
, broken_seq
, 0);
6008 ret
= send(src2
, "1", 1, 0);
6009 ok(ret
== 1, "Sending to half-closed socket failed %d err %d\n", ret
, GetLastError());
6010 ok_event_seq(src2
, hEvent2
, empty_seq
, NULL
, 0);
6012 ret
= send(src2
, "1", 1, 0);
6013 ok(ret
== 1, "Sending to half-closed socket failed %d err %d\n", ret
, GetLastError());
6014 ok_event_seq(src2
, hEvent2
, empty_seq
, NULL
, 0);
6018 ret
= WSAAsyncSelect(src
, hWnd
, WM_SOCKET
, 0);
6021 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6025 ret
= set_blocking(src
, TRUE
);
6026 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6028 ret
= WSAAsyncSelect(src2
, hWnd
, WM_SOCKET
, 0);
6031 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6035 ret
= set_blocking(src2
, TRUE
);
6036 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6040 ret
= WSAEventSelect(src
, hEvent2
, 0);
6043 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6047 ret
= set_blocking(src
, TRUE
);
6048 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6050 ret
= WSAEventSelect(src2
, hEvent2
, 0);
6053 ok(0, "WSAAsyncSelect failed, error %d\n", ret
);
6057 ret
= set_blocking(src2
, TRUE
);
6058 ok(!ret
, "set_blocking failed, error %d\n", WSAGetLastError());
6062 if (src
!= INVALID_SOCKET
)
6064 flush_events(src
, hEvent
);
6067 if (src2
!= INVALID_SOCKET
)
6069 flush_events(src2
, hEvent2
);
6072 HeapFree(GetProcessHeap(), 0, buffer
);
6073 if (server
!= INVALID_SOCKET
)
6074 closesocket(server
);
6075 if (dst
!= INVALID_SOCKET
)
6077 if (dst2
!= INVALID_SOCKET
)
6079 if (hThread
!= NULL
)
6080 CloseHandle(hThread
);
6082 DestroyWindow(hWnd
);
6084 CloseHandle(hEvent
);
6085 if (hEvent2
!= NULL
)
6086 CloseHandle(hEvent2
);
6087 if (ov
.hEvent
!= NULL
)
6088 CloseHandle(ov
.hEvent
);
6089 if (ov2
.hEvent
!= NULL
)
6090 CloseHandle(ov2
.hEvent
);
6093 static void test_ipv6only(void)
6095 SOCKET v4
= INVALID_SOCKET
,
6096 v6
= INVALID_SOCKET
;
6097 struct sockaddr_in sin4
;
6098 struct sockaddr_in6 sin6
;
6101 memset(&sin4
, 0, sizeof(sin4
));
6102 sin4
.sin_family
= AF_INET
;
6103 sin4
.sin_port
= htons(SERVERPORT
);
6105 memset(&sin6
, 0, sizeof(sin6
));
6106 sin6
.sin6_family
= AF_INET6
;
6107 sin6
.sin6_port
= htons(SERVERPORT
);
6109 v6
= socket(AF_INET6
, SOCK_STREAM
, IPPROTO_TCP
);
6110 if (v6
== INVALID_SOCKET
) {
6111 skip("Could not create IPv6 socket (LastError: %d; %d expected if IPv6 not available).\n",
6112 WSAGetLastError(), WSAEAFNOSUPPORT
);
6115 ret
= bind(v6
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
6117 skip("Could not bind IPv6 address (LastError: %d).\n",
6122 v4
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
6123 if (v4
== INVALID_SOCKET
) {
6124 skip("Could not create IPv4 socket (LastError: %d).\n",
6128 ret
= bind(v4
, (struct sockaddr
*)&sin4
, sizeof(sin4
));
6129 ok(!ret
, "Could not bind IPv4 address (LastError: %d; %d expected if IPv6 binds to IPv4 as well).\n",
6130 WSAGetLastError(), WSAEADDRINUSE
);
6133 if (v4
!= INVALID_SOCKET
)
6135 if (v6
!= INVALID_SOCKET
)
6139 static void test_WSASendMsg(void)
6142 struct sockaddr_in sendaddr
, sockaddr
;
6143 GUID WSASendMsg_GUID
= WSAID_WSASENDMSG
;
6144 LPFN_WSASENDMSG pWSASendMsg
= NULL
;
6145 char teststr
[12] = "hello world", buffer
[32];
6148 DWORD bytesSent
, err
;
6151 /* FIXME: Missing OVERLAPPED and OVERLAPPED COMPLETION ROUTINE tests */
6153 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6154 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6156 /* Obtain the WSASendMsg function */
6157 WSAIoctl(sock
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &WSASendMsg_GUID
, sizeof(WSASendMsg_GUID
),
6158 &pWSASendMsg
, sizeof(pWSASendMsg
), &err
, NULL
, NULL
);
6162 win_skip("WSASendMsg is unsupported, some tests will be skipped.\n");
6166 /* fake address for now */
6167 sendaddr
.sin_family
= AF_INET
;
6168 sendaddr
.sin_port
= htons(139);
6169 sendaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6171 memset(&msg
, 0, sizeof(msg
));
6172 iovec
[0].buf
= teststr
;
6173 iovec
[0].len
= sizeof(teststr
);
6174 iovec
[1].buf
= teststr
;
6175 iovec
[1].len
= sizeof(teststr
) / 2;
6176 msg
.name
= (struct sockaddr
*) &sendaddr
;
6177 msg
.namelen
= sizeof(sendaddr
);
6178 msg
.lpBuffers
= iovec
;
6179 msg
.dwBufferCount
= 1; /* send only one buffer for now */
6181 WSASetLastError(0xdeadbeef);
6182 ret
= pWSASendMsg(INVALID_SOCKET
, &msg
, 0, NULL
, NULL
, NULL
);
6183 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6184 err
= WSAGetLastError();
6185 ok(err
== WSAENOTSOCK
, "expected 10038, got %d instead\n", err
);
6187 WSASetLastError(0xdeadbeef);
6188 ret
= pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
);
6189 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6190 err
= WSAGetLastError();
6191 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6193 WSASetLastError(0xdeadbeef);
6194 ret
= pWSASendMsg(sock
, NULL
, 0, &bytesSent
, NULL
, NULL
);
6195 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6196 err
= WSAGetLastError();
6197 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6199 WSASetLastError(0xdeadbeef);
6200 ret
= pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
);
6201 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6202 err
= WSAGetLastError();
6203 ok(err
== WSAEFAULT
, "expected 10014, got %d instead\n", err
);
6207 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6208 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6210 dst
= socket(AF_INET
, SOCK_DGRAM
, 0);
6211 ok(dst
!= INVALID_SOCKET
, "socket() failed\n");
6213 memset(&sockaddr
, 0, sizeof(sockaddr
));
6214 sockaddr
.sin_family
= AF_INET
;
6215 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6216 ok(!bind(dst
, (struct sockaddr
*)&sockaddr
, sizeof(sockaddr
)),
6217 "bind should have worked\n");
6219 /* read address to find out the port number to be used in send */
6220 memset(&sendaddr
, 0, sizeof(sendaddr
));
6221 addrlen
= sizeof(sendaddr
);
6222 ok(!getsockname(dst
, (struct sockaddr
*) &sendaddr
, &addrlen
),
6223 "getsockname should have worked\n");
6224 ok(sendaddr
.sin_port
, "socket port should be != 0\n");
6226 /* ensure the sending socket is not bound */
6227 WSASetLastError(0xdeadbeef);
6228 addrlen
= sizeof(sockaddr
);
6229 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
6230 ok(ret
== SOCKET_ERROR
, "getsockname should have failed\n");
6231 err
= WSAGetLastError();
6232 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
6234 set_blocking(sock
, TRUE
);
6237 SetLastError(0xdeadbeef);
6238 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6239 ok(!ret
, "WSASendMsg should have worked\n");
6240 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6241 "Expected 0, got %d\n", GetLastError());
6242 ok(bytesSent
== iovec
[0].len
, "incorret bytes sent, expected %d, sent %d\n",
6243 iovec
[0].len
, bytesSent
);
6246 addrlen
= sizeof(sockaddr
);
6247 memset(buffer
, 0, sizeof(buffer
));
6248 SetLastError(0xdeadbeef);
6249 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
6250 ok(ret
== bytesSent
, "got %d, expected %d\n",
6252 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6254 /* A successful call to WSASendMsg must have bound the socket */
6255 addrlen
= sizeof(sockaddr
);
6256 sockaddr
.sin_port
= 0;
6257 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6258 ret
= getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
);
6259 ok(!ret
, "getsockname should have worked\n");
6260 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
6261 inet_ntoa(sockaddr
.sin_addr
));
6262 ok(sockaddr
.sin_port
, "sin_port should be != 0\n");
6264 msg
.dwBufferCount
= 2; /* send both buffers */
6267 SetLastError(0xdeadbeef);
6268 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6269 ok(!ret
, "WSASendMsg should have worked\n");
6270 ok(bytesSent
== iovec
[0].len
+ iovec
[1].len
, "incorret bytes sent, expected %d, sent %d\n",
6271 iovec
[0].len
+ iovec
[1].len
, bytesSent
);
6272 ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
6273 "Expected 0, got %d\n", GetLastError());
6276 addrlen
= sizeof(sockaddr
);
6277 memset(buffer
, 0, sizeof(buffer
));
6278 SetLastError(0xdeadbeef);
6279 ret
= recvfrom(dst
, buffer
, sizeof(buffer
), 0, (struct sockaddr
*) &sockaddr
, &addrlen
);
6280 ok(ret
== bytesSent
, "got %d, expected %d\n",
6282 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6287 /* a bad call to WSASendMsg will also bind the socket */
6288 addrlen
= sizeof(sockaddr
);
6289 sockaddr
.sin_port
= 0;
6290 sockaddr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6291 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6292 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6293 ok(pWSASendMsg(sock
, &msg
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
6295 ok(!getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have worked\n");
6296 ok(sockaddr
.sin_addr
.s_addr
== htonl(INADDR_ANY
), "expected 0.0.0.0, got %s\n",
6297 inet_ntoa(sockaddr
.sin_addr
));
6298 ok(sockaddr
.sin_port
, "sin_port should be > 0\n");
6302 /* a bad call without msg parameter will not trigger the auto-bind */
6303 sock
= socket(AF_INET
, SOCK_DGRAM
, 0);
6304 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6305 ok(pWSASendMsg(sock
, NULL
, 0, NULL
, NULL
, NULL
) == SOCKET_ERROR
, "WSASendMsg should have failed\n");
6306 ok(getsockname(sock
, (struct sockaddr
*)&sockaddr
, &addrlen
), "getsockname should have failed\n");
6307 err
= WSAGetLastError();
6308 ok(err
== WSAEINVAL
, "expected 10022, got %d instead\n", err
);
6311 /* SOCK_STREAM sockets are not supported */
6313 sock
= socket(AF_INET
, SOCK_STREAM
, 0);
6314 ok(sock
!= INVALID_SOCKET
, "socket() failed\n");
6315 SetLastError(0xdeadbeef);
6316 ret
= pWSASendMsg(sock
, &msg
, 0, &bytesSent
, NULL
, NULL
);
6317 ok(ret
== SOCKET_ERROR
, "WSASendMsg should have failed\n");
6318 err
= WSAGetLastError();
6320 ok(err
== WSAEINVAL
, "expected 10014, got %d instead\n", err
);
6324 static void test_WSASendTo(void)
6327 struct sockaddr_in addr
;
6328 char buf
[12] = "hello world";
6333 addr
.sin_family
= AF_INET
;
6334 addr
.sin_port
= htons(139);
6335 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6336 data_buf
.len
= sizeof(buf
);
6339 if( (s
= socket(AF_INET
, SOCK_DGRAM
, 0)) == INVALID_SOCKET
) {
6340 ok(0, "socket() failed error: %d\n", WSAGetLastError());
6344 WSASetLastError(12345);
6345 ret
= WSASendTo(INVALID_SOCKET
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
6346 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAENOTSOCK
,
6347 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
6349 WSASetLastError(12345);
6350 ret
= WSASendTo(s
, &data_buf
, 1, NULL
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
);
6351 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
6352 "WSASendTo() failed: %d/%d\n", ret
, WSAGetLastError());
6354 WSASetLastError(12345);
6355 if(WSASendTo(s
, &data_buf
, 1, &bytesSent
, 0, (struct sockaddr
*)&addr
, sizeof(addr
), NULL
, NULL
)) {
6356 ok(0, "WSASendTo() failed error: %d\n", WSAGetLastError());
6359 ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
6360 "a successful call to WSASendTo()\n");
6363 static DWORD WINAPI
recv_thread(LPVOID arg
)
6365 SOCKET sock
= *(SOCKET
*)arg
;
6372 wsa
.len
= sizeof(buffer
);
6373 ov
.hEvent
= WSACreateEvent();
6374 WSARecv(sock
, &wsa
, 1, NULL
, &flags
, &ov
, NULL
);
6376 WaitForSingleObject(ov
.hEvent
, 1000);
6377 WSACloseEvent(ov
.hEvent
);
6381 static void test_WSARecv(void)
6383 SOCKET src
, dest
, server
= INVALID_SOCKET
;
6387 DWORD bytesReturned
, flags
, id
;
6389 struct sockaddr_in addr
;
6395 tcp_socketpair(&src
, &dest
);
6396 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
6398 skip("failed to create sockets\n");
6402 memset(&ov
, 0, sizeof(ov
));
6407 /* Send 4 bytes and receive in two calls of 2 */
6408 SetLastError(0xdeadbeef);
6409 iret
= send(src
, "test", 4, 0);
6410 ok(iret
== 4, "Expected 4, got %d\n", iret
);
6411 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6412 SetLastError(0xdeadbeef);
6413 bytesReturned
= 0xdeadbeef;
6414 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6415 ok(!iret
, "Expected 0, got %d\n", iret
);
6416 ok(bytesReturned
, "Expected 2, got %d\n", bytesReturned
);
6417 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6418 SetLastError(0xdeadbeef);
6419 bytesReturned
= 0xdeadbeef;
6420 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6421 ok(!iret
, "Expected 0, got %d\n", iret
);
6422 ok(bytesReturned
, "Expected 2, got %d\n", bytesReturned
);
6423 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6426 SetLastError(0xdeadbeef);
6427 iret
= send(src
, "test", 4, 0);
6428 ok(iret
== 4, "Expected 4, got %d\n", iret
);
6429 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6430 SetLastError(0xdeadbeef);
6431 bytesReturned
= 0xdeadbeef;
6432 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, NULL
, NULL
);
6433 ok(!iret
, "Expected 0, got %d\n", iret
);
6434 ok(bytesReturned
, "Expected 4, got %d\n", bytesReturned
);
6435 ok(GetLastError() == ERROR_SUCCESS
, "Expected 0, got %d\n", GetLastError());
6437 bufs
.len
= sizeof(buf
);
6439 ov
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
6440 ok(ov
.hEvent
!= NULL
, "could not create event object, errno = %d\n", GetLastError());
6446 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
6447 ok(!iret
, "Failed to set linger %d\n", GetLastError());
6449 iret
= WSARecv(dest
, &bufs
, 1, NULL
, &flags
, &ov
, NULL
);
6450 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6452 iret
= WSARecv(dest
, &bufs
, 1, &bytesReturned
, &flags
, &ov
, NULL
);
6453 ok(iret
== SOCKET_ERROR
&& GetLastError() == ERROR_IO_PENDING
, "WSARecv failed - %d error %d\n", iret
, GetLastError());
6456 src
= INVALID_SOCKET
;
6458 dwret
= WaitForSingleObject(ov
.hEvent
, 1000);
6459 ok(dwret
== WAIT_OBJECT_0
, "Waiting for disconnect event failed with %d + errno %d\n", dwret
, GetLastError());
6461 bret
= GetOverlappedResult((HANDLE
)dest
, &ov
, &bytesReturned
, FALSE
);
6462 todo_wine
ok(!bret
&& (GetLastError() == ERROR_NETNAME_DELETED
|| broken(GetLastError() == ERROR_IO_INCOMPLETE
) /* win9x */),
6463 "Did not get disconnect event: %d, error %d\n", bret
, GetLastError());
6464 ok(bytesReturned
== 0, "Bytes received is %d\n", bytesReturned
);
6466 dest
= INVALID_SOCKET
;
6468 src
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, 0);
6469 ok(src
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6470 if (src
== INVALID_SOCKET
) goto end
;
6472 server
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
6473 ok(server
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6474 if (server
== INVALID_SOCKET
) goto end
;
6476 memset(&addr
, 0, sizeof(addr
));
6477 addr
.sin_family
= AF_INET
;
6478 addr
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6479 iret
= bind(server
, (struct sockaddr
*)&addr
, sizeof(addr
));
6483 iret
= getsockname(server
, (struct sockaddr
*)&addr
, &len
);
6486 iret
= listen(server
, 1);
6489 iret
= connect(src
, (struct sockaddr
*)&addr
, sizeof(addr
));
6493 dest
= accept(server
, (struct sockaddr
*)&addr
, &len
);
6494 ok(dest
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError());
6495 if (dest
== INVALID_SOCKET
) goto end
;
6497 send(src
, "test message", sizeof("test message"), 0);
6498 thread
= CreateThread(NULL
, 0, recv_thread
, &dest
, 0, &id
);
6499 WaitForSingleObject(thread
, 3000);
6500 CloseHandle(thread
);
6503 if (server
!= INVALID_SOCKET
)
6504 closesocket(server
);
6505 if (dest
!= INVALID_SOCKET
)
6507 if (src
!= INVALID_SOCKET
)
6510 WSACloseEvent(ov
.hEvent
);
6513 #define POLL_CLEAR() ix = 0
6514 #define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;}
6515 #define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
6516 static BOOL
poll_isset(WSAPOLLFD
*fds
, int max
, SOCKET s
, int rev
)
6519 for (k
= 0; k
< max
; k
++)
6520 if (fds
[k
].fd
== s
&& (fds
[k
].revents
== rev
)) return TRUE
;
6524 static void test_WSAPoll(void)
6526 int ix
, ret
, err
, poll_timeout
;
6527 SOCKET fdListen
, fdRead
, fdWrite
;
6528 struct sockaddr_in address
;
6530 static char tmp_buf
[1024];
6532 HANDLE thread_handle
;
6535 if (!pWSAPoll
) /* >= Vista */
6537 skip("WSAPoll is unsupported, some tests will be skipped.\n");
6541 /* Invalid parameters test */
6542 SetLastError(0xdeadbeef);
6543 ret
= pWSAPoll(NULL
, 0, 0);
6544 err
= GetLastError();
6545 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6546 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6547 SetLastError(0xdeadbeef);
6548 ret
= pWSAPoll(NULL
, 1, 0);
6549 err
= GetLastError();
6550 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6551 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6552 SetLastError(0xdeadbeef);
6553 ret
= pWSAPoll(NULL
, 0, 1);
6554 err
= GetLastError();
6555 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6556 ok(err
== WSAEINVAL
, "expected 10022, got %d\n", err
);
6557 SetLastError(0xdeadbeef);
6558 ret
= pWSAPoll(NULL
, 1, 1);
6559 err
= GetLastError();
6560 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6561 ok(err
== WSAEFAULT
, "expected 10014, got %d\n", err
);
6563 /* WSAPoll() tries to mime the unix poll() call. The following tests do:
6564 * - check if a connection attempt ended with success or error;
6565 * - check if a pending connection is waiting for acceptance;
6566 * - check for data to read, availability for write and OOB data
6568 memset(&address
, 0, sizeof(address
));
6569 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
6570 address
.sin_family
= AF_INET
;
6571 len
= sizeof(address
);
6572 fdListen
= setup_server_socket(&address
, &len
);
6575 /* When no events are pending poll returns 0 with no error */
6577 POLL_SET(fdListen
, POLLIN
);
6578 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6579 ok(ret
== 0, "expected 0, got %d\n", ret
);
6581 /* Test listening socket connection attempt notifications */
6582 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
6584 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6585 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6586 ok(ret
== 1, "expected 1, got %d\n", ret
);
6587 ok(POLL_ISSET(fdListen
, POLLRDNORM
), "fdListen socket events incorrect\n");
6588 len
= sizeof(address
);
6589 fdRead
= accept(fdListen
, (struct sockaddr
*) &address
, &len
);
6590 ok(fdRead
!= INVALID_SOCKET
, "expected a valid socket\n");
6592 /* Test client side connection attempt notifications */
6594 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6595 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6596 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6597 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6598 ok(ret
== 2, "expected 2, got %d\n", ret
);
6599 ok(POLL_ISSET(fdWrite
, POLLWRNORM
), "fdWrite socket events incorrect\n");
6600 ok(POLL_ISSET(fdRead
, POLLWRNORM
), "fdRead socket events incorrect\n");
6603 err
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
6604 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
6605 ok(id
== 0, "expected 0, got %d\n", id
);
6607 /* Test data receiving notifications */
6608 ret
= send(fdWrite
, "1234", 4, 0);
6609 ok(ret
== 4, "expected 4, got %d\n", ret
);
6611 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6612 POLL_SET(fdRead
, POLLIN
);
6613 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6614 ok(ret
== 1, "expected 1, got %d\n", ret
);
6615 ok(POLL_ISSET(fdRead
, POLLRDNORM
), "fdRead socket events incorrect\n");
6616 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
6617 ok(ret
== 4, "expected 4, got %d\n", ret
);
6618 ok(!strcmp(tmp_buf
, "1234"), "data received differs from sent\n");
6620 /* Test OOB data notifications */
6621 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
6622 ok(ret
== 1, "expected 1, got %d\n", ret
);
6624 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6625 POLL_SET(fdRead
, POLLIN
);
6626 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6627 ok(ret
== 1, "expected 1, got %d\n", ret
);
6628 ok(POLL_ISSET(fdRead
, POLLRDBAND
), "fdRead socket events incorrect\n");
6630 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
6631 ok(ret
== 1, "expected 1, got %d\n", ret
);
6632 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
6634 /* If the socket is OOBINLINED the notification is like normal data */
6636 ret
= setsockopt(fdRead
, SOL_SOCKET
, SO_OOBINLINE
, (char*) &ret
, sizeof(ret
));
6637 ok(ret
== 0, "expected 0, got %d\n", ret
);
6638 ret
= send(fdWrite
, "A", 1, MSG_OOB
);
6639 ok(ret
== 1, "expected 1, got %d\n", ret
);
6641 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6642 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6643 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6644 ok(ret
== 1, "expected 1, got %d\n", ret
);
6646 SetLastError(0xdeadbeef);
6647 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), MSG_OOB
);
6648 ok(ret
== SOCKET_ERROR
, "expected -1, got %d\n", ret
);
6649 ok(GetLastError() == WSAEINVAL
, "expected 10022, got %d\n", GetLastError());
6650 ret
= recv(fdRead
, tmp_buf
, sizeof(tmp_buf
), 0);
6651 ok(ret
== 1, "expected 1, got %d\n", ret
);
6652 ok(tmp_buf
[0] == 'A', "expected 'A', got 0x%02X\n", tmp_buf
[0]);
6654 /* Test connection closed notifications */
6655 ret
= closesocket(fdRead
);
6656 ok(ret
== 0, "expected 0, got %d\n", ret
);
6658 POLL_SET(fdListen
, POLLIN
| POLLOUT
);
6659 POLL_SET(fdWrite
, POLLIN
);
6660 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6661 ok(ret
== 1, "expected 1, got %d\n", ret
);
6663 ok(POLL_ISSET(fdWrite
, POLLHUP
), "fdWrite socket events incorrect\n");
6664 ret
= recv(fdWrite
, tmp_buf
, sizeof(tmp_buf
), 0);
6665 ok(ret
== 0, "expected 0, got %d\n", ret
);
6667 /* When a connection is attempted to a non-listening socket due to a bug
6668 * in the MS code it will never be notified. This is a long standing issue
6669 * that will never be fixed for compatibility reasons so we have to deal
6670 * with it manually. */
6671 ret
= closesocket(fdWrite
);
6672 ok(ret
== 0, "expected 0, got %d\n", ret
);
6673 ret
= closesocket(fdListen
);
6674 ok(ret
== 0, "expected 0, got %d\n", ret
);
6675 len
= sizeof(address
);
6676 fdWrite
= setup_connector_socket(&address
, len
, TRUE
);
6678 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6679 poll_timeout
= 2000;
6680 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6682 ok(ret
== 0, "expected 0, got %d\n", ret
);
6685 err
= getsockopt(fdWrite
, SOL_SOCKET
, SO_ERROR
, (char*)&id
, &len
);
6686 ok(!err
, "getsockopt failed with %d\n", WSAGetLastError());
6687 ok(id
== WSAECONNREFUSED
, "expected 10061, got %d\n", id
);
6688 closesocket(fdWrite
);
6690 /* Try poll() on a closed socket after connection */
6691 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6692 closesocket(fdRead
);
6694 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6695 POLL_SET(fdRead
, POLLIN
| POLLOUT
);
6696 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6697 ok(ret
== 1, "expected 1, got %d\n", ret
);
6698 ok(POLL_ISSET(fdRead
, POLLNVAL
), "fdRead socket events incorrect\n");
6700 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6701 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6702 ok(ret
== 1, "expected 1, got %d\n", ret
);
6704 ok(POLL_ISSET(fdWrite
, POLLWRNORM
| POLLHUP
) || broken(POLL_ISSET(fdWrite
, POLLWRNORM
)) /* <= 2008 */,
6705 "fdWrite socket events incorrect\n");
6706 closesocket(fdWrite
);
6708 /* Close the socket currently being polled in a thread */
6709 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6710 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
6711 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
6713 POLL_SET(fdWrite
, POLLIN
| POLLOUT
);
6714 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6715 ok(ret
== 1, "expected 1, got %d\n", ret
);
6716 ok(POLL_ISSET(fdWrite
, POLLWRNORM
), "fdWrite socket events incorrect\n");
6717 WaitForSingleObject (thread_handle
, 1000);
6718 closesocket(fdRead
);
6719 /* test again with less flags - behavior changes */
6720 ok(!tcp_socketpair(&fdRead
, &fdWrite
), "creating socket pair failed\n");
6721 thread_handle
= CreateThread(NULL
, 0, SelectCloseThread
, &fdWrite
, 0, &id
);
6722 ok(thread_handle
!= NULL
, "CreateThread failed unexpectedly: %d\n", GetLastError());
6724 POLL_SET(fdWrite
, POLLIN
);
6725 ret
= pWSAPoll(fds
, ix
, poll_timeout
);
6726 ok(ret
== 1, "expected 1, got %d\n", ret
);
6728 ok(POLL_ISSET(fdWrite
, POLLNVAL
), "fdWrite socket events incorrect\n");
6729 WaitForSingleObject (thread_handle
, 1000);
6730 closesocket(fdRead
);
6736 static void test_GetAddrInfoW(void)
6738 static const WCHAR port
[] = {'8','0',0};
6739 static const WCHAR empty
[] = {0};
6740 static const WCHAR localhost
[] = {'l','o','c','a','l','h','o','s','t',0};
6741 static const WCHAR nxdomain
[] =
6742 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
6743 static const WCHAR zero
[] = {'0',0};
6745 ADDRINFOW
*result
, *result2
, *p
, hint
;
6747 DWORD size
= sizeof(name
)/sizeof(WCHAR
);
6749 if (!pGetAddrInfoW
|| !pFreeAddrInfoW
)
6751 win_skip("GetAddrInfoW and/or FreeAddrInfoW not present\n");
6754 memset(&hint
, 0, sizeof(ADDRINFOW
));
6756 GetComputerNameExW( ComputerNamePhysicalDnsHostname
, name
, &size
);
6758 result
= (ADDRINFOW
*)0xdeadbeef;
6759 WSASetLastError(0xdeadbeef);
6760 ret
= pGetAddrInfoW(NULL
, NULL
, NULL
, &result
);
6761 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6762 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6763 ok(result
== NULL
, "got %p\n", result
);
6766 WSASetLastError(0xdeadbeef);
6767 ret
= pGetAddrInfoW(empty
, NULL
, NULL
, &result
);
6768 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6769 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6770 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6771 pFreeAddrInfoW(result
);
6774 ret
= pGetAddrInfoW(NULL
, zero
, NULL
, &result
);
6775 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6776 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6779 ret
= pGetAddrInfoW(NULL
, empty
, NULL
, &result2
);
6780 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6781 ok(result2
!= NULL
, "GetAddrInfoW failed\n");
6782 compare_addrinfow(result
, result2
);
6783 pFreeAddrInfoW(result
);
6784 pFreeAddrInfoW(result2
);
6787 ret
= pGetAddrInfoW(empty
, zero
, NULL
, &result
);
6788 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6789 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6790 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6793 ret
= pGetAddrInfoW(empty
, empty
, NULL
, &result2
);
6794 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6795 ok(result2
!= NULL
, "GetAddrInfoW failed\n");
6796 compare_addrinfow(result
, result2
);
6797 pFreeAddrInfoW(result
);
6798 pFreeAddrInfoW(result2
);
6801 ret
= pGetAddrInfoW(localhost
, NULL
, NULL
, &result
);
6802 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6803 pFreeAddrInfoW(result
);
6806 ret
= pGetAddrInfoW(localhost
, empty
, NULL
, &result
);
6807 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6808 pFreeAddrInfoW(result
);
6811 ret
= pGetAddrInfoW(localhost
, zero
, NULL
, &result
);
6812 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6813 pFreeAddrInfoW(result
);
6816 ret
= pGetAddrInfoW(localhost
, port
, NULL
, &result
);
6817 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6818 pFreeAddrInfoW(result
);
6821 ret
= pGetAddrInfoW(localhost
, NULL
, &hint
, &result
);
6822 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6823 pFreeAddrInfoW(result
);
6826 SetLastError(0xdeadbeef);
6827 ret
= pGetAddrInfoW(localhost
, port
, &hint
, &result
);
6828 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6829 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6830 pFreeAddrInfoW(result
);
6832 /* try to get information from the computer name, result is the same
6833 * as if requesting with an empty host name. */
6834 ret
= pGetAddrInfoW(name
, NULL
, NULL
, &result
);
6835 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6836 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6838 ret
= pGetAddrInfoW(empty
, NULL
, NULL
, &result2
);
6839 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6840 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6841 compare_addrinfow(result
, result2
);
6842 pFreeAddrInfoW(result
);
6843 pFreeAddrInfoW(result2
);
6845 ret
= pGetAddrInfoW(name
, empty
, NULL
, &result
);
6846 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6847 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6849 ret
= pGetAddrInfoW(empty
, empty
, NULL
, &result2
);
6850 ok(!ret
, "GetAddrInfoW failed with %d\n", WSAGetLastError());
6851 ok(result
!= NULL
, "GetAddrInfoW failed\n");
6852 compare_addrinfow(result
, result2
);
6853 pFreeAddrInfoW(result
);
6854 pFreeAddrInfoW(result2
);
6856 result
= (ADDRINFOW
*)0xdeadbeef;
6857 WSASetLastError(0xdeadbeef);
6858 ret
= pGetAddrInfoW(NULL
, NULL
, NULL
, &result
);
6861 skip("nxdomain returned success. Broken ISP redirects?\n");
6864 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6865 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6866 ok(result
== NULL
, "got %p\n", result
);
6868 result
= (ADDRINFOW
*)0xdeadbeef;
6869 WSASetLastError(0xdeadbeef);
6870 ret
= pGetAddrInfoW(nxdomain
, NULL
, NULL
, &result
);
6873 skip("nxdomain returned success. Broken ISP redirects?\n");
6876 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6877 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6878 ok(result
== NULL
, "got %p\n", result
);
6880 for (i
= 0;i
< (sizeof(hinttests
) / sizeof(hinttests
[0]));i
++)
6882 hint
.ai_family
= hinttests
[i
].family
;
6883 hint
.ai_socktype
= hinttests
[i
].socktype
;
6884 hint
.ai_protocol
= hinttests
[i
].protocol
;
6887 SetLastError(0xdeadbeef);
6888 ret
= pGetAddrInfoW(localhost
, NULL
, &hint
, &result
);
6891 if (hinttests
[i
].error
)
6892 ok(0, "test %d: GetAddrInfoW succeeded unexpectedly\n", i
);
6898 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
6899 if (hinttests
[i
].family
== AF_UNSPEC
)
6900 ok(p
->ai_family
== AF_INET
|| p
->ai_family
== AF_INET6
,
6901 "test %d: expected AF_INET or AF_INET6, got %d\n",
6904 ok(p
->ai_family
== hinttests
[i
].family
,
6905 "test %d: expected family %d, got %d\n",
6906 i
, hinttests
[i
].family
, p
->ai_family
);
6908 ok(p
->ai_socktype
== hinttests
[i
].socktype
,
6909 "test %d: expected type %d, got %d\n",
6910 i
, hinttests
[i
].socktype
, p
->ai_socktype
);
6911 ok(p
->ai_protocol
== hinttests
[i
].protocol
,
6912 "test %d: expected protocol %d, got %d\n",
6913 i
, hinttests
[i
].protocol
, p
->ai_protocol
);
6918 pFreeAddrInfoW(result
);
6922 DWORD err
= WSAGetLastError();
6923 if (hinttests
[i
].error
)
6924 ok(hinttests
[i
].error
== err
, "test %d: GetAddrInfoW failed with error %d, expected %d\n",
6925 i
, err
, hinttests
[i
].error
);
6927 ok(0, "test %d: GetAddrInfoW failed with %d (err %d)\n", i
, ret
, err
);
6932 static void test_getaddrinfo(void)
6935 ADDRINFOA
*result
, *result2
, *p
, hint
;
6937 DWORD size
= sizeof(name
);
6939 if (!pgetaddrinfo
|| !pfreeaddrinfo
)
6941 win_skip("getaddrinfo and/or freeaddrinfo not present\n");
6944 memset(&hint
, 0, sizeof(ADDRINFOA
));
6945 GetComputerNameExA( ComputerNamePhysicalDnsHostname
, name
, &size
);
6947 result
= (ADDRINFOA
*)0xdeadbeef;
6948 WSASetLastError(0xdeadbeef);
6949 ret
= pgetaddrinfo(NULL
, NULL
, NULL
, &result
);
6950 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
6951 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
6952 ok(result
== NULL
, "got %p\n", result
);
6955 WSASetLastError(0xdeadbeef);
6956 ret
= pgetaddrinfo("", NULL
, NULL
, &result
);
6957 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6958 ok(result
!= NULL
, "getaddrinfo failed\n");
6959 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6960 pfreeaddrinfo(result
);
6963 ret
= pgetaddrinfo(NULL
, "0", NULL
, &result
);
6964 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6965 ok(result
!= NULL
, "getaddrinfo failed\n");
6968 ret
= pgetaddrinfo(NULL
, "", NULL
, &result2
);
6969 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6970 ok(result2
!= NULL
, "getaddrinfo failed\n");
6971 compare_addrinfo(result
, result2
);
6972 pfreeaddrinfo(result
);
6973 pfreeaddrinfo(result2
);
6976 WSASetLastError(0xdeadbeef);
6977 ret
= pgetaddrinfo("", "0", NULL
, &result
);
6978 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6979 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
6980 ok(result
!= NULL
, "getaddrinfo failed\n");
6983 ret
= pgetaddrinfo("", "", NULL
, &result2
);
6984 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6985 ok(result2
!= NULL
, "getaddrinfo failed\n");
6986 compare_addrinfo(result
, result2
);
6987 pfreeaddrinfo(result
);
6988 pfreeaddrinfo(result2
);
6991 ret
= pgetaddrinfo("localhost", NULL
, NULL
, &result
);
6992 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6993 pfreeaddrinfo(result
);
6996 ret
= pgetaddrinfo("localhost", "", NULL
, &result
);
6997 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
6998 pfreeaddrinfo(result
);
7001 ret
= pgetaddrinfo("localhost", "0", NULL
, &result
);
7002 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7003 pfreeaddrinfo(result
);
7006 ret
= pgetaddrinfo("localhost", "80", NULL
, &result
);
7007 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7008 pfreeaddrinfo(result
);
7011 ret
= pgetaddrinfo("localhost", NULL
, &hint
, &result
);
7012 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7013 pfreeaddrinfo(result
);
7016 WSASetLastError(0xdeadbeef);
7017 ret
= pgetaddrinfo("localhost", "80", &hint
, &result
);
7018 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7019 ok(WSAGetLastError() == 0, "expected 0, got %d\n", WSAGetLastError());
7020 pfreeaddrinfo(result
);
7022 /* try to get information from the computer name, result is the same
7023 * as if requesting with an empty host name. */
7024 ret
= pgetaddrinfo(name
, NULL
, NULL
, &result
);
7025 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7026 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7028 ret
= pgetaddrinfo("", NULL
, NULL
, &result2
);
7029 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7030 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7031 compare_addrinfo(result
, result2
);
7032 pfreeaddrinfo(result
);
7033 pfreeaddrinfo(result2
);
7035 ret
= pgetaddrinfo(name
, "", NULL
, &result
);
7036 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7037 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7039 ret
= pgetaddrinfo("", "", NULL
, &result2
);
7040 ok(!ret
, "getaddrinfo failed with %d\n", WSAGetLastError());
7041 ok(result
!= NULL
, "GetAddrInfoW failed\n");
7042 compare_addrinfo(result
, result2
);
7043 pfreeaddrinfo(result
);
7044 pfreeaddrinfo(result2
);
7046 result
= (ADDRINFOA
*)0xdeadbeef;
7047 WSASetLastError(0xdeadbeef);
7048 ret
= pgetaddrinfo("nxdomain.codeweavers.com", NULL
, NULL
, &result
);
7051 skip("nxdomain returned success. Broken ISP redirects?\n");
7054 ok(ret
== WSAHOST_NOT_FOUND
, "got %d expected WSAHOST_NOT_FOUND\n", ret
);
7055 ok(WSAGetLastError() == WSAHOST_NOT_FOUND
, "expected 11001, got %d\n", WSAGetLastError());
7056 ok(result
== NULL
, "got %p\n", result
);
7058 for (i
= 0;i
< (sizeof(hinttests
) / sizeof(hinttests
[0]));i
++)
7060 hint
.ai_family
= hinttests
[i
].family
;
7061 hint
.ai_socktype
= hinttests
[i
].socktype
;
7062 hint
.ai_protocol
= hinttests
[i
].protocol
;
7065 SetLastError(0xdeadbeef);
7066 ret
= pgetaddrinfo("localhost", NULL
, &hint
, &result
);
7069 if (hinttests
[i
].error
)
7070 ok(0, "test %d: getaddrinfo succeeded unexpectedly\n", i
);
7076 /* when AF_UNSPEC is used the return will be either AF_INET or AF_INET6 */
7077 if (hinttests
[i
].family
== AF_UNSPEC
)
7078 ok(p
->ai_family
== AF_INET
|| p
->ai_family
== AF_INET6
,
7079 "test %d: expected AF_INET or AF_INET6, got %d\n",
7082 ok(p
->ai_family
== hinttests
[i
].family
,
7083 "test %d: expected family %d, got %d\n",
7084 i
, hinttests
[i
].family
, p
->ai_family
);
7086 ok(p
->ai_socktype
== hinttests
[i
].socktype
,
7087 "test %d: expected type %d, got %d\n",
7088 i
, hinttests
[i
].socktype
, p
->ai_socktype
);
7089 ok(p
->ai_protocol
== hinttests
[i
].protocol
,
7090 "test %d: expected protocol %d, got %d\n",
7091 i
, hinttests
[i
].protocol
, p
->ai_protocol
);
7096 pfreeaddrinfo(result
);
7100 DWORD err
= WSAGetLastError();
7101 if (hinttests
[i
].error
)
7102 ok(hinttests
[i
].error
== err
, "test %d: getaddrinfo failed with error %d, expected %d\n",
7103 i
, err
, hinttests
[i
].error
);
7105 ok(0, "test %d: getaddrinfo failed with %d (err %d)\n", i
, ret
, err
);
7110 static void test_ConnectEx(void)
7112 SOCKET listener
= INVALID_SOCKET
;
7113 SOCKET acceptor
= INVALID_SOCKET
;
7114 SOCKET connector
= INVALID_SOCKET
;
7115 struct sockaddr_in address
, conaddress
;
7117 OVERLAPPED overlapped
;
7118 LPFN_CONNECTEX pConnectEx
;
7119 GUID connectExGuid
= WSAID_CONNECTEX
;
7120 DWORD bytesReturned
;
7126 memset(&overlapped
, 0, sizeof(overlapped
));
7128 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7129 if (listener
== INVALID_SOCKET
) {
7130 skip("could not create listener socket, error %d\n", WSAGetLastError());
7134 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7135 if (connector
== INVALID_SOCKET
) {
7136 skip("could not create connector socket, error %d\n", WSAGetLastError());
7140 memset(&address
, 0, sizeof(address
));
7141 address
.sin_family
= AF_INET
;
7142 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7143 iret
= bind(listener
, (struct sockaddr
*)&address
, sizeof(address
));
7145 skip("failed to bind, error %d\n", WSAGetLastError());
7149 addrlen
= sizeof(address
);
7150 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
7152 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
7156 if (set_blocking(listener
, TRUE
)) {
7157 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7161 iret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &connectExGuid
, sizeof(connectExGuid
),
7162 &pConnectEx
, sizeof(pConnectEx
), &bytesReturned
, NULL
, NULL
);
7164 win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret
, WSAGetLastError());
7168 bret
= pConnectEx(INVALID_SOCKET
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7169 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "ConnectEx on invalid socket "
7170 "returned %d + errno %d\n", bret
, WSAGetLastError());
7172 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7173 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "ConnectEx on a unbound socket "
7174 "returned %d + errno %d\n", bret
, WSAGetLastError());
7175 if (bret
== TRUE
|| WSAGetLastError() != WSAEINVAL
)
7177 acceptor
= accept(listener
, NULL
, NULL
);
7178 if (acceptor
!= INVALID_SOCKET
) {
7179 closesocket(acceptor
);
7180 acceptor
= INVALID_SOCKET
;
7183 closesocket(connector
);
7184 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7185 if (connector
== INVALID_SOCKET
) {
7186 skip("could not create connector socket, error %d\n", WSAGetLastError());
7191 /* ConnectEx needs a bound socket */
7192 memset(&conaddress
, 0, sizeof(conaddress
));
7193 conaddress
.sin_family
= AF_INET
;
7194 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7195 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7197 skip("failed to bind, error %d\n", WSAGetLastError());
7201 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, NULL
);
7202 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "ConnectEx on a NULL overlapped "
7203 "returned %d + errno %d\n", bret
, WSAGetLastError());
7205 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7206 if (overlapped
.hEvent
== NULL
) {
7207 skip("could not create event object, errno = %d\n", GetLastError());
7211 iret
= listen(listener
, 1);
7213 skip("listening failed, errno = %d\n", WSAGetLastError());
7217 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7218 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
7219 "returned %d + errno %d\n", bret
, WSAGetLastError());
7220 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7221 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7223 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7224 ok(bret
, "Connecting failed, error %d\n", GetLastError());
7225 ok(bytesReturned
== 0, "Bytes sent is %d\n", bytesReturned
);
7227 closesocket(connector
);
7228 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7229 if (connector
== INVALID_SOCKET
) {
7230 skip("could not create connector socket, error %d\n", WSAGetLastError());
7233 /* ConnectEx needs a bound socket */
7234 memset(&conaddress
, 0, sizeof(conaddress
));
7235 conaddress
.sin_family
= AF_INET
;
7236 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7237 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7239 skip("failed to bind, error %d\n", WSAGetLastError());
7243 acceptor
= accept(listener
, NULL
, NULL
);
7244 if (acceptor
!= INVALID_SOCKET
) {
7245 closesocket(acceptor
);
7251 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, buffer
, 3, &bytesReturned
, &overlapped
);
7252 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "ConnectEx failed: "
7253 "returned %d + errno %d\n", bret
, WSAGetLastError());
7254 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7255 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7257 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7258 ok(bret
, "Connecting failed, error %d\n", GetLastError());
7259 ok(bytesReturned
== 3, "Bytes sent is %d\n", bytesReturned
);
7261 acceptor
= accept(listener
, NULL
, NULL
);
7262 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket error %d\n", WSAGetLastError());
7264 bytesReturned
= recv(acceptor
, buffer
, 3, 0);
7266 ok(bytesReturned
== 3, "Didn't get all sent data, got only %d\n", bytesReturned
);
7267 ok(buffer
[0] == '1' && buffer
[1] == '2' && buffer
[2] == '3',
7268 "Failed to get the right data, expected '123', got '%s'\n", buffer
);
7270 closesocket(connector
);
7271 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7272 if (connector
== INVALID_SOCKET
) {
7273 skip("could not create connector socket, error %d\n", WSAGetLastError());
7276 /* ConnectEx needs a bound socket */
7277 memset(&conaddress
, 0, sizeof(conaddress
));
7278 conaddress
.sin_family
= AF_INET
;
7279 conaddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7280 iret
= bind(connector
, (struct sockaddr
*)&conaddress
, sizeof(conaddress
));
7282 skip("failed to bind, error %d\n", WSAGetLastError());
7286 if (acceptor
!= INVALID_SOCKET
) {
7287 closesocket(acceptor
);
7288 acceptor
= INVALID_SOCKET
;
7291 /* Connect with error */
7292 closesocket(listener
);
7293 listener
= INVALID_SOCKET
;
7295 address
.sin_port
= htons(1);
7297 bret
= pConnectEx(connector
, (struct sockaddr
*)&address
, addrlen
, NULL
, 0, &bytesReturned
, &overlapped
);
7298 ok(bret
== FALSE
&& GetLastError(), "ConnectEx to bad destination failed: "
7299 "returned %d + errno %d\n", bret
, GetLastError());
7301 if (GetLastError() == ERROR_IO_PENDING
)
7303 dwret
= WaitForSingleObject(overlapped
.hEvent
, 15000);
7304 ok(dwret
== WAIT_OBJECT_0
, "Waiting for connect event failed with %d + errno %d\n", dwret
, GetLastError());
7306 bret
= GetOverlappedResult((HANDLE
)connector
, &overlapped
, &bytesReturned
, FALSE
);
7307 ok(bret
== FALSE
&& GetLastError() == ERROR_CONNECTION_REFUSED
,
7308 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
7311 ok(GetLastError() == WSAECONNREFUSED
,
7312 "Connecting to a disconnected host returned error %d - %d\n", bret
, WSAGetLastError());
7316 if (overlapped
.hEvent
)
7317 WSACloseEvent(overlapped
.hEvent
);
7318 if (listener
!= INVALID_SOCKET
)
7319 closesocket(listener
);
7320 if (acceptor
!= INVALID_SOCKET
)
7321 closesocket(acceptor
);
7322 if (connector
!= INVALID_SOCKET
)
7323 closesocket(connector
);
7326 static void test_AcceptEx(void)
7328 SOCKET listener
= INVALID_SOCKET
;
7329 SOCKET acceptor
= INVALID_SOCKET
;
7330 SOCKET connector
= INVALID_SOCKET
;
7331 SOCKET connector2
= INVALID_SOCKET
;
7332 struct sockaddr_in bindAddress
, peerAddress
, *readBindAddress
, *readRemoteAddress
;
7333 int socklen
, optlen
;
7334 GUID acceptExGuid
= WSAID_ACCEPTEX
, getAcceptExGuid
= WSAID_GETACCEPTEXSOCKADDRS
;
7335 LPFN_ACCEPTEX pAcceptEx
= NULL
;
7336 LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockaddrs
= NULL
;
7337 fd_set fds_accept
, fds_send
;
7338 struct timeval timeout
= {0,10}; /* wait for 10 milliseconds */
7340 DWORD bytesReturned
, connect_time
;
7341 char buffer
[1024], ipbuffer
[32];
7342 OVERLAPPED overlapped
;
7343 int iret
, localSize
= sizeof(struct sockaddr_in
), remoteSize
= localSize
;
7347 memset(&overlapped
, 0, sizeof(overlapped
));
7349 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7350 if (listener
== INVALID_SOCKET
) {
7351 skip("could not create listener socket, error %d\n", WSAGetLastError());
7355 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7356 if (acceptor
== INVALID_SOCKET
) {
7357 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7361 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7362 if (connector
== INVALID_SOCKET
) {
7363 skip("could not create connector socket, error %d\n", WSAGetLastError());
7367 memset(&bindAddress
, 0, sizeof(bindAddress
));
7368 bindAddress
.sin_family
= AF_INET
;
7369 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7370 iret
= bind(listener
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7372 skip("failed to bind, error %d\n", WSAGetLastError());
7376 socklen
= sizeof(bindAddress
);
7377 iret
= getsockname(listener
, (struct sockaddr
*)&bindAddress
, &socklen
);
7379 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
7383 if (set_blocking(listener
, FALSE
)) {
7384 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7388 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
7389 &pAcceptEx
, sizeof(pAcceptEx
), &bytesReturned
, NULL
, NULL
);
7391 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret
, WSAGetLastError());
7395 iret
= WSAIoctl(listener
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &getAcceptExGuid
, sizeof(getAcceptExGuid
),
7396 &pGetAcceptExSockaddrs
, sizeof(pGetAcceptExSockaddrs
), &bytesReturned
, NULL
, NULL
);
7398 skip("WSAIoctl failed to get GetAcceptExSockaddrs with ret %d + errno %d\n", iret
, WSAGetLastError());
7402 bret
= pAcceptEx(INVALID_SOCKET
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7403 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7404 &bytesReturned
, &overlapped
);
7405 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid listening socket "
7406 "returned %d + errno %d\n", bret
, WSAGetLastError());
7408 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7409 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7410 &bytesReturned
, &overlapped
);
7412 ok(bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
, "AcceptEx on a non-listening socket "
7413 "returned %d + errno %d\n", bret
, WSAGetLastError());
7415 iret
= listen(listener
, 5);
7417 skip("listening failed, errno = %d\n", WSAGetLastError());
7421 bret
= pAcceptEx(listener
, INVALID_SOCKET
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7422 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7423 &bytesReturned
, &overlapped
);
7424 ok(bret
== FALSE
&& WSAGetLastError() == WSAENOTSOCK
, "AcceptEx on invalid accepting socket "
7425 "returned %d + errno %d\n", bret
, WSAGetLastError());
7427 bret
= pAcceptEx(listener
, acceptor
, NULL
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7428 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7429 &bytesReturned
, &overlapped
);
7431 (WSAGetLastError() == WSAEINVAL
||
7432 broken(WSAGetLastError() == WSAEFAULT
)), /* NT4 */
7433 "AcceptEx on NULL buffer returned %d + errno %d\n", bret
, WSAGetLastError());
7435 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, sizeof(struct sockaddr_in
) + 16,
7436 &bytesReturned
, &overlapped
);
7437 ok(bret
== FALSE
&& (WSAGetLastError() == ERROR_IO_PENDING
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7438 "AcceptEx on too small local address size returned %d + errno %d\n",
7439 bret
, WSAGetLastError());
7440 bret
= CancelIo((HANDLE
) listener
);
7441 ok(bret
, "Failed to cancel pending accept socket\n");
7443 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 15,
7444 sizeof(struct sockaddr_in
) + 16, &bytesReturned
, &overlapped
);
7445 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx on too small local address "
7446 "size returned %d + errno %d\n",
7447 bret
, WSAGetLastError());
7448 bret
= CancelIo((HANDLE
) listener
);
7449 ok(bret
, "Failed to cancel pending accept socket\n");
7451 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16, 0,
7452 &bytesReturned
, &overlapped
);
7453 ok(bret
== FALSE
&& (WSAGetLastError() == WSAEFAULT
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7454 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7456 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, sizeof(struct sockaddr_in
) + 16,
7457 sizeof(struct sockaddr_in
) + 15, &bytesReturned
, &overlapped
);
7458 ok(bret
== FALSE
&& (WSAGetLastError() == ERROR_IO_PENDING
|| broken(WSAGetLastError() == WSAEINVAL
)) /* NT4 */,
7459 "AcceptEx on too small remote address size returned %d + errno %d\n", bret
, WSAGetLastError());
7460 bret
= CancelIo((HANDLE
) listener
);
7461 ok(bret
, "Failed to cancel pending accept socket\n");
7463 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7464 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7465 &bytesReturned
, NULL
);
7466 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7467 "returned %d + errno %d\n", bret
, WSAGetLastError());
7469 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0, 0, 0, &bytesReturned
, NULL
);
7470 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_INVALID_PARAMETER
, "AcceptEx on a NULL overlapped "
7471 "returned %d + errno %d\n", bret
, WSAGetLastError());
7473 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
7474 if (overlapped
.hEvent
== NULL
) {
7475 skip("could not create event object, errno = %d\n", GetLastError());
7479 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7480 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7481 &bytesReturned
, &overlapped
);
7482 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7484 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7485 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7486 &bytesReturned
, &overlapped
);
7487 todo_wine
ok((bret
== FALSE
&& WSAGetLastError() == WSAEINVAL
) || broken(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
) /* NT4 */,
7488 "AcceptEx on already pending socket returned %d + errno %d\n", bret
, WSAGetLastError());
7489 if (bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
) {
7490 /* We need to cancel this call, otherwise things fail */
7491 bret
= CancelIo((HANDLE
) listener
);
7492 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7494 WaitForSingleObject(overlapped
.hEvent
, 0);
7496 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7497 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7498 &bytesReturned
, &overlapped
);
7499 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7502 iret
= connect(acceptor
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7503 todo_wine
ok((iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEINVAL
) || broken(!iret
) /* NT4 */,
7504 "connecting to acceptex acceptor succeeded? return %d + errno %d\n", iret
, WSAGetLastError());
7505 if (!iret
|| (iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
)) {
7506 /* We need to cancel this call, otherwise things fail */
7507 closesocket(acceptor
);
7508 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7509 if (acceptor
== INVALID_SOCKET
) {
7510 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7514 bret
= CancelIo((HANDLE
) listener
);
7515 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7518 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7519 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7520 &bytesReturned
, &overlapped
);
7521 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7524 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7525 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7527 dwret
= WaitForSingleObject(overlapped
.hEvent
, INFINITE
);
7528 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7530 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7531 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7532 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7534 closesocket(connector
);
7535 connector
= INVALID_SOCKET
;
7536 closesocket(acceptor
);
7538 /* Test short reads */
7540 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7541 if (acceptor
== INVALID_SOCKET
) {
7542 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7545 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7546 if (connector
== INVALID_SOCKET
) {
7547 skip("could not create connector socket, error %d\n", WSAGetLastError());
7550 bret
= pAcceptEx(listener
, acceptor
, buffer
, 2,
7551 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7552 &bytesReturned
, &overlapped
);
7553 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7555 connect_time
= 0xdeadbeef;
7556 optlen
= sizeof(connect_time
);
7557 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7558 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7559 ok(connect_time
== ~0u, "unexpected connect time %u\n", connect_time
);
7561 /* AcceptEx() still won't complete until we send data */
7562 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7563 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7565 connect_time
= 0xdeadbeef;
7566 optlen
= sizeof(connect_time
);
7567 iret
= getsockopt(connector
, SOL_SOCKET
, SO_CONNECT_TIME
, (char *)&connect_time
, &optlen
);
7568 ok(!iret
, "getsockopt failed %d\n", WSAGetLastError());
7569 ok(connect_time
< 0xdeadbeef, "unexpected connect time %u\n", connect_time
);
7571 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7572 ok(dwret
== WAIT_TIMEOUT
, "Waiting for accept event timeout failed with %d + errno %d\n", dwret
, GetLastError());
7574 iret
= getsockname( connector
, (struct sockaddr
*)&peerAddress
, &remoteSize
);
7575 ok( !iret
, "getsockname failed.\n");
7577 /* AcceptEx() could complete any time now */
7578 iret
= send(connector
, buffer
, 1, 0);
7579 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
7581 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7582 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7584 /* Check if the buffer from AcceptEx is decoded correctly */
7585 pGetAcceptExSockaddrs(buffer
, 2, sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7586 (struct sockaddr
**)&readBindAddress
, &localSize
,
7587 (struct sockaddr
**)&readRemoteAddress
, &remoteSize
);
7588 strcpy( ipbuffer
, inet_ntoa(readBindAddress
->sin_addr
));
7589 ok( readBindAddress
->sin_addr
.s_addr
== bindAddress
.sin_addr
.s_addr
,
7590 "Local socket address is different %s != %s\n",
7591 ipbuffer
, inet_ntoa(bindAddress
.sin_addr
));
7592 ok( readBindAddress
->sin_port
== bindAddress
.sin_port
,
7593 "Local socket port is different: %d != %d\n",
7594 readBindAddress
->sin_port
, bindAddress
.sin_port
);
7595 strcpy( ipbuffer
, inet_ntoa(readRemoteAddress
->sin_addr
));
7596 ok( readRemoteAddress
->sin_addr
.s_addr
== peerAddress
.sin_addr
.s_addr
,
7597 "Remote socket address is different %s != %s\n",
7598 ipbuffer
, inet_ntoa(peerAddress
.sin_addr
));
7599 ok( readRemoteAddress
->sin_port
== peerAddress
.sin_port
,
7600 "Remote socket port is different: %d != %d\n",
7601 readRemoteAddress
->sin_port
, peerAddress
.sin_port
);
7603 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7604 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7605 ok(bytesReturned
== 1, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7607 closesocket(connector
);
7608 connector
= INVALID_SOCKET
;
7609 closesocket(acceptor
);
7611 /* Test CF_DEFER & AcceptEx interaction */
7613 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7614 if (acceptor
== INVALID_SOCKET
) {
7615 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7618 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7619 if (connector
== INVALID_SOCKET
) {
7620 skip("could not create connector socket, error %d\n", WSAGetLastError());
7623 connector2
= socket(AF_INET
, SOCK_STREAM
, 0);
7624 if (connector
== INVALID_SOCKET
) {
7625 skip("could not create connector socket, error %d\n", WSAGetLastError());
7629 if (set_blocking(connector
, FALSE
)) {
7630 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7634 if (set_blocking(connector2
, FALSE
)) {
7635 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
7639 /* Connect socket #1 */
7640 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7641 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7643 FD_ZERO ( &fds_accept
);
7644 FD_ZERO ( &fds_send
);
7646 FD_SET ( listener
, &fds_accept
);
7647 FD_SET ( connector
, &fds_send
);
7653 for (i
= 0; i
< 4000; ++i
)
7655 fd_set fds_openaccept
= fds_accept
, fds_opensend
= fds_send
;
7657 wsa_ok ( ( select ( 0, &fds_openaccept
, &fds_opensend
, NULL
, &timeout
) ), SOCKET_ERROR
!=,
7658 "acceptex test(%d): could not select on socket, errno %d\n" );
7660 /* check for incoming requests */
7661 if ( FD_ISSET ( listener
, &fds_openaccept
) ) {
7664 SOCKET tmp
= WSAAccept(listener
, NULL
, NULL
, (LPCONDITIONPROC
) AlwaysDeferConditionFunc
, 0);
7665 ok(tmp
== INVALID_SOCKET
&& WSAGetLastError() == WSATRY_AGAIN
, "Failed to defer connection, %d\n", WSAGetLastError());
7666 bret
= pAcceptEx(listener
, acceptor
, buffer
, 0,
7667 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7668 &bytesReturned
, &overlapped
);
7669 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7671 else if (got
== 2) {
7672 /* this should be socket #2 */
7673 SOCKET tmp
= accept(listener
, NULL
, NULL
);
7674 ok(tmp
!= INVALID_SOCKET
, "accept failed %d\n", WSAGetLastError());
7678 ok(FALSE
, "Got more than 2 connections?\n");
7681 if ( conn1
&& FD_ISSET ( connector2
, &fds_opensend
) ) {
7682 /* Send data on second socket, and stop */
7683 send(connector2
, "2", 1, 0);
7684 FD_CLR ( connector2
, &fds_send
);
7688 if ( FD_ISSET ( connector
, &fds_opensend
) ) {
7689 /* Once #1 is connected, allow #2 to connect */
7692 send(connector
, "1", 1, 0);
7693 FD_CLR ( connector
, &fds_send
);
7695 iret
= connect(connector2
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7696 ok(iret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEWOULDBLOCK
, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7697 FD_SET ( connector2
, &fds_send
);
7701 ok (got
== 2 || broken(got
== 1) /* NT4 */,
7702 "Did not get both connections, got %d\n", got
);
7704 dwret
= WaitForSingleObject(overlapped
.hEvent
, 0);
7705 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7707 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7708 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7709 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7711 set_blocking(acceptor
, TRUE
);
7712 iret
= recv( acceptor
, buffer
, 2, 0);
7713 ok(iret
== 1, "Failed to get data, %d, errno: %d\n", iret
, WSAGetLastError());
7715 ok(buffer
[0] == '1', "The wrong first client was accepted by acceptex: %c != 1\n", buffer
[0]);
7717 closesocket(connector
);
7718 connector
= INVALID_SOCKET
;
7719 closesocket(acceptor
);
7721 /* clean up in case of failures */
7722 while ((acceptor
= accept(listener
, NULL
, NULL
)) != INVALID_SOCKET
)
7723 closesocket(acceptor
);
7725 /* Disconnect during receive? */
7727 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7728 if (acceptor
== INVALID_SOCKET
) {
7729 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7732 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7733 if (connector
== INVALID_SOCKET
) {
7734 skip("could not create connector socket, error %d\n", WSAGetLastError());
7737 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7738 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7739 &bytesReturned
, &overlapped
);
7740 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7742 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
7743 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());
7745 closesocket(connector
);
7746 connector
= INVALID_SOCKET
;
7748 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7749 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7751 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7752 ok(bret
, "GetOverlappedResult failed, error %d\n", GetLastError());
7753 ok(bytesReturned
== 0, "bytesReturned isn't supposed to be %d\n", bytesReturned
);
7755 closesocket(acceptor
);
7757 /* Test closing with pending requests */
7759 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7760 if (acceptor
== INVALID_SOCKET
) {
7761 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7764 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7765 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7766 &bytesReturned
, &overlapped
);
7767 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7769 closesocket(acceptor
);
7771 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7772 todo_wine
ok(dwret
== WAIT_OBJECT_0
|| broken(dwret
== WAIT_TIMEOUT
) /* NT4/2000 */,
7773 "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7775 if (dwret
!= WAIT_TIMEOUT
) {
7776 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7777 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7780 bret
= CancelIo((HANDLE
) listener
);
7781 ok(bret
, "Failed to cancel failed test. Bailing...\n");
7783 WaitForSingleObject(overlapped
.hEvent
, 0);
7786 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7787 if (acceptor
== INVALID_SOCKET
) {
7788 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7791 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7792 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7793 &bytesReturned
, &overlapped
);
7794 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7796 CancelIo((HANDLE
) acceptor
);
7798 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7799 ok(dwret
== WAIT_TIMEOUT
, "Waiting for timeout failed with %d + errno %d\n", dwret
, GetLastError());
7801 closesocket(acceptor
);
7803 acceptor
= socket(AF_INET
, SOCK_STREAM
, 0);
7804 if (acceptor
== INVALID_SOCKET
) {
7805 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7808 bret
= pAcceptEx(listener
, acceptor
, buffer
, sizeof(buffer
) - 2*(sizeof(struct sockaddr_in
) + 16),
7809 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
7810 &bytesReturned
, &overlapped
);
7811 ok(bret
== FALSE
&& WSAGetLastError() == ERROR_IO_PENDING
, "AcceptEx returned %d + errno %d\n", bret
, WSAGetLastError());
7813 closesocket(listener
);
7814 listener
= INVALID_SOCKET
;
7816 dwret
= WaitForSingleObject(overlapped
.hEvent
, 1000);
7817 ok(dwret
== WAIT_OBJECT_0
, "Waiting for accept event failed with %d + errno %d\n", dwret
, GetLastError());
7819 bret
= GetOverlappedResult((HANDLE
)listener
, &overlapped
, &bytesReturned
, FALSE
);
7820 ok(!bret
&& GetLastError() == ERROR_OPERATION_ABORTED
, "GetOverlappedResult failed, error %d\n", GetLastError());
7823 if (overlapped
.hEvent
)
7824 WSACloseEvent(overlapped
.hEvent
);
7825 if (listener
!= INVALID_SOCKET
)
7826 closesocket(listener
);
7827 if (acceptor
!= INVALID_SOCKET
)
7828 closesocket(acceptor
);
7829 if (connector
!= INVALID_SOCKET
)
7830 closesocket(connector
);
7831 if (connector2
!= INVALID_SOCKET
)
7832 closesocket(connector2
);
7835 static void test_DisconnectEx(void)
7837 SOCKET listener
, acceptor
, connector
;
7838 LPFN_DISCONNECTEX pDisconnectEx
;
7839 GUID disconnectExGuid
= WSAID_DISCONNECTEX
;
7840 struct sockaddr_in address
;
7841 DWORD num_bytes
, flags
;
7842 OVERLAPPED overlapped
;
7846 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7847 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket, error %d\n", WSAGetLastError());
7849 iret
= WSAIoctl(connector
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &disconnectExGuid
, sizeof(disconnectExGuid
),
7850 &pDisconnectEx
, sizeof(pDisconnectEx
), &num_bytes
, NULL
, NULL
);
7853 win_skip("WSAIoctl failed to get DisconnectEx, error %d\n", WSAGetLastError());
7854 closesocket(connector
);
7858 listener
= socket(AF_INET
, SOCK_STREAM
, 0);
7859 ok(listener
!= INVALID_SOCKET
, "failed to create listener socket, error %d\n", WSAGetLastError());
7861 memset(&address
, 0, sizeof(address
));
7862 address
.sin_family
= AF_INET
;
7863 address
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
7864 iret
= bind(listener
, (struct sockaddr
*)&address
, sizeof(address
));
7865 ok(iret
== 0, "failed to bind, error %d\n", WSAGetLastError());
7867 addrlen
= sizeof(address
);
7868 iret
= getsockname(listener
, (struct sockaddr
*)&address
, &addrlen
);
7869 ok(iret
== 0, "failed to lookup bind address, error %d\n", WSAGetLastError());
7871 iret
= listen(listener
, 1);
7872 ok(iret
== 0, "failed to listen, error %d\n", WSAGetLastError());
7874 set_blocking(listener
, TRUE
);
7876 memset(&overlapped
, 0, sizeof(overlapped
));
7877 bret
= pDisconnectEx(INVALID_SOCKET
, &overlapped
, 0, 0);
7878 ok(bret
== FALSE
, "DisconnectEx unexpectedly succeeded\n");
7879 ok(WSAGetLastError() == WSAENOTSOCK
, "expected WSAENOTSOCK, got %d\n", WSAGetLastError());
7881 memset(&overlapped
, 0, sizeof(overlapped
));
7882 bret
= pDisconnectEx(connector
, &overlapped
, 0, 0);
7883 ok(bret
== FALSE
, "DisconnectEx unexpectedly succeeded\n");
7884 todo_wine
ok(WSAGetLastError() == WSAENOTCONN
, "expected WSAENOTCONN, got %d\n", WSAGetLastError());
7886 iret
= connect(connector
, (struct sockaddr
*)&address
, addrlen
);
7887 ok(iret
== 0, "failed to connect, error %d\n", WSAGetLastError());
7889 acceptor
= accept(listener
, NULL
, NULL
);
7890 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket, error %d\n", WSAGetLastError());
7892 memset(&overlapped
, 0, sizeof(overlapped
));
7893 overlapped
.hEvent
= WSACreateEvent();
7894 ok(overlapped
.hEvent
!= WSA_INVALID_EVENT
, "WSACreateEvent failed, error %d\n", WSAGetLastError());
7895 bret
= pDisconnectEx(connector
, &overlapped
, 0, 0);
7897 ok(overlapped
.Internal
== STATUS_PENDING
, "expected STATUS_PENDING, got %08lx\n", overlapped
.Internal
);
7898 else if (WSAGetLastError() == ERROR_IO_PENDING
)
7899 bret
= WSAGetOverlappedResult(connector
, &overlapped
, &num_bytes
, TRUE
, &flags
);
7900 ok(bret
, "DisconnectEx failed, error %d\n", WSAGetLastError());
7901 WSACloseEvent(overlapped
.hEvent
);
7903 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
7904 ok(iret
!= 0, "connect unexpectedly succeeded\n");
7905 ok(WSAGetLastError() == WSAEISCONN
, "expected WSAEISCONN, got %d\n", WSAGetLastError());
7907 closesocket(acceptor
);
7908 closesocket(connector
);
7910 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
7911 ok(connector
!= INVALID_SOCKET
, "failed to create connector socket, error %d\n", WSAGetLastError());
7913 iret
= connect(connector
, (struct sockaddr
*)&address
, addrlen
);
7914 ok(iret
== 0, "failed to connect, error %d\n", WSAGetLastError());
7916 acceptor
= accept(listener
, NULL
, NULL
);
7917 ok(acceptor
!= INVALID_SOCKET
, "could not accept socket, error %d\n", WSAGetLastError());
7919 bret
= pDisconnectEx(connector
, NULL
, 0, 0);
7920 ok(bret
, "DisconnectEx failed, error %d\n", WSAGetLastError());
7922 iret
= connect(connector
, (struct sockaddr
*)&address
, sizeof(address
));
7923 ok(iret
!= 0, "connect unexpectedly succeeded\n");
7924 ok(WSAGetLastError() == WSAEISCONN
, "expected WSAEISCONN, got %d\n", WSAGetLastError());
7926 closesocket(acceptor
);
7927 closesocket(connector
);
7928 closesocket(listener
);
7931 #define compare_file(h,s,o) compare_file2(h,s,o,__FILE__,__LINE__)
7933 static void compare_file2(HANDLE handle
, SOCKET sock
, int offset
, const char *file
, int line
)
7935 char buf1
[256], buf2
[256];
7939 SetFilePointer(handle
, offset
, NULL
, FILE_BEGIN
);
7942 DWORD n1
= 0, n2
= 0;
7944 success
= ReadFile(handle
, buf1
, sizeof(buf1
), &n1
, NULL
);
7945 ok_(file
,line
)(success
, "Failed to read from file.\n");
7946 if (success
&& n1
== 0)
7950 n2
= recv(sock
, buf2
, n1
, 0);
7951 ok_(file
,line
)(n1
== n2
, "Block %d size mismatch (%d != %d)\n", i
, n1
, n2
);
7952 ok_(file
,line
)(memcmp(buf1
, buf2
, n2
) == 0, "Block %d failed\n", i
);
7957 static void test_TransmitFile(void)
7959 DWORD num_bytes
, err
, file_size
, total_sent
;
7960 GUID transmitFileGuid
= WSAID_TRANSMITFILE
;
7961 LPFN_TRANSMITFILE pTransmitFile
= NULL
;
7962 HANDLE file
= INVALID_HANDLE_VALUE
;
7963 char header_msg
[] = "hello world";
7964 char footer_msg
[] = "goodbye!!!";
7965 char system_ini_path
[MAX_PATH
];
7966 struct sockaddr_in bindAddress
;
7967 TRANSMIT_FILE_BUFFERS buffers
;
7968 SOCKET client
, server
, dest
;
7974 memset( &ov
, 0, sizeof(ov
) );
7976 /* Setup sockets for testing TransmitFile */
7977 client
= socket(AF_INET
, SOCK_STREAM
, 0);
7978 server
= socket(AF_INET
, SOCK_STREAM
, 0);
7979 if (client
== INVALID_SOCKET
|| server
== INVALID_SOCKET
)
7981 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
7984 iret
= WSAIoctl(client
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &transmitFileGuid
, sizeof(transmitFileGuid
),
7985 &pTransmitFile
, sizeof(pTransmitFile
), &num_bytes
, NULL
, NULL
);
7988 skip("WSAIoctl failed to get TransmitFile with ret %d + errno %d\n", iret
, WSAGetLastError());
7991 GetSystemWindowsDirectoryA(system_ini_path
, MAX_PATH
);
7992 strcat(system_ini_path
, "\\system.ini");
7993 file
= CreateFileA(system_ini_path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_ALWAYS
, 0x0, NULL
);
7994 if (file
== INVALID_HANDLE_VALUE
)
7996 skip("Unable to open a file to transmit.\n");
7999 file_size
= GetFileSize(file
, NULL
);
8001 /* Test TransmitFile with an invalid socket */
8002 bret
= pTransmitFile(INVALID_SOCKET
, file
, 0, 0, NULL
, NULL
, 0);
8003 err
= WSAGetLastError();
8004 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8005 ok(err
== WSAENOTSOCK
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTSOCK
);
8007 /* Test a bogus TransmitFile without a connected socket */
8008 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, TF_REUSE_SOCKET
);
8009 err
= WSAGetLastError();
8010 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8011 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
8013 /* Setup a properly connected socket for transfers */
8014 memset(&bindAddress
, 0, sizeof(bindAddress
));
8015 bindAddress
.sin_family
= AF_INET
;
8016 bindAddress
.sin_port
= htons(9375);
8017 bindAddress
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8018 iret
= bind(server
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8021 skip("failed to bind(), error %d\n", WSAGetLastError());
8024 iret
= listen(server
, 1);
8027 skip("failed to listen(), error %d\n", WSAGetLastError());
8030 iret
= connect(client
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8033 skip("failed to connect(), error %d\n", WSAGetLastError());
8036 len
= sizeof(bindAddress
);
8037 dest
= accept(server
, (struct sockaddr
*)&bindAddress
, &len
);
8038 if (dest
== INVALID_SOCKET
)
8040 skip("failed to accept(), error %d\n", WSAGetLastError());
8043 if (set_blocking(dest
, FALSE
))
8045 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8049 /* Test TransmitFile with no possible buffer */
8050 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
8051 ok(bret
, "TransmitFile failed unexpectedly.\n");
8052 iret
= recv(dest
, buf
, sizeof(buf
), 0);
8053 ok(iret
== -1, "Returned an unexpected buffer from TransmitFile (%d != -1).\n", iret
);
8055 /* Test TransmitFile with only buffer data */
8056 buffers
.Head
= &header_msg
[0];
8057 buffers
.HeadLength
= sizeof(header_msg
)+1;
8058 buffers
.Tail
= &footer_msg
[0];
8059 buffers
.TailLength
= sizeof(footer_msg
)+1;
8060 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, &buffers
, 0);
8061 ok(bret
, "TransmitFile failed unexpectedly.\n");
8062 iret
= recv(dest
, buf
, sizeof(buf
), 0);
8063 ok(iret
== sizeof(header_msg
)+sizeof(footer_msg
)+2,
8064 "Returned an unexpected buffer from TransmitFile: %d\n", iret
);
8065 ok(memcmp(&buf
[0], &header_msg
[0], sizeof(header_msg
)+1) == 0,
8066 "TransmitFile header buffer did not match!\n");
8067 ok(memcmp(&buf
[sizeof(header_msg
)+1], &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
8068 "TransmitFile footer buffer did not match!\n");
8070 /* Test TransmitFile with only file data */
8071 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, NULL
, 0);
8072 ok(bret
, "TransmitFile failed unexpectedly.\n");
8073 compare_file(file
, dest
, 0);
8075 /* Test TransmitFile with both file and buffer data */
8076 buffers
.Head
= &header_msg
[0];
8077 buffers
.HeadLength
= sizeof(header_msg
)+1;
8078 buffers
.Tail
= &footer_msg
[0];
8079 buffers
.TailLength
= sizeof(footer_msg
)+1;
8080 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8081 bret
= pTransmitFile(client
, file
, 0, 0, NULL
, &buffers
, 0);
8082 ok(bret
, "TransmitFile failed unexpectedly.\n");
8083 iret
= recv(dest
, buf
, sizeof(header_msg
)+1, 0);
8084 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)+1) == 0,
8085 "TransmitFile header buffer did not match!\n");
8086 compare_file(file
, dest
, 0);
8087 iret
= recv(dest
, buf
, sizeof(footer_msg
)+1, 0);
8088 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
8089 "TransmitFile footer buffer did not match!\n");
8091 /* Test overlapped TransmitFile */
8092 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8093 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
8095 skip("Could not create event object, some tests will be skipped. errno = %d\n",
8099 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8100 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
8101 err
= WSAGetLastError();
8102 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8103 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n",
8104 err
, ERROR_IO_PENDING
);
8105 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8106 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8107 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8108 ok(total_sent
== file_size
,
8109 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8110 total_sent
, file_size
);
8111 compare_file(file
, dest
, 0);
8113 /* Test overlapped TransmitFile w/ start offset */
8114 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8115 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
8117 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
8120 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8122 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, NULL
, 0);
8123 err
= WSAGetLastError();
8124 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8125 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8126 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8127 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8128 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8129 ok(total_sent
== (file_size
- ov
.Offset
),
8130 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8131 total_sent
, file_size
- ov
.Offset
);
8132 compare_file(file
, dest
, ov
.Offset
);
8134 /* Test overlapped TransmitFile w/ file and buffer data */
8135 ov
.hEvent
= CreateEventW(NULL
, FALSE
, FALSE
, NULL
);
8136 if (ov
.hEvent
== INVALID_HANDLE_VALUE
)
8138 skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError());
8141 buffers
.Head
= &header_msg
[0];
8142 buffers
.HeadLength
= sizeof(header_msg
)+1;
8143 buffers
.Tail
= &footer_msg
[0];
8144 buffers
.TailLength
= sizeof(footer_msg
)+1;
8145 SetFilePointer(file
, 0, NULL
, FILE_BEGIN
);
8147 bret
= pTransmitFile(client
, file
, 0, 0, &ov
, &buffers
, 0);
8148 err
= WSAGetLastError();
8149 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8150 ok(err
== ERROR_IO_PENDING
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, ERROR_IO_PENDING
);
8151 iret
= WaitForSingleObject(ov
.hEvent
, 2000);
8152 ok(iret
== WAIT_OBJECT_0
, "Overlapped TransmitFile failed.\n");
8153 WSAGetOverlappedResult(client
, &ov
, &total_sent
, FALSE
, NULL
);
8154 ok(total_sent
== (file_size
+ buffers
.HeadLength
+ buffers
.TailLength
),
8155 "Overlapped TransmitFile sent an unexpected number of bytes (%d != %d).\n",
8156 total_sent
, file_size
+ buffers
.HeadLength
+ buffers
.TailLength
);
8157 iret
= recv(dest
, buf
, sizeof(header_msg
)+1, 0);
8158 ok(memcmp(buf
, &header_msg
[0], sizeof(header_msg
)+1) == 0,
8159 "TransmitFile header buffer did not match!\n");
8160 compare_file(file
, dest
, 0);
8161 iret
= recv(dest
, buf
, sizeof(footer_msg
)+1, 0);
8162 ok(memcmp(buf
, &footer_msg
[0], sizeof(footer_msg
)+1) == 0,
8163 "TransmitFile footer buffer did not match!\n");
8165 /* Test TransmitFile with a UDP datagram socket */
8166 closesocket(client
);
8167 client
= socket(AF_INET
, SOCK_DGRAM
, 0);
8168 bret
= pTransmitFile(client
, NULL
, 0, 0, NULL
, NULL
, 0);
8169 err
= WSAGetLastError();
8170 ok(!bret
, "TransmitFile succeeded unexpectedly.\n");
8171 ok(err
== WSAENOTCONN
, "TransmitFile triggered unexpected errno (%d != %d)\n", err
, WSAENOTCONN
);
8175 CloseHandle(ov
.hEvent
);
8176 closesocket(client
);
8177 closesocket(server
);
8180 static void test_getpeername(void)
8183 struct sockaddr_in sa
, sa_out
;
8184 SOCKADDR_STORAGE ss
;
8186 const char buf
[] = "hello world";
8189 /* Test the parameter validation order. */
8190 ret
= getpeername(INVALID_SOCKET
, NULL
, NULL
);
8191 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8192 ok(WSAGetLastError() == WSAENOTSOCK
,
8193 "Expected WSAGetLastError() to return WSAENOTSOCK, got %d\n", WSAGetLastError());
8195 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
8196 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8197 if (sock
== INVALID_SOCKET
)
8199 skip("Socket creation failed with %d\n", WSAGetLastError());
8203 ret
= getpeername(sock
, NULL
, NULL
);
8204 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8205 ok(WSAGetLastError() == WSAENOTCONN
||
8206 broken(WSAGetLastError() == WSAEFAULT
), /* Win9x and WinMe */
8207 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8209 memset(&sa
, 0, sizeof(sa
));
8210 sa
.sin_family
= AF_INET
;
8211 sa
.sin_port
= htons(139);
8212 sa
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
8214 /* sendto does not change a socket's connection state. */
8215 ret
= sendto(sock
, buf
, sizeof(buf
), 0, (struct sockaddr
*)&sa
, sizeof(sa
));
8216 ok(ret
!= SOCKET_ERROR
,
8217 "Expected sendto to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8219 ret
= getpeername(sock
, NULL
, NULL
);
8220 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8221 ok(WSAGetLastError() == WSAENOTCONN
||
8222 broken(WSAGetLastError() == WSAEFAULT
), /* Win9x and WinMe */
8223 "Expected WSAGetLastError() to return WSAENOTCONN, got %d\n", WSAGetLastError());
8225 ret
= connect(sock
, (struct sockaddr
*)&sa
, sizeof(sa
));
8227 "Expected connect to succeed, WSAGetLastError() = %d\n", WSAGetLastError());
8229 ret
= getpeername(sock
, NULL
, NULL
);
8230 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8231 ok(WSAGetLastError() == WSAEFAULT
,
8232 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8234 /* Test crashes on Wine. */
8237 ret
= getpeername(sock
, (void*)0xdeadbeef, (void*)0xcafebabe);
8238 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return SOCKET_ERROR, got %d\n", ret
);
8239 ok(WSAGetLastError() == WSAEFAULT
,
8240 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8243 ret
= getpeername(sock
, (struct sockaddr
*)&sa_out
, NULL
);
8244 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8245 ok(WSAGetLastError() == WSAEFAULT
,
8246 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8249 ret
= getpeername(sock
, NULL
, &sa_len
);
8250 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8251 ok(WSAGetLastError() == WSAEFAULT
,
8252 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8253 ok(!sa_len
, "got %d\n", sa_len
);
8256 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8257 ok(ret
== SOCKET_ERROR
, "Expected getpeername to return 0, got %d\n", ret
);
8258 ok(WSAGetLastError() == WSAEFAULT
,
8259 "Expected WSAGetLastError() to return WSAEFAULT, got %d\n", WSAGetLastError());
8260 ok(!sa_len
, "got %d\n", sa_len
);
8262 sa_len
= sizeof(ss
);
8263 ret
= getpeername(sock
, (struct sockaddr
*)&ss
, &sa_len
);
8264 ok(ret
== 0, "Expected getpeername to return 0, got %d\n", ret
);
8265 ok(!memcmp(&sa
, &ss
, sizeof(sa
)),
8266 "Expected the returned structure to be identical to the connect structure\n");
8267 ok(sa_len
== sizeof(sa
), "got %d\n", sa_len
);
8272 static void test_sioRoutingInterfaceQuery(void)
8276 SOCKADDR_IN sin
= { 0 }, sout
= { 0 };
8277 DWORD bytesReturned
;
8279 sock
= socket(PF_INET
, SOCK_DGRAM
, IPPROTO_IP
);
8280 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8281 if (sock
== INVALID_SOCKET
)
8283 skip("Socket creation failed with %d\n", WSAGetLastError());
8286 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, NULL
, 0, NULL
, 0, NULL
,
8288 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
8289 "expected WSAEFAULT, got %d\n", WSAGetLastError());
8290 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8291 NULL
, 0, NULL
, NULL
, NULL
);
8292 ok(ret
== SOCKET_ERROR
&& WSAGetLastError() == WSAEFAULT
,
8293 "expected WSAEFAULT, got %d\n", WSAGetLastError());
8294 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8295 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8296 ok(ret
== SOCKET_ERROR
&&
8297 (WSAGetLastError() == WSAEFAULT
/* Win98 */ ||
8298 WSAGetLastError() == WSAEINVAL
/* NT4 */||
8299 WSAGetLastError() == WSAEAFNOSUPPORT
),
8300 "expected WSAEFAULT or WSAEINVAL or WSAEAFNOSUPPORT, got %d\n",
8302 sin
.sin_family
= AF_INET
;
8303 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8304 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8305 ok(ret
== SOCKET_ERROR
&&
8306 (WSAGetLastError() == WSAEFAULT
/* Win98 */ ||
8307 WSAGetLastError() == WSAEINVAL
),
8308 "expected WSAEFAULT or WSAEINVAL, got %d\n", WSAGetLastError());
8309 sin
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
8310 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8311 NULL
, 0, &bytesReturned
, NULL
, NULL
);
8312 ok(ret
== SOCKET_ERROR
&&
8313 (WSAGetLastError() == WSAEINVAL
/* NT4 */ ||
8314 WSAGetLastError() == WSAEFAULT
),
8315 "expected WSAEINVAL or WSAEFAULT, got %d\n", WSAGetLastError());
8316 ret
= WSAIoctl(sock
, SIO_ROUTING_INTERFACE_QUERY
, &sin
, sizeof(sin
),
8317 &sout
, sizeof(sout
), &bytesReturned
, NULL
, NULL
);
8318 ok(!ret
|| broken(WSAGetLastError() == WSAEINVAL
/* NT4 */),
8319 "WSAIoctl failed: %d\n", WSAGetLastError());
8322 ok(sout
.sin_family
== AF_INET
, "expected AF_INET, got %d\n",
8324 /* We expect the source address to be INADDR_LOOPBACK as well, but
8325 * there's no guarantee that a route to the loopback address exists,
8326 * so rather than introduce spurious test failures we do not test the
8333 static void test_sioAddressListChange(void)
8335 struct sockaddr_in bindAddress
;
8336 struct in_addr net_address
;
8337 WSAOVERLAPPED overlapped
;
8344 if (!winetest_interactive
)
8346 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, interactive tests must be enabled\n");
8350 /* Use gethostbyname to find the list of local network interfaces */
8351 h
= gethostbyname("");
8354 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, gethostbyname failed with %u\n",
8358 for (acount
= 0; h
->h_addr_list
[acount
]; acount
++);
8361 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, test requires a network card.\n");
8364 net_address
.s_addr
= *(ULONG
*) h
->h_addr_list
[0];
8366 /* Bind an overlapped socket to the first found network interface */
8367 sock
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8368 ok(sock
!= INVALID_SOCKET
, "Expected socket to return a valid socket\n");
8369 if (sock
== INVALID_SOCKET
)
8371 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, socket creation failed with %u\n",
8375 memset(&bindAddress
, 0, sizeof(bindAddress
));
8376 bindAddress
.sin_family
= AF_INET
;
8377 bindAddress
.sin_addr
.s_addr
= net_address
.s_addr
;
8378 ret
= bind(sock
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
8381 skip("Cannot test SIO_ADDRESS_LIST_CHANGE, failed to bind, error %u\n", WSAGetLastError());
8385 /* Wait for address changes, request that the user connects/disconnects an interface */
8386 memset(&overlapped
, 0, sizeof(overlapped
));
8387 overlapped
.hEvent
= CreateEventA(NULL
, FALSE
, FALSE
, NULL
);
8388 ret
= WSAIoctl(sock
, SIO_ADDRESS_LIST_CHANGE
, NULL
, 0, NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8389 ok(ret
== SOCKET_ERROR
, "WSAIoctl succeeded unexpectedly\n");
8390 ok(WSAGetLastError() == WSA_IO_PENDING
, "Expected pending last error %d\n", WSAGetLastError());
8391 trace("Testing socket-based ipv4 address list change notification. Please connect/disconnect or"
8392 " change the ipv4 address of any of the local network interfaces (10 second timeout).\n");
8393 ret
= WaitForSingleObject(overlapped
.hEvent
, 10000);
8394 ok(ret
== WAIT_OBJECT_0
, "failed to get overlapped event %u\n", ret
);
8400 static void test_synchronous_WSAIoctl(void)
8402 HANDLE previous_port
, io_port
;
8403 WSAOVERLAPPED overlapped
, *olp
;
8411 previous_port
= CreateIoCompletionPort( INVALID_HANDLE_VALUE
, NULL
, 0, 0 );
8412 ok( previous_port
!= NULL
, "failed to create completion port %u\n", GetLastError() );
8414 socket
= WSASocketW( AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
8415 ok( socket
!= INVALID_SOCKET
, "failed to create socket %d\n", WSAGetLastError() );
8417 io_port
= CreateIoCompletionPort( (HANDLE
)socket
, previous_port
, 0, 0 );
8418 ok( io_port
!= NULL
, "failed to create completion port %u\n", GetLastError() );
8421 memset( &overlapped
, 0, sizeof(overlapped
) );
8422 res
= WSAIoctl( socket
, FIONBIO
, &on
, sizeof(on
), NULL
, 0, &num_bytes
, &overlapped
, NULL
);
8423 ok( !res
, "WSAIoctl failed %d\n", WSAGetLastError() );
8425 ret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 10000 );
8426 ok( ret
, "failed to get completion status %u\n", GetLastError() );
8428 CloseHandle( io_port
);
8429 closesocket( socket
);
8430 CloseHandle( previous_port
);
8433 #define WM_ASYNCCOMPLETE (WM_USER + 100)
8434 static HWND
create_async_message_window(void)
8436 static const char class_name
[] = "ws2_32 async message window class";
8438 WNDCLASSEXA wndclass
;
8441 wndclass
.cbSize
= sizeof(wndclass
);
8442 wndclass
.style
= CS_HREDRAW
| CS_VREDRAW
;
8443 wndclass
.lpfnWndProc
= DefWindowProcA
;
8444 wndclass
.cbClsExtra
= 0;
8445 wndclass
.cbWndExtra
= 0;
8446 wndclass
.hInstance
= GetModuleHandleA(NULL
);
8447 wndclass
.hIcon
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
8448 wndclass
.hIconSm
= LoadIconA(NULL
, (LPCSTR
)IDI_APPLICATION
);
8449 wndclass
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_ARROW
);
8450 wndclass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
8451 wndclass
.lpszClassName
= class_name
;
8452 wndclass
.lpszMenuName
= NULL
;
8454 RegisterClassExA(&wndclass
);
8456 hWnd
= CreateWindowA(class_name
, "ws2_32 async message window", WS_OVERLAPPEDWINDOW
,
8457 0, 0, 500, 500, NULL
, NULL
, GetModuleHandleA(NULL
), NULL
);
8460 ok(0, "failed to create window: %u\n", GetLastError());
8467 static void test_WSAAsyncGetServByPort(void)
8469 HWND hwnd
= create_async_message_window();
8471 char buffer
[MAXGETHOSTSTRUCT
];
8476 /* FIXME: The asynchronous window messages should be tested. */
8478 /* Parameters are not checked when initiating the asynchronous operation. */
8479 ret
= WSAAsyncGetServByPort(NULL
, 0, 0, NULL
, NULL
, 0);
8480 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8482 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, 0, NULL
, NULL
, 0);
8483 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8485 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, htons(80), NULL
, NULL
, 0);
8486 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8488 ret
= WSAAsyncGetServByPort(hwnd
, WM_ASYNCCOMPLETE
, htons(80), NULL
, buffer
, MAXGETHOSTSTRUCT
);
8489 ok(ret
!= NULL
, "WSAAsyncGetServByPort returned NULL\n");
8491 DestroyWindow(hwnd
);
8494 static void test_WSAAsyncGetServByName(void)
8496 HWND hwnd
= create_async_message_window();
8498 char buffer
[MAXGETHOSTSTRUCT
];
8503 /* FIXME: The asynchronous window messages should be tested. */
8505 /* Parameters are not checked when initiating the asynchronous operation. */
8506 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "", NULL
, NULL
, 0);
8507 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8509 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "", "", buffer
, MAXGETHOSTSTRUCT
);
8510 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8512 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "http", NULL
, NULL
, 0);
8513 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8515 ret
= WSAAsyncGetServByName(hwnd
, WM_ASYNCCOMPLETE
, "http", "tcp", buffer
, MAXGETHOSTSTRUCT
);
8516 ok(ret
!= NULL
, "WSAAsyncGetServByName returned NULL\n");
8518 DestroyWindow(hwnd
);
8522 * Provide consistent initialization for the AcceptEx IOCP tests.
8524 static SOCKET
setup_iocp_src(struct sockaddr_in
*bindAddress
)
8526 SOCKET src
, ret
= INVALID_SOCKET
;
8529 src
= socket(AF_INET
, SOCK_STREAM
, 0);
8530 if (src
== INVALID_SOCKET
)
8532 skip("could not create listener socket, error %d\n", WSAGetLastError());
8536 memset(bindAddress
, 0, sizeof(*bindAddress
));
8537 bindAddress
->sin_family
= AF_INET
;
8538 bindAddress
->sin_addr
.s_addr
= inet_addr("127.0.0.1");
8539 iret
= bind(src
, (struct sockaddr
*)bindAddress
, sizeof(*bindAddress
));
8542 skip("failed to bind, error %d\n", WSAGetLastError());
8546 socklen
= sizeof(*bindAddress
);
8547 iret
= getsockname(src
, (struct sockaddr
*)bindAddress
, &socklen
);
8549 skip("failed to lookup bind address, error %d\n", WSAGetLastError());
8553 if (set_blocking(src
, FALSE
))
8555 skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError());
8559 iret
= listen(src
, 5);
8562 skip("listening failed, errno = %d\n", WSAGetLastError());
8568 if (src
!= ret
&& ret
== INVALID_SOCKET
)
8573 static void test_completion_port(void)
8575 HANDLE previous_port
, io_port
;
8576 WSAOVERLAPPED ov
, *olp
;
8577 SOCKET src
, dest
, dup
, connector
= INVALID_SOCKET
;
8578 WSAPROTOCOL_INFOA info
;
8581 DWORD num_bytes
, flags
;
8586 struct sockaddr_in bindAddress
;
8587 GUID acceptExGuid
= WSAID_ACCEPTEX
;
8588 LPFN_ACCEPTEX pAcceptEx
= NULL
;
8590 memset(buf
, 0, sizeof(buf
));
8591 previous_port
= CreateIoCompletionPort(INVALID_HANDLE_VALUE
, NULL
, 0, 0);
8592 ok( previous_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8594 memset(&ov
, 0, sizeof(ov
));
8596 tcp_socketpair(&src
, &dest
);
8597 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
8599 skip("failed to create sockets\n");
8603 bufs
.len
= sizeof(buf
);
8609 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8610 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8612 io_port
= CreateIoCompletionPort( (HANDLE
)dest
, previous_port
, 125, 0 );
8613 ok(io_port
!= NULL
, "Failed to create completion port %u\n", GetLastError());
8615 SetLastError(0xdeadbeef);
8617 iret
= WSARecv(dest
, &bufs
, 1, &num_bytes
, &flags
, &ov
, NULL
);
8618 ok(iret
== SOCKET_ERROR
, "WSARecv returned %d\n", iret
);
8619 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8624 src
= INVALID_SOCKET
;
8626 SetLastError(0xdeadbeef);
8628 num_bytes
= 0xdeadbeef;
8629 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8631 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8632 todo_wine
ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8633 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
, "Last error was %d\n", GetLastError());
8634 ok(key
== 125, "Key is %lu\n", key
);
8635 ok(num_bytes
== 0, "Number of bytes received is %u\n", num_bytes
);
8636 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8638 SetLastError(0xdeadbeef);
8640 num_bytes
= 0xdeadbeef;
8641 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8643 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8644 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %d\n", bret
);
8645 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8646 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8647 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8648 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8650 if (dest
!= INVALID_SOCKET
)
8653 memset(&ov
, 0, sizeof(ov
));
8655 tcp_socketpair(&src
, &dest
);
8656 if (src
== INVALID_SOCKET
|| dest
== INVALID_SOCKET
)
8658 skip("failed to create sockets\n");
8662 bufs
.len
= sizeof(buf
);
8668 iret
= setsockopt (src
, SOL_SOCKET
, SO_LINGER
, (char *) &ling
, sizeof(ling
));
8669 ok(!iret
, "Failed to set linger %d\n", GetLastError());
8671 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 125, 0);
8672 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8674 set_blocking(dest
, FALSE
);
8677 src
= INVALID_SOCKET
;
8681 num_bytes
= 0xdeadbeef;
8682 SetLastError(0xdeadbeef);
8684 iret
= WSASend(dest
, &bufs
, 1, &num_bytes
, 0, &ov
, NULL
);
8685 ok(iret
== SOCKET_ERROR
, "WSASend failed - %d\n", iret
);
8686 ok(GetLastError() == WSAECONNRESET
, "Last error was %d\n", GetLastError());
8687 ok(num_bytes
== 0xdeadbeef, "Managed to send %d\n", num_bytes
);
8689 SetLastError(0xdeadbeef);
8691 num_bytes
= 0xdeadbeef;
8692 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8694 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8695 ok(bret
== FALSE
, "GetQueuedCompletionStatus returned %u\n", bret
);
8696 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8697 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8698 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8699 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8701 if (dest
!= INVALID_SOCKET
)
8704 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
8705 if (dest
== INVALID_SOCKET
)
8707 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
8711 iret
= WSAIoctl(dest
, SIO_GET_EXTENSION_FUNCTION_POINTER
, &acceptExGuid
, sizeof(acceptExGuid
),
8712 &pAcceptEx
, sizeof(pAcceptEx
), &num_bytes
, NULL
, NULL
);
8715 skip("WSAIoctl failed to get AcceptEx with ret %d + errno %d\n", iret
, WSAGetLastError());
8719 /* Test IOCP response on socket close (IOCP created after AcceptEx) */
8721 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8724 SetLastError(0xdeadbeef);
8726 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8727 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8729 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8730 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8732 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8733 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8736 src
= INVALID_SOCKET
;
8738 SetLastError(0xdeadbeef);
8740 num_bytes
= 0xdeadbeef;
8741 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8743 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8744 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8745 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8746 ok(key
== 125, "Key is %lu\n", key
);
8747 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8748 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8749 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8751 SetLastError(0xdeadbeef);
8753 num_bytes
= 0xdeadbeef;
8754 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8755 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8756 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8757 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8758 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8759 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8760 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8762 /* Test IOCP response on socket close (IOCP created before AcceptEx) */
8764 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8767 SetLastError(0xdeadbeef);
8769 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8770 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8772 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8773 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8775 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8776 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8779 src
= INVALID_SOCKET
;
8781 SetLastError(0xdeadbeef);
8783 num_bytes
= 0xdeadbeef;
8784 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8786 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8787 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8788 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8789 ok(key
== 125, "Key is %lu\n", key
);
8790 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8791 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8792 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8794 SetLastError(0xdeadbeef);
8796 num_bytes
= 0xdeadbeef;
8797 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8798 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8799 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8800 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8801 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8802 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8803 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8805 /* Test IOCP with duplicated handle */
8807 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8810 SetLastError(0xdeadbeef);
8812 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8813 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8815 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8816 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8817 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8819 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8820 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8822 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8823 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8825 SetLastError(0xdeadbeef);
8827 num_bytes
= 0xdeadbeef;
8828 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8829 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8830 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8831 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8832 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8833 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8834 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8837 src
= INVALID_SOCKET
;
8839 dup
= INVALID_SOCKET
;
8841 SetLastError(0xdeadbeef);
8843 num_bytes
= 0xdeadbeef;
8844 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8845 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8846 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8847 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8848 ok(key
== 125, "Key is %lu\n", key
);
8849 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8850 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8851 ok(olp
&& olp
->Internal
== (ULONG
)STATUS_CANCELLED
, "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8853 SetLastError(0xdeadbeef);
8855 num_bytes
= 0xdeadbeef;
8856 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8857 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8858 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8859 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8860 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8861 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8862 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8864 /* Test IOCP with duplicated handle (closing duplicated handle) */
8866 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8869 SetLastError(0xdeadbeef);
8871 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8872 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8874 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8875 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8876 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8878 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8879 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8881 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8882 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8885 dup
= INVALID_SOCKET
;
8887 SetLastError(0xdeadbeef);
8889 num_bytes
= 0xdeadbeef;
8890 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8891 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8892 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8893 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8894 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8895 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8896 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8898 SetLastError(0xdeadbeef);
8900 num_bytes
= 0xdeadbeef;
8901 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8902 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8903 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8904 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8905 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8906 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8907 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8910 src
= INVALID_SOCKET
;
8912 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8913 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8914 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8915 ok(key
== 125, "Key is %lu\n", key
);
8916 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8917 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8918 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8920 SetLastError(0xdeadbeef);
8922 num_bytes
= 0xdeadbeef;
8923 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8924 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8925 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8926 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8927 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8928 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8929 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8931 /* Test IOCP with duplicated handle (closing original handle) */
8933 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8936 SetLastError(0xdeadbeef);
8938 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8939 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8941 WSADuplicateSocketA( src
, GetCurrentProcessId(), &info
);
8942 dup
= WSASocketA(AF_INET
, SOCK_STREAM
, 0, &info
, 0, WSA_FLAG_OVERLAPPED
);
8943 ok(dup
!= INVALID_SOCKET
, "failed to duplicate socket!\n");
8945 bret
= pAcceptEx(dup
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
8946 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
8948 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
8949 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
8952 src
= INVALID_SOCKET
;
8954 SetLastError(0xdeadbeef);
8956 num_bytes
= 0xdeadbeef;
8957 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8958 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8959 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8960 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8961 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8962 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8963 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8966 dup
= INVALID_SOCKET
;
8968 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
8969 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8970 ok(GetLastError() == ERROR_OPERATION_ABORTED
, "Last error was %d\n", GetLastError());
8971 ok(key
== 125, "Key is %lu\n", key
);
8972 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
8973 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
8974 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_CANCELLED
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
8976 SetLastError(0xdeadbeef);
8978 num_bytes
= 0xdeadbeef;
8979 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
8980 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
8981 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
8982 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
8983 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
8984 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
8985 ok(!olp
, "Overlapped structure is at %p\n", olp
);
8987 /* Test IOCP without AcceptEx */
8989 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
8992 SetLastError(0xdeadbeef);
8994 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
8995 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
8998 src
= INVALID_SOCKET
;
9000 SetLastError(0xdeadbeef);
9002 num_bytes
= 0xdeadbeef;
9003 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9004 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9005 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9006 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9007 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9008 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9009 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9013 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
9016 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9017 if (connector
== INVALID_SOCKET
) {
9018 skip("could not create connector socket, error %d\n", WSAGetLastError());
9022 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
9023 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9025 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
9026 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9028 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9029 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9031 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9032 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9034 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9035 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9037 closesocket(connector
);
9038 connector
= INVALID_SOCKET
;
9040 SetLastError(0xdeadbeef);
9042 num_bytes
= 0xdeadbeef;
9043 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9045 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9046 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
9047 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9048 ok(key
== 125, "Key is %lu\n", key
);
9049 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9050 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9051 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9053 SetLastError(0xdeadbeef);
9055 num_bytes
= 0xdeadbeef;
9056 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9057 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9058 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9059 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9060 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9061 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9062 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9064 if (dest
!= INVALID_SOCKET
)
9066 if (src
!= INVALID_SOCKET
)
9071 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
9074 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
9075 if (dest
== INVALID_SOCKET
)
9077 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9081 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9082 if (connector
== INVALID_SOCKET
) {
9083 skip("could not create connector socket, error %d\n", WSAGetLastError());
9087 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
9088 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9090 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
9091 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9093 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9094 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9096 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9097 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9099 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9100 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9102 iret
= send(connector
, buf
, 1, 0);
9103 ok(iret
== 1, "could not send 1 byte: send %d errno %d\n", iret
, WSAGetLastError());
9108 dest
= INVALID_SOCKET
;
9110 SetLastError(0xdeadbeef);
9112 num_bytes
= 0xdeadbeef;
9113 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9115 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9116 ok(bret
== TRUE
, "failed to get completion status %u\n", bret
);
9117 ok(GetLastError() == 0xdeadbeef, "Last error was %d\n", GetLastError());
9118 ok(key
== 125, "Key is %lu\n", key
);
9119 ok(num_bytes
== 1, "Number of bytes transferred is %u\n", num_bytes
);
9120 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9121 ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_SUCCESS
), "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9123 SetLastError(0xdeadbeef);
9125 num_bytes
= 0xdeadbeef;
9126 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9127 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9128 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9129 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9130 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9131 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9132 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9134 if (src
!= INVALID_SOCKET
)
9136 if (connector
!= INVALID_SOCKET
)
9137 closesocket(connector
);
9141 if ((src
= setup_iocp_src(&bindAddress
)) == INVALID_SOCKET
)
9144 dest
= socket(AF_INET
, SOCK_STREAM
, 0);
9145 if (dest
== INVALID_SOCKET
)
9147 skip("could not create acceptor socket, error %d\n", WSAGetLastError());
9151 connector
= socket(AF_INET
, SOCK_STREAM
, 0);
9152 if (connector
== INVALID_SOCKET
) {
9153 skip("could not create connector socket, error %d\n", WSAGetLastError());
9157 io_port
= CreateIoCompletionPort((HANDLE
)src
, previous_port
, 125, 0);
9158 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9160 io_port
= CreateIoCompletionPort((HANDLE
)dest
, previous_port
, 236, 0);
9161 ok(io_port
!= NULL
, "failed to create completion port %u\n", GetLastError());
9163 bret
= pAcceptEx(src
, dest
, buf
, sizeof(buf
) - 2*(sizeof(struct sockaddr_in
) + 16),
9164 sizeof(struct sockaddr_in
) + 16, sizeof(struct sockaddr_in
) + 16,
9166 ok(bret
== FALSE
, "AcceptEx returned %d\n", bret
);
9167 ok(GetLastError() == ERROR_IO_PENDING
, "Last error was %d\n", GetLastError());
9169 iret
= connect(connector
, (struct sockaddr
*)&bindAddress
, sizeof(bindAddress
));
9170 ok(iret
== 0, "connecting to accepting socket failed, error %d\n", GetLastError());
9173 dest
= INVALID_SOCKET
;
9175 SetLastError(0xdeadbeef);
9177 num_bytes
= 0xdeadbeef;
9178 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9180 bret
= GetQueuedCompletionStatus(io_port
, &num_bytes
, &key
, &olp
, 100);
9181 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9182 todo_wine
ok(GetLastError() == ERROR_NETNAME_DELETED
||
9183 GetLastError() == ERROR_OPERATION_ABORTED
||
9184 GetLastError() == ERROR_CONNECTION_ABORTED
||
9185 GetLastError() == ERROR_PIPE_NOT_CONNECTED
/* win 2000 */,
9186 "Last error was %d\n", GetLastError());
9187 ok(key
== 125, "Key is %lu\n", key
);
9188 ok(num_bytes
== 0, "Number of bytes transferred is %u\n", num_bytes
);
9189 ok(olp
== &ov
, "Overlapped structure is at %p\n", olp
);
9190 todo_wine
ok(olp
&& (olp
->Internal
== (ULONG
)STATUS_LOCAL_DISCONNECT
||
9191 olp
->Internal
== (ULONG
)STATUS_CANCELLED
||
9192 olp
->Internal
== (ULONG
)STATUS_CONNECTION_ABORTED
||
9193 olp
->Internal
== (ULONG
)STATUS_PIPE_DISCONNECTED
/* win 2000 */),
9194 "Internal status is %lx\n", olp
? olp
->Internal
: 0);
9196 SetLastError(0xdeadbeef);
9198 num_bytes
= 0xdeadbeef;
9199 olp
= (WSAOVERLAPPED
*)0xdeadbeef;
9200 bret
= GetQueuedCompletionStatus( io_port
, &num_bytes
, &key
, &olp
, 200 );
9201 ok(bret
== FALSE
, "failed to get completion status %u\n", bret
);
9202 ok(GetLastError() == WAIT_TIMEOUT
, "Last error was %d\n", GetLastError());
9203 ok(key
== 0xdeadbeef, "Key is %lu\n", key
);
9204 ok(num_bytes
== 0xdeadbeef, "Number of bytes transferred is %u\n", num_bytes
);
9205 ok(!olp
, "Overlapped structure is at %p\n", olp
);
9209 if (dest
!= INVALID_SOCKET
)
9211 if (src
!= INVALID_SOCKET
)
9213 if (connector
!= INVALID_SOCKET
)
9214 closesocket(connector
);
9215 CloseHandle(previous_port
);
9218 static void test_address_list_query(void)
9220 SOCKET_ADDRESS_LIST
*address_list
;
9221 DWORD bytes_returned
, size
;
9226 s
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
9227 ok(s
!= INVALID_SOCKET
, "Failed to create socket, error %d.\n", WSAGetLastError());
9230 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, 0, &bytes_returned
, NULL
, NULL
);
9231 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9232 if(WSAGetLastError() == WSAEINVAL
)
9234 win_skip("Windows <= NT4 is not supported in this test\n");
9238 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9239 ok(bytes_returned
>= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]),
9240 "Got unexpected bytes_returned %u.\n", bytes_returned
);
9242 size
= bytes_returned
;
9244 address_list
= HeapAlloc(GetProcessHeap(), 0, size
* 2);
9245 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, size
* 2, &bytes_returned
, NULL
, NULL
);
9246 ok(!ret
, "Got unexpected ret %d, error %d.\n", ret
, WSAGetLastError());
9247 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9249 bytes_returned
= FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[address_list
->iAddressCount
]);
9250 for (i
= 0; i
< address_list
->iAddressCount
; ++i
)
9252 bytes_returned
+= address_list
->Address
[i
].iSockaddrLength
;
9254 ok(size
== bytes_returned
, "Got unexpected size %u, expected %u.\n", size
, bytes_returned
);
9256 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, size
, NULL
, NULL
, NULL
);
9257 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9258 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9260 bytes_returned
= 0xdeadbeef;
9261 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, NULL
, size
, &bytes_returned
, NULL
, NULL
);
9262 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9263 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9264 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9266 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
, 1, &bytes_returned
, NULL
, NULL
);
9267 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9268 ok(WSAGetLastError() == WSAEINVAL
, "Got unexpected error %d.\n", WSAGetLastError());
9269 ok(bytes_returned
== 0, "Got unexpected bytes_returned %u.\n", bytes_returned
);
9271 ret
= WSAIoctl(s
, SIO_ADDRESS_LIST_QUERY
, NULL
, 0, address_list
,
9272 FIELD_OFFSET(SOCKET_ADDRESS_LIST
, Address
[0]), &bytes_returned
, NULL
, NULL
);
9273 ok(ret
== SOCKET_ERROR
, "Got unexpected ret %d.\n", ret
);
9274 ok(WSAGetLastError() == WSAEFAULT
, "Got unexpected error %d.\n", WSAGetLastError());
9275 ok(bytes_returned
== size
, "Got unexpected bytes_returned %u, expected %u.\n", bytes_returned
, size
);
9277 HeapFree(GetProcessHeap(), 0, address_list
);
9281 static DWORD WINAPI
inet_ntoa_thread_proc(void *param
)
9285 HANDLE
*event
= param
;
9287 addr
= inet_addr("4.3.2.1");
9288 ok(addr
== htonl(0x04030201), "expected 0x04030201, got %08x\n", addr
);
9289 str
= inet_ntoa(*(struct in_addr
*)&addr
);
9290 ok(!strcmp(str
, "4.3.2.1"), "expected 4.3.2.1, got %s\n", str
);
9293 WaitForSingleObject(event
[1], 3000);
9298 static void test_inet_ntoa(void)
9302 HANDLE thread
, event
[2];
9305 addr
= inet_addr("1.2.3.4");
9306 ok(addr
== htonl(0x01020304), "expected 0x01020304, got %08x\n", addr
);
9307 str
= inet_ntoa(*(struct in_addr
*)&addr
);
9308 ok(!strcmp(str
, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str
);
9310 event
[0] = CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
9311 event
[1] = CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
9313 thread
= CreateThread(NULL
, 0, inet_ntoa_thread_proc
, event
, 0, &tid
);
9314 WaitForSingleObject(event
[0], 3000);
9316 ok(!strcmp(str
, "1.2.3.4"), "expected 1.2.3.4, got %s\n", str
);
9319 WaitForSingleObject(thread
, 3000);
9321 CloseHandle(event
[0]);
9322 CloseHandle(event
[1]);
9323 CloseHandle(thread
);
9326 static void test_WSALookupService(void)
9328 char buffer
[4096], strbuff
[128];
9329 WSAQUERYSETW
*qs
= NULL
;
9333 DWORD error
, offset
, bsize
;
9335 if (!pWSALookupServiceBeginW
|| !pWSALookupServiceEnd
|| !pWSALookupServiceNextW
)
9337 win_skip("WSALookupServiceBeginW or WSALookupServiceEnd or WSALookupServiceNextW not found\n");
9341 qs
= (WSAQUERYSETW
*)buffer
;
9342 memset(qs
, 0, sizeof(*qs
));
9344 /* invalid parameter tests */
9345 ret
= pWSALookupServiceBeginW(NULL
, 0, &hnd
);
9346 error
= WSAGetLastError();
9347 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9349 ok(error
== WSAEFAULT
, "expected 10014, got %d\n", error
);
9351 ret
= pWSALookupServiceBeginW(qs
, 0, NULL
);
9352 error
= WSAGetLastError();
9353 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9355 ok(error
== WSAEFAULT
, "expected 10014, got %d\n", error
);
9357 ret
= pWSALookupServiceBeginW(qs
, 0, &hnd
);
9358 error
= WSAGetLastError();
9359 ok(ret
== SOCKET_ERROR
, "WSALookupServiceBeginW should have failed\n");
9361 ok(error
== WSAEINVAL
9362 || broken(error
== ERROR_INVALID_PARAMETER
) /* == XP */
9363 || broken(error
== WSAEFAULT
) /* == NT */
9364 || broken(error
== WSASERVICE_NOT_FOUND
) /* == 2000 */,
9365 "expected 10022, got %d\n", error
);
9367 ret
= pWSALookupServiceEnd(NULL
);
9368 error
= WSAGetLastError();
9370 ok(ret
== SOCKET_ERROR
, "WSALookupServiceEnd should have failed\n");
9372 ok(error
== ERROR_INVALID_HANDLE
, "expected 6, got %d\n", error
);
9374 /* standard network list query */
9375 qs
->dwSize
= sizeof(*qs
);
9376 hnd
= (HANDLE
)0xdeadbeef;
9377 ret
= pWSALookupServiceBeginW(qs
, LUP_RETURN_ALL
| LUP_DEEP
, &hnd
);
9378 error
= WSAGetLastError();
9379 if(ret
&& error
== ERROR_INVALID_PARAMETER
)
9381 win_skip("the current WSALookupServiceBeginW test is not supported in win <= 2000\n");
9386 ok(!ret
, "WSALookupServiceBeginW failed unexpectedly with error %d\n", error
);
9388 ok(hnd
!= (HANDLE
)0xdeadbeef, "Handle was not filled\n");
9393 memset(qs
, 0, sizeof(*qs
));
9394 bsize
= sizeof(buffer
);
9396 if (pWSALookupServiceNextW(hnd
, 0, &bsize
, qs
) == SOCKET_ERROR
)
9398 error
= WSAGetLastError();
9399 if (error
== WSA_E_NO_MORE
) break;
9400 ok(0, "Error %d happened while listing services\n", error
);
9404 WideCharToMultiByte(CP_ACP
, 0, qs
->lpszServiceInstanceName
, -1,
9405 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9406 trace("Network Name: %s\n", strbuff
);
9408 /* network data is written in the blob field */
9411 /* each network may have multiple NLA_BLOB information structures */
9414 netdata
= (PNLA_BLOB
) &qs
->lpBlob
->pBlobData
[offset
];
9415 switch (netdata
->header
.type
)
9418 trace("\tNLA Data Type: NLA_RAW_DATA\n");
9421 trace("\tNLA Data Type: NLA_INTERFACE\n");
9422 trace("\t\tType: %d\n", netdata
->data
.interfaceData
.dwType
);
9423 trace("\t\tSpeed: %d\n", netdata
->data
.interfaceData
.dwSpeed
);
9424 trace("\t\tAdapter Name: %s\n", netdata
->data
.interfaceData
.adapterName
);
9426 case NLA_802_1X_LOCATION
:
9427 trace("\tNLA Data Type: NLA_802_1X_LOCATION\n");
9428 trace("\t\tInformation: %s\n", netdata
->data
.locationData
.information
);
9430 case NLA_CONNECTIVITY
:
9431 switch (netdata
->data
.connectivity
.type
)
9433 case NLA_NETWORK_AD_HOC
:
9434 trace("\t\tNetwork Type: AD HOC\n");
9436 case NLA_NETWORK_MANAGED
:
9437 trace("\t\tNetwork Type: Managed\n");
9439 case NLA_NETWORK_UNMANAGED
:
9440 trace("\t\tNetwork Type: Unmanaged\n");
9442 case NLA_NETWORK_UNKNOWN
:
9443 trace("\t\tNetwork Type: Unknown\n");
9445 switch (netdata
->data
.connectivity
.internet
)
9447 case NLA_INTERNET_NO
:
9448 trace("\t\tInternet connectivity: No\n");
9450 case NLA_INTERNET_YES
:
9451 trace("\t\tInternet connectivity: Yes\n");
9453 case NLA_INTERNET_UNKNOWN
:
9454 trace("\t\tInternet connectivity: Unknown\n");
9459 trace("\tNLA Data Type: NLA_ICS\n");
9460 trace("\t\tSpeed: %d\n",
9461 netdata
->data
.ICS
.remote
.speed
);
9462 trace("\t\tType: %d\n",
9463 netdata
->data
.ICS
.remote
.type
);
9464 trace("\t\tState: %d\n",
9465 netdata
->data
.ICS
.remote
.state
);
9466 WideCharToMultiByte(CP_ACP
, 0, netdata
->data
.ICS
.remote
.machineName
, -1,
9467 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9468 trace("\t\tMachine Name: %s\n", strbuff
);
9469 WideCharToMultiByte(CP_ACP
, 0, netdata
->data
.ICS
.remote
.sharedAdapterName
, -1,
9470 strbuff
, sizeof(strbuff
), NULL
, NULL
);
9471 trace("\t\tShared Adapter Name: %s\n", strbuff
);
9474 trace("\tNLA Data Type: Unknown\n");
9483 ret
= pWSALookupServiceEnd(hnd
);
9484 ok(!ret
, "WSALookupServiceEnd failed unexpectedly\n");
9487 static void test_WSAEnumNameSpaceProvidersA(void)
9489 LPWSANAMESPACE_INFOA name
= NULL
;
9490 DWORD ret
, error
, blen
= 0, i
;
9491 if (!pWSAEnumNameSpaceProvidersA
)
9493 win_skip("WSAEnumNameSpaceProvidersA not found\n");
9497 SetLastError(0xdeadbeef);
9498 ret
= pWSAEnumNameSpaceProvidersA(&blen
, name
);
9499 error
= WSAGetLastError();
9501 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9503 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9505 /* Invalid parameter tests */
9506 SetLastError(0xdeadbeef);
9507 ret
= pWSAEnumNameSpaceProvidersA(NULL
, name
);
9508 error
= WSAGetLastError();
9510 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9512 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9514 SetLastError(0xdeadbeef);
9515 ret
= pWSAEnumNameSpaceProvidersA(NULL
, NULL
);
9516 error
= WSAGetLastError();
9518 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9520 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9522 SetLastError(0xdeadbeef);
9523 ret
= pWSAEnumNameSpaceProvidersA(&blen
, NULL
);
9524 error
= WSAGetLastError();
9526 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9528 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9530 name
= HeapAlloc(GetProcessHeap(), 0, blen
);
9533 skip("Failed to alloc memory\n");
9537 ret
= pWSAEnumNameSpaceProvidersA(&blen
, name
);
9539 ok(ret
> 0, "Expected more than zero name space providers\n");
9541 for (i
= 0;i
< ret
; i
++)
9543 trace("Name space Identifier (%p): %s\n", name
[i
].lpszIdentifier
,
9544 name
[i
].lpszIdentifier
);
9545 switch (name
[i
].dwNameSpace
)
9548 trace("\tName space ID: NS_DNS (%u)\n", name
[i
].dwNameSpace
);
9551 trace("\tName space ID: NS_NLA (%u)\n", name
[i
].dwNameSpace
);
9554 trace("\tName space ID: Unknown (%u)\n", name
[i
].dwNameSpace
);
9557 trace("\tActive: %d\n", name
[i
].fActive
);
9558 trace("\tVersion: %d\n", name
[i
].dwVersion
);
9561 HeapFree(GetProcessHeap(), 0, name
);
9564 static void test_WSAEnumNameSpaceProvidersW(void)
9566 LPWSANAMESPACE_INFOW name
= NULL
;
9567 DWORD ret
, error
, blen
= 0, i
;
9568 if (!pWSAEnumNameSpaceProvidersW
)
9570 win_skip("WSAEnumNameSpaceProvidersW not found\n");
9574 SetLastError(0xdeadbeef);
9575 ret
= pWSAEnumNameSpaceProvidersW(&blen
, name
);
9576 error
= WSAGetLastError();
9578 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9580 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9582 /* Invalid parameter tests */
9583 SetLastError(0xdeadbeef);
9584 ret
= pWSAEnumNameSpaceProvidersW(NULL
, name
);
9585 error
= WSAGetLastError();
9587 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9589 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9591 SetLastError(0xdeadbeef);
9592 ret
= pWSAEnumNameSpaceProvidersW(NULL
, NULL
);
9593 error
= WSAGetLastError();
9595 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9597 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9599 SetLastError(0xdeadbeef);
9600 ret
= pWSAEnumNameSpaceProvidersW(&blen
, NULL
);
9601 error
= WSAGetLastError();
9603 ok(ret
== SOCKET_ERROR
, "Expected failure, got %u\n", ret
);
9605 ok(error
== WSAEFAULT
, "Expected 10014, got %u\n", error
);
9607 name
= HeapAlloc(GetProcessHeap(), 0, blen
);
9610 skip("Failed to alloc memory\n");
9614 ret
= pWSAEnumNameSpaceProvidersW(&blen
, name
);
9616 ok(ret
> 0, "Expected more than zero name space providers\n");
9618 for (i
= 0;i
< ret
; i
++)
9620 trace("Name space Identifier (%p): %s\n", name
[i
].lpszIdentifier
,
9621 wine_dbgstr_w(name
[i
].lpszIdentifier
));
9622 switch (name
[i
].dwNameSpace
)
9625 trace("\tName space ID: NS_DNS (%u)\n", name
[i
].dwNameSpace
);
9628 trace("\tName space ID: NS_NLA (%u)\n", name
[i
].dwNameSpace
);
9631 trace("\tName space ID: Unknown (%u)\n", name
[i
].dwNameSpace
);
9634 trace("\tActive: %d\n", name
[i
].fActive
);
9635 trace("\tVersion: %d\n", name
[i
].dwVersion
);
9638 HeapFree(GetProcessHeap(), 0, name
);
9641 /**************** Main program ***************/
9647 /* Leave these tests at the beginning. They depend on WSAStartup not having been
9648 * called, which is done by Init() below. */
9649 test_WithoutWSAStartup();
9650 test_WithWSAStartup();
9656 test_set_getsockopt();
9657 test_so_reuseaddr();
9659 test_extendedSocketOptions();
9661 for (i
= 0; i
< sizeof(tests
)/sizeof(tests
[0]); i
++)
9663 trace ( " **** STARTING TEST %d ****\n", i
);
9664 do_test ( &tests
[i
] );
9665 trace ( " **** TEST %d COMPLETE ****\n", i
);
9670 test_getservbyname();
9672 test_WSADuplicateSocket();
9673 test_WSAEnumNetworkEvents();
9675 test_WSAAddressToStringA();
9676 test_WSAAddressToStringW();
9678 test_WSAStringToAddressA();
9679 test_WSAStringToAddressW();
9688 test_addr_to_print();
9691 test_gethostbyname();
9692 test_gethostbyname_hack();
9704 test_TransmitFile();
9705 test_GetAddrInfoW();
9709 test_DisconnectEx();
9711 test_sioRoutingInterfaceQuery();
9712 test_sioAddressListChange();
9714 test_WSALookupService();
9715 test_WSAEnumNameSpaceProvidersA();
9716 test_WSAEnumNameSpaceProvidersW();
9718 test_WSAAsyncGetServByPort();
9719 test_WSAAsyncGetServByName();
9721 test_completion_port();
9722 test_address_list_query();
9724 /* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */
9726 test_synchronous_WSAIoctl();