2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for nonblocking sockets
5 * PROGRAMMERS: Peter Hater
11 #define WAIT_TIMEOUT_ 10000
12 #define EXIT_FLAGS (FD_ACCEPT|FD_CONNECT)
14 START_TEST(nonblocking
)
17 SOCKET ServerSocket
= INVALID_SOCKET
,
18 ClientSocket
= INVALID_SOCKET
;
19 struct sockaddr_in server_addr_in
;
20 struct sockaddr_in addr_remote
;
21 struct sockaddr_in addr_con_loc
;
26 DWORD dwFlags
= 0, dwLen
, dwAddrLen
;
27 fd_set readfds
, writefds
, exceptfds
;
28 struct timeval tval
= { 0 };
31 if (!winetest_interactive
)
33 skip("ROSTESTS-247: Skipping ws2_32_apitest:nonblocking because it times out on testbot\n");
37 if (WSAStartup(MAKEWORD(2, 2), &WsaData
) != 0)
39 skip("WSAStartup failed\n");
43 ServerSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
44 ClientSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
46 if (ServerSocket
== INVALID_SOCKET
)
48 skip("ERROR: Server socket creation failed\n");
51 if (ClientSocket
== INVALID_SOCKET
)
53 skip("ERROR: Client socket creation failed\n");
54 closesocket(ServerSocket
);
57 server_addr_in
.sin_family
= AF_INET
;
58 server_addr_in
.sin_addr
.s_addr
= INADDR_ANY
;
59 server_addr_in
.sin_port
= htons(SVR_PORT
);
61 // Server initialization.
62 trace("Initializing server and client connections ...\n");
63 err
= bind(ServerSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
));
64 ok(err
== 0, "ERROR: server bind failed\n");
65 err
= ioctlsocket(ServerSocket
, FIONBIO
, &ulValue
);
66 ok(err
== 0, "ERROR: server ioctlsocket FIONBIO failed\n");
68 // Client initialization.
69 err
= ioctlsocket(ClientSocket
, FIONBIO
, &ulValue
);
70 ok(err
== 0, "ERROR: client ioctlsocket FIONBIO failed\n");
73 trace("Starting server listening mode ...\n");
74 err
= listen(ServerSocket
, 2);
75 ok(err
== 0, "ERROR: cannot initialize server listen\n");
77 trace("Starting client to server connection ...\n");
79 server_addr_in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
80 server_addr_in
.sin_port
= htons(SVR_PORT
);
81 nConRes
= connect(ClientSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
));
82 ok(nConRes
== SOCKET_ERROR
, "ERROR: client connect() result is not SOCKET_ERROR\n");
83 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "ERROR: client connect() last error is not WSAEWOULDBLOCK\n");
87 FD_SET(ServerSocket
, &readfds
);
89 while (dwFlags
!= EXIT_FLAGS
)
91 addrsize
= sizeof(addr_con_loc
);
92 err
= getsockname(ClientSocket
, (struct sockaddr
*)&addr_con_loc
, &addrsize
);
95 dwLen
= sizeof(addr_con_loc
);
96 dwAddrLen
= sizeof(address
);
97 err
= WSAAddressToStringA((PSOCKADDR
)&addr_con_loc
, dwLen
, NULL
, address
, &dwAddrLen
);
100 trace("Event FD_CONNECT...\n");
101 dwFlags
|= FD_CONNECT
;
102 err
= recv(ClientSocket
, address
, dwAddrLen
, 0);
103 ok(err
== -1, "ERROR: error reading data from connected socket, error %d\n", WSAGetLastError());
104 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "ERROR: client connect() last error is not WSAEWOULDBLOCK\n");
105 err
= send(ClientSocket
, address
, dwAddrLen
, 0);
106 ok(err
== dwAddrLen
, "ERROR: error writing data to connected socket, error %d %d\n", err
, WSAGetLastError());
110 trace("WSAAddressToStringA failed %d\n", WSAGetLastError());
114 err
= select(1, &readfds
, &writefds
, &exceptfds
, &tval
);
115 if (err
== 1 && FD_ISSET(ServerSocket
, &readfds
))
116 {// connection ready to be accepted
117 trace("Event FD_ACCEPT...\n");
118 addrsize
= sizeof(addr_remote
);
119 sockaccept
= accept(ServerSocket
, (struct sockaddr
*)&addr_remote
, &addrsize
);
120 ok(sockaccept
!= INVALID_SOCKET
, "ERROR: Connection accept function failed, error %d\n", WSAGetLastError());
121 dwFlags
|= FD_ACCEPT
;
122 dwLen
= sizeof(addr_remote
);
123 dwAddrLen
= sizeof(address
);
124 err
= WSAAddressToStringA((PSOCKADDR
)&addr_remote
, dwLen
, NULL
, address
, &dwAddrLen
);
125 ok(err
== 0, "WSAAddressToStringA, error %d\n", WSAGetLastError());
126 ok(dwAddrLen
> 7, "len <= 7\n");
127 err
= send(sockaccept
, address
, dwAddrLen
, 0);
128 ok(err
== dwAddrLen
, "ERROR: error sending data on accepted socket, error %d\n", WSAGetLastError());
132 closesocket(sockaccept
);
133 closesocket(ServerSocket
);
134 closesocket(ClientSocket
);