[EXPLORER] -Use WM_POPUPSYSTEMMENU to open the system menu of a window. CORE-13400
[reactos.git] / rostests / apitests / ws2_32 / nonblocking.c
1 /*
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
6 */
7
8 #include <apitest.h>
9
10 #include <stdio.h>
11 #include <windows.h>
12 #include <winsock2.h>
13
14 #define SVR_PORT 5000
15 #define WAIT_TIMEOUT_ 10000
16 #define EXIT_FLAGS (FD_ACCEPT|FD_CONNECT)
17
18 START_TEST(nonblocking)
19 {
20 WSADATA WsaData;
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;
26 int nConRes, err;
27 int addrsize;
28 SOCKET sockaccept;
29 ULONG ulValue = 1;
30 DWORD dwFlags = 0, dwLen, dwAddrLen;
31 fd_set readfds, writefds, exceptfds;
32 struct timeval tval = { 0 };
33 char address[100];
34
35 if (!winetest_interactive)
36 {
37 skip("ROSTESTS-247: Skipping ws2_32_apitest:nonblocking because it times out on testbot\n");
38 return;
39 }
40
41 if (WSAStartup(MAKEWORD(2, 2), &WsaData) != 0)
42 {
43 skip("WSAStartup failed\n");
44 return;
45 }
46
47 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
48 ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
49
50 if (ServerSocket == INVALID_SOCKET)
51 {
52 skip("ERROR: Server socket creation failed\n");
53 return;
54 }
55 if (ClientSocket == INVALID_SOCKET)
56 {
57 skip("ERROR: Client socket creation failed\n");
58 closesocket(ServerSocket);
59 return;
60 }
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);
64
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");
71
72 // client inialialization
73 err = ioctlsocket(ClientSocket, FIONBIO, &ulValue);
74 ok(err == 0, "ERROR: client ioctlsocket FIONBIO failed\n");
75
76 // listen
77 trace("Starting server listening mode ...\n");
78 err = listen(ServerSocket, 2);
79 ok(err == 0, "ERROR: cannot initialize server listen\n");
80
81 trace("Starting client to server connection ...\n");
82 // connect
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");
88 FD_ZERO(&readfds);
89 FD_ZERO(&writefds);
90 FD_ZERO(&exceptfds);
91 FD_SET(ServerSocket, &readfds);
92
93 while (dwFlags != EXIT_FLAGS)
94 {
95 addrsize = sizeof(addr_con_loc);
96 err = getsockname(ClientSocket, (struct sockaddr*)&addr_con_loc, &addrsize);
97 if (err == 0)
98 {// client connected
99 dwLen = sizeof(addr_con_loc);
100 dwAddrLen = sizeof(address);
101 err = WSAAddressToStringA((PSOCKADDR)&addr_con_loc, dwLen, NULL, address, &dwAddrLen);
102 if (err == 0)
103 {
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());
111 }
112 else
113 {
114 trace("WSAAddressToStringA failed %d\n", WSAGetLastError());
115 }
116 }
117
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());
133 }
134 }
135
136 closesocket(sockaccept);
137 closesocket(ServerSocket);
138 closesocket(ClientSocket);
139
140 WSACleanup();
141 }