2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for WSAAsync
5 * PROGRAMMERS: Miroslav Mastny
15 #define WAIT_TIMEOUT_ 10000
16 #define EXIT_FLAGS (FD_ACCEPT|FD_CONNECT)
21 SOCKET ServerSocket
= INVALID_SOCKET
,
22 ClientSocket
= INVALID_SOCKET
;
23 WSAEVENT ServerEvent
= WSA_INVALID_EVENT
,
24 ClientEvent
= WSA_INVALID_EVENT
;
25 struct hostent
*ent
= NULL
;
26 struct sockaddr_in server_addr_in
;
27 struct sockaddr_in addr_remote
;
28 struct sockaddr_in addr_con_loc
;
34 WSANETWORKEVENTS WsaNetworkEvents
;
39 if (WSAStartup(MAKEWORD(2, 2), &WsaData
) != 0)
41 skip("WSAStartup failed\n");
45 ServerSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
46 ClientSocket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
47 ServerEvent
= WSACreateEvent();
48 ClientEvent
= WSACreateEvent();
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 if (ServerEvent
== WSA_INVALID_EVENT
)
63 skip("ERROR: Server WSAEvent creation failed\n");
64 closesocket(ClientSocket
);
65 closesocket(ServerSocket
);
68 if (ClientEvent
== WSA_INVALID_EVENT
)
70 skip("ERROR: Client WSAEvent creation failed\n");
71 WSACloseEvent(ServerEvent
);
72 closesocket(ClientSocket
);
73 closesocket(ServerSocket
);
76 ent
= gethostbyname("127.0.0.1");
79 ok(ent
!= NULL
, "ERROR: gethostbyname '127.0.0.1' failed, trying 'localhost'\n");
80 ent
= gethostbyname("localhost");
84 skip("ERROR: gethostbyname 'localhost' failed\n");
89 server_addr_in
.sin_family
= AF_INET
;
90 server_addr_in
.sin_port
= htons(SVR_PORT
);
91 memcpy(&server_addr_in
.sin_addr
.S_un
.S_addr
, ent
->h_addr_list
[0], 4);
93 // server inialialization
94 trace("Initializing server and client connections ...\n");
95 ok(bind(ServerSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
)) == 0, "ERROR: server bind failed\n");
96 ok(ioctlsocket(ServerSocket
, FIONBIO
, &ulValue
) == 0, "ERROR: server ioctlsocket FIONBIO failed\n");
97 ok(WSAEventSelect(ServerSocket
, ServerEvent
, FD_ACCEPT
| FD_CLOSE
) == 0, "ERROR: server accept EventSelect failed\n");
99 // client inialialization
100 ok(WSAEventSelect(ClientSocket
, ClientEvent
, FD_CONNECT
| FD_CLOSE
) == 0, "ERROR: client EventSelect failed\n");
101 ok(ioctlsocket(ClientSocket
, FIONBIO
, &ulValue
) == 0, "ERROR: client ioctlsocket FIONBIO failed\n");
104 trace("Starting server listening mode ...\n");
105 ok(listen(ServerSocket
, SOMAXCONN
) == 0, "ERROR: cannot initialize server listen\n");
107 trace("Starting client to server connection ...\n");
109 nConRes
= connect(ClientSocket
, (struct sockaddr
*)&server_addr_in
, sizeof(server_addr_in
));
110 ok(nConRes
== SOCKET_ERROR
, "ERROR: client connect() result is not SOCKET_ERROR\n");
111 ok(WSAGetLastError() == WSAEWOULDBLOCK
, "ERROR: client connect() last error is not WSAEWOULDBLOCK\n");
113 fSockets
[0] = ServerSocket
;
114 fSockets
[1] = ClientSocket
;
116 fEvents
[0] = ServerEvent
;
117 fEvents
[1] = ClientEvent
;
119 while (dwFlags
!= EXIT_FLAGS
)
121 dwWait
= WaitForMultipleObjects(2, fEvents
, FALSE
, WAIT_TIMEOUT_
);
123 ok(dwWait
== WAIT_OBJECT_0
|| // server socket event
124 dwWait
== WAIT_OBJECT_0
+1, // client socket event
125 "Unknown event received %ld\n", dwWait
);
126 if (dwWait
!= WAIT_OBJECT_0
&& dwWait
!= WAIT_OBJECT_0
+1)
128 skip("ERROR: Connection timeout\n");
132 WSAEnumNetworkEvents(fSockets
[dwWait
-WAIT_OBJECT_0
], fEvents
[dwWait
-WAIT_OBJECT_0
], &WsaNetworkEvents
);
134 if ((WsaNetworkEvents
.lNetworkEvents
& FD_ACCEPT
) != 0)
135 {// connection accepted
136 trace("Event FD_ACCEPT...\n");
137 ok(WsaNetworkEvents
.iErrorCode
[FD_ACCEPT_BIT
] == 0, "Error on accept %d\n", WsaNetworkEvents
.iErrorCode
[FD_ACCEPT_BIT
]);
138 if (WsaNetworkEvents
.iErrorCode
[FD_ACCEPT_BIT
] == 0)
140 addrsize
= sizeof(addr_remote
);
141 sockaccept
= accept(fSockets
[dwWait
- WAIT_OBJECT_0
], (struct sockaddr
*)&addr_remote
, &addrsize
);
142 ok(sockaccept
!= INVALID_SOCKET
, "ERROR: Connection accept function failed, error %ld\n", WSAGetLastError());
143 dwFlags
|= FD_ACCEPT
;
147 if ((WsaNetworkEvents
.lNetworkEvents
& FD_CONNECT
) != 0)
149 trace("Event FD_CONNECT...\n");
150 ok(WsaNetworkEvents
.iErrorCode
[FD_CONNECT_BIT
] == 0, "Error on connect %d\n", WsaNetworkEvents
.iErrorCode
[FD_CONNECT_BIT
]);
151 if (WsaNetworkEvents
.iErrorCode
[FD_CONNECT_BIT
] == 0)
153 len
= sizeof(addr_con_loc
);
154 ok(getsockname(fSockets
[dwWait
- WAIT_OBJECT_0
], (struct sockaddr
*)&addr_con_loc
, &len
) == 0, "\n");
155 dwFlags
|= FD_CONNECT
;
161 WSACloseEvent(ServerEvent
);
162 WSACloseEvent(ClientEvent
);
163 closesocket(ServerSocket
);
164 closesocket(ClientSocket
);