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
15 #define WAIT_TIMEOUT_ 10000
16 #define EXIT_FLAGS (FD_ACCEPT|FD_CONNECT)
18 START_TEST(nonblocking
)
21 SOCKET ServerSocket
= INVALID_SOCKET
,
22 ClientSocket
= INVALID_SOCKET
;
23 struct sockaddr_in server_addr_in
;
24 struct sockaddr_in addr_remote
;
25 struct sockaddr_in addr_con_loc
;
30 DWORD dwFlags
= 0, dwLen
, dwAddrLen
;
31 fd_set readfds
, writefds
, exceptfds
;
32 struct timeval tval
= { 0 };
35 if (!winetest_interactive
)
37 skip("ROSTESTS-247: Skipping ws2_32_apitest:nonblocking because it times out on testbot\n");
41 if (WSAStartup(MAKEWORD(2, 2), &WsaData
) != 0)
43 skip("WSAStartup failed\n");
47 ServerSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
48 ClientSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
50 if (ServerSocket
== INVALID_SOCKET
)
52 skip("ERROR: Server socket creation failed\n");
55 if (ClientSocket
== INVALID_SOCKET
)
57 skip("ERROR: Client socket creation failed\n");
58 closesocket(ServerSocket
);
61 server_addr_in
.sin_family
= AF_INET
;
62 server_addr_in
.sin_addr
.s_addr
= INADDR_ANY
;
63 server_addr_in
.sin_port
= htons(SVR_PORT
);
65 // server inialialization
66 trace("Initializing server and client connections ...\n");
67 err
= bind(ServerSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
));
68 ok(err
== 0, "ERROR: server bind failed\n");
69 err
= ioctlsocket(ServerSocket
, FIONBIO
, &ulValue
);
70 ok(err
== 0, "ERROR: server ioctlsocket FIONBIO failed\n");
72 // client inialialization
73 err
= ioctlsocket(ClientSocket
, FIONBIO
, &ulValue
);
74 ok(err
== 0, "ERROR: client ioctlsocket FIONBIO failed\n");
77 trace("Starting server listening mode ...\n");
78 err
= listen(ServerSocket
, 2);
79 ok(err
== 0, "ERROR: cannot initialize server listen\n");
81 trace("Starting client to server connection ...\n");
83 server_addr_in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
84 server_addr_in
.sin_port
= htons(SVR_PORT
);
85 nConRes
= connect(ClientSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
));
86 ok(nConRes
== SOCKET_ERROR
, "ERROR: client connect() result is not SOCKET_ERROR\n");
87 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "ERROR: client connect() last error is not WSAEWOULDBLOCK\n");
91 FD_SET(ServerSocket
, &readfds
);
93 while (dwFlags
!= EXIT_FLAGS
)
95 addrsize
= sizeof(addr_con_loc
);
96 err
= getsockname(ClientSocket
, (struct sockaddr
*)&addr_con_loc
, &addrsize
);
99 dwLen
= sizeof(addr_con_loc
);
100 dwAddrLen
= sizeof(address
);
101 err
= WSAAddressToStringA((PSOCKADDR
)&addr_con_loc
, dwLen
, NULL
, address
, &dwAddrLen
);
104 trace("Event FD_CONNECT...\n");
105 dwFlags
|= FD_CONNECT
;
106 err
= recv(ClientSocket
, address
, dwAddrLen
, 0);
107 ok(err
== -1, "ERROR: error reading data from connected socket, error %d\n", WSAGetLastError());
108 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "ERROR: client connect() last error is not WSAEWOULDBLOCK\n");
109 err
= send(ClientSocket
, address
, dwAddrLen
, 0);
110 ok(err
== dwAddrLen
, "ERROR: error writing data to connected socket, error %d %d\n", err
, WSAGetLastError());
114 trace("WSAAddressToStringA failed %d\n", WSAGetLastError());
118 err
= select(1, &readfds
, &writefds
, &exceptfds
, &tval
);
119 if (err
== 1 && FD_ISSET(ServerSocket
, &readfds
))
120 {// connection ready to be accepted
121 trace("Event FD_ACCEPT...\n");
122 addrsize
= sizeof(addr_remote
);
123 sockaccept
= accept(ServerSocket
, (struct sockaddr
*)&addr_remote
, &addrsize
);
124 ok(sockaccept
!= INVALID_SOCKET
, "ERROR: Connection accept function failed, error %d\n", WSAGetLastError());
125 dwFlags
|= FD_ACCEPT
;
126 dwLen
= sizeof(addr_remote
);
127 dwAddrLen
= sizeof(address
);
128 err
= WSAAddressToStringA((PSOCKADDR
)&addr_remote
, dwLen
, NULL
, address
, &dwAddrLen
);
129 ok(err
== 0, "WSAAddressToStringA, error %d\n", WSAGetLastError());
130 ok(dwAddrLen
> 7, "len <= 7\n");
131 err
= send(sockaccept
, address
, dwAddrLen
, 0);
132 ok(err
== dwAddrLen
, "ERROR: error sending data on accepted socket, error %d\n", WSAGetLastError());
136 closesocket(sockaccept
);
137 closesocket(ServerSocket
);
138 closesocket(ClientSocket
);