Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
全て クラス 名前空間 ファイル 関数 変数 型定義 列挙型 列挙値 マクロ定義 ページ
TcpConnectorTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "SocketBuilder.h"
8#include "TcpConnector.h"
9#include "Thread.h"
10#include "TString.h"
11#include "Utility.h"
12
13using namespace Microsoft::VisualStudio::CppUnitTestFramework;
14
15namespace WindowsLibraryTest
16{
17 TEST_CLASS (TcpConnectorTest)
18 {
19 public:
20 TEST_CLASS_INITIALIZE (ClassInitialize)
21 {
22 Logger::WriteMessage ("TcpConnectorTest class initialize.\n");
23 }
24
25 TEST_CLASS_CLEANUP (ClassCleanup)
26 {
27 Logger::WriteMessage ("TcpConnectorTest class cleanup.\n");
28 }
29
30 TEST_METHOD_INITIALIZE (MethodInitialize)
31 {
32 Logger::WriteMessage ("TcpConnectorTest method initialize.\n");
33 }
34
35 TEST_METHOD_CLEANUP (MethodCleanup)
36 {
37 Logger::WriteMessage ("TcpConnectorTest method cleanup.\n");
38 }
39
40 TEST_METHOD (TcpConnecorTest)
41 {
42 alt::SocketBuilder builder;
43 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
44
45 alt::Thread* serverThread = new alt::Thread ();
46 auto serverFunction = [](LPVOID lpvParam)->DWORD
47 {
48 Logger::WriteMessage ("[Server]Now start server thread.\n");
49
50 alt::SocketBuilder* pBuilder = (alt::SocketBuilder*)lpvParam;
51 Assert::IsTrue(pBuilder->Prepare (50000), _T("[Server]SocketBuilder::Prepare() failed.\n"));
52
53 do
54 {
55 alt::TcpConnector* connector = pBuilder->Wait ();
56 Assert::IsNotNull(connector, _T("[Server]SocketBuilder::Wait() failed.\n"));
57
58 alt::TString message;
59 LPCTSTR lpctszIPAddress = connector->GetAcceptedAddress ();
60 USHORT wPort = connector->GetAcceptedPortNo ();
61 message.Format (_T ("[Server]SocketBuilder::Wait() success. from %s:%d\n"), lpctszIPAddress, wPort);
62 Logger::WriteMessage (message.Ctr());
63
64 alt::Thread* workerThread = new alt::Thread ();
65 auto connectorFunction = [](LPVOID lpvParam)->DWORD
66 {
67 alt::TcpConnector* connector = (alt::TcpConnector*)lpvParam;
68 INT iPacketSize = -1;
69 BYTE byBuf[256] = { 0 };
70 alt::TString message;
71
72 Logger::WriteMessage ("[ServerWorker]Now start worker thread.\n");
73
74 INT ret;
75 do
76 {
77 ret = connector->Recv ((LPVOID)&iPacketSize, sizeof (INT));
78 if (ret == 0)
79 {
80 DWORD dwError = connector->GetErrNo ();
81 message.Format (_T ("[ServerWorker]TcpConnector::Recv(1) return 0. [%d]\n"), dwError);
82 Logger::WriteMessage (message.Ctr());
83 break;
84 }
85
86 ret = connector->Recv (byBuf, iPacketSize);
87 if (ret == 0)
88 {
89 DWORD dwError = connector->GetErrNo ();
90 message.Format (_T ("[ServerWorker]TcpConnector::Recv(2) return 0. [%d]\n"), dwError);
91 Logger::WriteMessage (message.Ctr());
92 break;
93 }
94
95 message = (LPTSTR)byBuf;
96 Logger::WriteMessage (message.Ctr());
97 } while (1);
98
99 Logger::WriteMessage ("[ServerWorker]Now finish worker thread.\n");
100 return 0;
101 };
102
103 Assert::IsTrue(workerThread->Create (connectorFunction, connector), _T("[Server]Thread::Create() failed.\n"));
104 Assert::AreEqual (WAIT_OBJECT_0, workerThread->Wait (), _T ("[Server]Thread::Wait() is not WAIT_OBJECT_0.\n"));
105 Assert::AreEqual(0, connector->Close (), _T("[Server]TcpConnector::Close() failed.\n"));
106 Logger::WriteMessage ("[Server]TcpConnector::Close()\n");
107 delete workerThread;
108 } while (false);
109
110 Logger::WriteMessage ("[Server]Now finish server thread.\n");
111 return 0;
112 };
113
114 alt::Thread* clientThread = new alt::Thread ();
115 auto clientFunction = [](LPVOID lpvParam)->DWORD
116 {
117 Logger::WriteMessage ("[Client]Now start client thread.\n");
118
119 alt::SocketBuilder builder;
120 Assert::AreEqual(0, builder.Startup (),_T("[Client]SocketBuilder::Startup() failed.\n"));
121 alt::TcpConnector* connector = builder.CreateTcpConnector (_T ("127.0.0.1"), 50000, 1, 10);
122 Assert::IsNotNull (connector, _T("[Client]SocketBuilder::CreateTcpConnector() failed.\n"));
123
124 alt::TString message;
125 LPCTSTR lpctszIPAddress = connector->GetAcceptedAddress ();
126 USHORT wPort = connector->GetAcceptedPortNo ();
127 message.Format (_T ("[Client]SocketBuilder::CreateTcpConnector() success. from %s:%d\n"), lpctszIPAddress, wPort);
128 Logger::WriteMessage (message.Ctr());
129
130 INT iPacketSize;
131 INT ret;
132 CONST INT iLoop = 10;
133 alt::TString debugString;
134
135 for (int i = 1; i <= iLoop; i++)
136 {
139 message.Format (_T("[%2d]%s %s\n"), i, time.Ctr(), guid.Ctr());
140 iPacketSize = message.Byte();
141
142 ret = connector->Send ((LPVOID)&iPacketSize, sizeof (INT));
143 Assert::AreNotEqual (SOCKET_ERROR, ret, _T("[Client]TcpConnector::Send() failed.\n"));
144
145 ret = connector->Send ((LPVOID)message.Ctr(), iPacketSize);
146 Assert::AreNotEqual (SOCKET_ERROR, ret, _T("[Client]TcpConnector::Send() failed.\n"));
147
148 Sleep (100);
149 }
150
151 Assert::AreEqual(0, connector->Close (), _T("[Client]TcpConnector::Close() failed.\n"));
152
153 Logger::WriteMessage ("[Client]Now finish client thread.\n");
154 return 0;
155 };
156
157 Assert::IsTrue(serverThread->Create (serverFunction, &builder), _T("serverThread.Create() failed.\n"));
158 Sleep (1000);
159 Assert::IsTrue(clientThread->Create (clientFunction, &builder), _T("clientThread.Create() failed.\n"));
160 Sleep (1000);
161
162 Assert::AreEqual(WAIT_OBJECT_0, clientThread->Wait (), _T("clientThread.Wait() failed.\n"));
163 Logger::WriteMessage ("Client thread finished.\n");
164 Assert::AreEqual(WAIT_OBJECT_0, serverThread->Wait (), _T("serverThread.Wait() failed.\n"));
165 Logger::WriteMessage ("Server thread finished.\n");
166
167 delete clientThread;
168 delete serverThread;
169 Logger::WriteMessage ("Finished.\n");
170 }
171
172 TEST_METHOD (TcpClientTest)
173 {
174 alt::SocketBuilder builder;
175 BOOL ret;
176
177 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
178
179 alt::TString buffer (80);
180 ret = builder.GetHostByName (_T ("www.yahoo.co.jp"), buffer.Ptr ());
181 Assert::IsTrue(ret, _T("SocketBuilder::GetHostByName() failed.\n"));
182
183 alt::TcpConnector* connector = builder.CreateTcpConnector (buffer.Ctr(), 80, 1, 3);
184 Assert::IsNotNull(connector, _T("SocketBuilder::CreateTcpConnector() failed.\n"));
185
186 alt::TString sendMessage = _T ("GET / HTTP/1.1\n");
187 sendMessage += _T ("Host: www.yahoo.co.jp\n");
188 sendMessage += _T ("Connection: keep - alive\n");
189 sendMessage += _T ("Upgrade - Insecure - Requests: 1\n");
190 sendMessage += _T ("User - Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 67.0.3396.99 Safari / 537.36\n");
191 sendMessage += _T ("Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, image / apng, */*;q=0.8\n");
192 sendMessage += _T ("Accept - Language: ja, en - US; q = 0.9, en; q = 0.8\n");
193
194 INT iRet;
195 iRet = connector->Send ((LPVOID)sendMessage.Ctr (), sendMessage.Len ());
196 do
197 {
198 alt::TString recvMessage (4096);
199 alt::TString readable (4096);
200 iRet = connector->Recv ((LPVOID)recvMessage.Ptr (), 4096);
201 readable.FromMultiByte ((LPCSTR)recvMessage.Ctr (), CP_UTF8);
202 Logger::WriteMessage (readable.Ctr ());
203 if (iRet == 0) break;
204 } while (true);
205 }
206
207 TEST_METHOD (TcpClientTestNotExistHost)
208 {
209 alt::SocketBuilder builder;
210
211 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
212
213 alt::TcpConnector* connector = builder.CreateTcpConnector (_T("127.0.0.1"), 80, 1, 3);
214 Assert::IsNull(connector, _T("SocketBuilder::CreateTcpConnector() failed.\n"));
215 }
216
217 TEST_METHOD (GetHostByNameTest)
218 {
219 alt::SocketBuilder builder;
220 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
221
222 alt::TString buff1 (80);
223 BOOL ret = builder.GetHostByName (_T("localhost"), buff1.Ptr());
224 Assert::IsTrue (ret, _T("SocketBuilder::GetHostByName() failed.\n"));
225 Assert::AreEqual (_T ("127.0.0.1"), buff1.Ptr (), _T("SocketBuilder::GetHostByName() invalid response.\n"));
226 buff1 += _T ("\n");
227 Logger::WriteMessage (buff1.Ctr ());
228
229 alt::TString buff2 (80);
230 ret = builder.GetHostByName (_T ("jjy.nict.go.jp"), buff2.Ptr ());
231 Assert::IsTrue (ret, _T("SocketBuilder::GetHostByName() failed.\n"));
232 Assert::AreEqual (_T ("133.243.3.26"), buff2.Ptr (), _T("SocketBuilder::GetHostByName() invalid response.\n"));
233 buff2 += _T ("\n");
234 Logger::WriteMessage (buff2.Ctr ());
235 }
236
237 TEST_METHOD (TcpWaitBlockCancelTest)
238 {
239 alt::SocketBuilder builder;
240 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
241
242 alt::Thread* serverThread = new alt::Thread ();
243 auto serverFunction = [](LPVOID lpvParam)->DWORD
244 {
245 Logger::WriteMessage ("[Server]Now start server thread.\n");
246
247 alt::SocketBuilder* pBuilder = (alt::SocketBuilder*)lpvParam;
248 Assert::IsTrue(pBuilder->Prepare (50000), _T("SocketBuilder::Prepare() failed.\n"));
249
250 Logger::WriteMessage ("[Server]Now waiting.\n");
251 alt::TcpConnector* connector = pBuilder->Wait ();
252 Assert::IsNull(connector, _T("SocketBuilder::Wait() failed.\n"));
253
254 Logger::WriteMessage ("[Server]Now finish server thread.\n");
255 return 0;
256 };
257
258 Assert::IsTrue(serverThread->Create (serverFunction, &builder), _T("Thread::Create() failed.\n"));
259 Sleep (1000);
260
261 alt::Thread* clientThread = new alt::Thread ();
262 auto clientFunction = [](LPVOID lpvParam)->DWORD
263 {
264 Logger::WriteMessage ("[Client]Now start client thread.\n");
265
266 alt::SocketBuilder* pBuilder = (alt::SocketBuilder*)lpvParam;
267
268 Sleep (5000);
269 Logger::WriteMessage ("[Client]fire cancel action.\n");
270 Assert::IsTrue(pBuilder->CancelWait ());
271
272 Logger::WriteMessage ("[Client]Now finish client thread.\n");
273 return 0;
274 };
275
276 Assert::IsTrue (clientThread->Create (clientFunction, &builder), _T ("Thread::Create() failed.\n"));
277 Sleep (1000);
278
279 Assert::AreEqual(WAIT_OBJECT_0, serverThread->Wait (60000), _T("Thread::Wait() failed.\n"));
280 Logger::WriteMessage ("Server thread finished.\n");
281
282 delete serverThread;
283 Logger::WriteMessage ("Finished.\n");
284 }
285
286 TEST_METHOD (TcpRecvBlockCancelTest)
287 {
288 alt::Thread* serverThread = new alt::Thread ();
289 alt::TcpConnector* connector = nullptr;
290
291 auto serverFunction = [](LPVOID lpvParam)->DWORD
292 {
293 Logger::WriteMessage ("[Server]Now start server thread.\n");
294
295 alt::TcpConnector* connector = (alt::TcpConnector*)lpvParam;
296
297 alt::SocketBuilder builder;
298 Assert::AreEqual(0, builder.Startup (), _T("SocketBuilder::Startup() failed.\n"));
299 Assert::IsTrue(builder.Prepare (50000), _T("SocketBuilder::Prepare() failed.\n"));
300 connector = builder.Wait ();
301 Assert::IsNotNull(connector, _T("SocketBuilder::Wait() failed.\n"));
302
303 BYTE byBuf[1024]{ 0 };
304
305 Logger::WriteMessage ("[Server]Now waiting.\n");
306 INT ret = connector->Recv (byBuf, sizeof (byBuf));
307 Logger::WriteMessage ("[Server]Now unblocked.\n");
308
309 Logger::WriteMessage ("[Server]Now finish server thread.\n");
310 return 0;
311 };
312
313 alt::Thread* clientThread = new alt::Thread ();
314 auto clientFunction = [](LPVOID lpvParam)->DWORD
315 {
316 Logger::WriteMessage ("[Client]Now start client thread.\n");
317
318 alt::TcpConnector* counter = (alt::TcpConnector*)lpvParam;
319
320 alt::SocketBuilder builder;
321 Assert::AreEqual(0, builder.Startup (),_T("[Client]SocketBuilder::Startup() failed.\n"));
322 alt::TcpConnector* connector = builder.CreateTcpConnector (_T ("127.0.0.1"), 50000, 1, 10);
323 Assert::IsNotNull (connector, _T("[Client]SocketBuilder::CreateTcpConnector() failed.\n"));
324
325 alt::TString message;
326 LPCTSTR lpctszIPAddress = connector->GetAcceptedAddress ();
327 USHORT wPort = connector->GetAcceptedPortNo ();
328 message.Format (_T ("[Client]SocketBuilder::CreateTcpConnector() success. from %s:%d\n"), lpctszIPAddress, wPort);
329 Logger::WriteMessage (message.Ctr());
330
331 Sleep (5000); // 5 seconds.
332 Logger::WriteMessage ("[Client]Now force unblocked by CancelRecv().\n");
333 counter->CancelRecv ();
334
335 Assert::AreEqual(0, connector->Close (), _T("[Client]TcpConnector::Close() failed.\n"));
336
337 Logger::WriteMessage ("[Client]Now finish client thread.\n");
338 return 0;
339 };
340
341 Assert::IsTrue(serverThread->Create (serverFunction, &connector), _T("serverThread.Create() failed.\n"));
342 Sleep (1000);
343 Assert::IsTrue(clientThread->Create (clientFunction, &connector), _T("clientThread.Create() failed.\n"));
344 Sleep (1000);
345
346 Assert::AreEqual(WAIT_OBJECT_0, clientThread->Wait (), _T("clientThread.Wait() failed.\n"));
347 Logger::WriteMessage ("Client thread finished.\n");
348 Assert::AreEqual(WAIT_OBJECT_0, serverThread->Wait (), _T("serverThread.Wait() failed.\n"));
349 Logger::WriteMessage ("Server thread finished.\n");
350
351 delete clientThread;
352 delete serverThread;
353 Logger::WriteMessage ("Finished.\n");
354 }
355 };
356}
ソケットに関するWindowsAPIを集約したクラス
文字列に関するWindowsAPIを集約したクラス
TCP通信に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
汎用的に使えるユーティリティクラス
プリコンパイル済みヘッダー ファイルです。
ソケットに関するWindowsAPIを集約したクラス
Definition: SocketBuilder.h:18
int APIENTRY Startup()
Windowsソケットの使用準備
BOOL APIENTRY Prepare(u_short portNo, LPCTSTR lpctszIpAddr=NULL)
TCPポートのlisten(),accept()の準備
BOOL CancelWait()
Wait()待機中のキャンセル処理
TcpConnector *APIENTRY CreateTcpConnector(LPCTSTR lpctszIpAddr, u_short portNo, int retryInterval, int retryCount)
TcpConnectorの作成
BOOL APIENTRY GetHostByName(LPCTSTR lpctszHostName, LPCTSTR lptszIpAddr) const
ホスト名からIPアドレスのDNS解決
TcpConnector *APIENTRY Wait()
TCP接続のlisten(),accept()待機関数
DWORD APIENTRY GetErrNo() const
WinSock API呼び出し時にエラーとなった時、 エラーの詳細を返します。
int APIENTRY Close()
ソケットが使用されていた場合、クローズします。
文字列に関するWindowsAPIを集約したクラス
Definition: TString.h:17
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
Definition: TString.cpp:333
INT APIENTRY Byte() const
内部で確保している文字列(バイト数)を取得します。
Definition: TString.cpp:44
INT APIENTRY Len() const
内部で確保している文字列数を取得します。
Definition: TString.cpp:39
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:46
LPTSTR APIENTRY Ptr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:42
BOOL APIENTRY FromMultiByte(LPCSTR lpcszSJIS, UINT codePage=CP_ACP)
マルチバイト文字列を取り込みます。
Definition: TString.cpp:350
TCP通信に関するWindowsAPIを集約したクラス
Definition: TcpConnector.h:17
INT APIENTRY Recv(LPVOID lpvBuf, DWORD dwSize, BOOL isBlocking=TRUE)
TCP受信処理
USHORT GetAcceptedPortNo()
受入先のポート番号を取得
Definition: TcpConnector.h:32
BOOL CancelRecv()
Recv()待機中のキャンセル処理
LPCTSTR GetAcceptedAddress()
受け入れ先のIPアドレスを取得
Definition: TcpConnector.h:28
INT APIENTRY Send(LPVOID lpvBuf, DWORD dwSize) const
TCP送信処理
スレッドに関するWindowsAPIを集約したクラス
Definition: Thread.h:43
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
Definition: Thread.cpp:24
static const TString APIENTRY MakeGUID()
GUIDの作成
Definition: Utility.cpp:22
static SYSTEMTIME APIENTRY GetLocalTime()
ローカル時間の取得
Definition: Utility.cpp:46
static TString APIENTRY GetFormatTime(const SYSTEMTIME &systemTime)
SYSTEMTIME構造体の値を文字列化
Definition: Utility.cpp:55
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19