2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for WSASocket
5 * PROGRAMMERS: Peter Hater
10 void Test_CloseDuplicatedSocket()
15 WSAPROTOCOL_INFOW ProtocolInfo
;
16 struct sockaddr_in to
= { AF_INET
, 2222, {{{ 0x7f, 0x00, 0x00, 0x01 }}} };
18 /* Create the socket */
19 sck
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
20 if(sck
== INVALID_SOCKET
)
22 skip("socket failed %d. Aborting test.\n", WSAGetLastError());
26 err
= sendto(sck
, szBuf
, _countof(szBuf
), 0, (struct sockaddr
*)&to
, sizeof(to
));
27 ok(err
== _countof(szBuf
), "sendto err = %d %d\n", err
, WSAGetLastError());
29 err
= WSADuplicateSocketW(sck
, GetCurrentProcessId(), &ProtocolInfo
);
30 ok(err
== 0, "WSADuplicateSocketW err = %d %d\n", err
, WSAGetLastError());
32 dup_sck
= WSASocketW(0, 0, 0, &ProtocolInfo
, 0, 0);
33 if (dup_sck
== INVALID_SOCKET
)
35 skip("WSASocketW failed %d. Aborting test.\n", WSAGetLastError());
40 err
= sendto(dup_sck
, szBuf
, _countof(szBuf
), 0, (struct sockaddr
*)&to
, sizeof(to
));
41 ok(err
== _countof(szBuf
), "sendto err = %d %d\n", err
, WSAGetLastError());
43 err
= closesocket(sck
);
44 ok(err
== 0, "closesocket sck err = %d %d\n", err
, WSAGetLastError());
46 err
= sendto(dup_sck
, szBuf
, _countof(szBuf
), 0, (struct sockaddr
*)&to
, sizeof(to
));
47 ok(err
== _countof(szBuf
), "sendto err = %d %d\n", err
, WSAGetLastError());
49 err
= closesocket(dup_sck
);
50 ok(err
== 0, "closesocket dup_sck err = %d %d\n", err
, WSAGetLastError());
56 #define TIMEOUT_USEC 100000
59 #define TIME_SLEEP1 250
61 #define THREAD_PROC_LOOPS 5
63 #define LISTEN_PORT 22222
64 #define LISTEN_BACKLOG 5
66 DWORD WINAPI
thread_proc(void* param
)
68 fd_set read
, write
, except
;
70 SOCKET sock
= (SOCKET
)param
;
73 tval
.tv_sec
= TIMEOUT_SEC
;
74 tval
.tv_usec
= TIMEOUT_USEC
;
76 for (i
= 0; i
< THREAD_PROC_LOOPS
; ++i
)
78 FD_ZERO(&read
); FD_ZERO(&write
); FD_ZERO(&except
);
79 // write will be empty
80 FD_SET(sock
, &read
); FD_SET(sock
, &except
);
82 select(0, &read
, &write
, &except
, &tval
);
88 void Test_CloseWhileSelectSameSocket()
92 struct sockaddr_in addrin
;
95 /* Create the socket */
96 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
97 if (sock
== INVALID_SOCKET
)
99 skip("socket failed %d. Aborting test.\n", WSAGetLastError());
103 memset(&addrin
, 0, sizeof(struct sockaddr_in
));
104 addrin
.sin_family
= AF_INET
;
105 addrin
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
106 addrin
.sin_port
= htons(LISTEN_PORT
);
108 err
= bind(sock
, (struct sockaddr
*)(&addrin
), sizeof(struct sockaddr_in
));
109 ok(err
== 0, "bind err = %d %d\n", err
, WSAGetLastError());
110 err
= listen(sock
, LISTEN_BACKLOG
);
111 ok(err
== 0, "listen err = %d %d\n", err
, WSAGetLastError());
113 hthread
= CreateThread(NULL
, 0, thread_proc
, (void*)sock
, 0, NULL
);
114 ok(hthread
!= NULL
, "CreateThread %ld\n", GetLastError());
117 err
= closesocket(sock
);
118 ok(err
== 0, "closesocket err = %d %d\n", err
, WSAGetLastError());
120 WaitForSingleObject(hthread
, INFINITE
);
121 CloseHandle(hthread
);
125 void Test_CloseWhileSelectDuplicatedSocket()
128 SOCKET sock
, dup_sock
;
129 WSAPROTOCOL_INFOW ProtocolInfo
;
130 struct sockaddr_in addrin
;
133 /* Create the socket */
134 sock
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
135 if (sock
== INVALID_SOCKET
)
137 skip("socket failed %d. Aborting test.\n", WSAGetLastError());
141 memset(&addrin
, 0, sizeof(struct sockaddr_in
));
142 addrin
.sin_family
= AF_INET
;
143 addrin
.sin_addr
.s_addr
= inet_addr("127.0.0.1");
144 addrin
.sin_port
= htons(LISTEN_PORT
);
146 err
= bind(sock
, (struct sockaddr
*)(&addrin
), sizeof(struct sockaddr_in
));
147 ok(err
== 0, "bind err = %d %d\n", err
, WSAGetLastError());
148 err
= listen(sock
, LISTEN_BACKLOG
);
149 ok(err
== 0, "listen err = %d %d\n", err
, WSAGetLastError());
151 err
= WSADuplicateSocketW(sock
, GetCurrentProcessId(), &ProtocolInfo
);
152 ok(err
== 0, "WSADuplicateSocketW err = %d %d\n", err
, WSAGetLastError());
154 dup_sock
= WSASocketW(0, 0, 0, &ProtocolInfo
, 0, 0);
155 if (dup_sock
== INVALID_SOCKET
)
157 skip("WSASocketW failed %d. Aborting test.\n", WSAGetLastError());
162 hthread
= CreateThread(NULL
, 0, thread_proc
, (void*)dup_sock
, 0, NULL
);
163 ok(hthread
!= NULL
, "CreateThread %ld\n", GetLastError());
165 err
= closesocket(sock
);
166 ok(err
== 0, "closesocket err = %d %d\n", err
, WSAGetLastError());
169 err
= closesocket(dup_sock
);
170 ok(err
== 0, "closesocket err = %d %d\n", err
, WSAGetLastError());
172 WaitForSingleObject(hthread
, INFINITE
);
173 CloseHandle(hthread
);
182 /* Start up Winsock */
183 err
= WSAStartup(MAKEWORD(2, 2), &wdata
);
184 ok(err
== 0, "WSAStartup failed, iResult == %d %d\n", err
, WSAGetLastError());
186 Test_CloseDuplicatedSocket();
187 Test_CloseWhileSelectSameSocket();
188 Test_CloseWhileSelectDuplicatedSocket();