Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
UDPPerformanceCheck.cpp
[詳解]
1
5
6#include "pch.h"
8
9using namespace PerfCheck;
10
11// --------------------------------------------------------------------
14// --------------------------------------------------------------------
15
17 :PerformanceCheck (console)
18{
19
20}
21
23{
24
25}
26
28{
29 alt::Thread threadServer;
30 alt::Thread threadClient;
31
32 auto funcServer = [](LPVOID lpvParam)->DWORD { DriveUdpController1 (); return 0; };
33 auto funcClient = [](LPVOID lpvParam)->DWORD { DriveUdpController2 (); return 0; };
34
35 threadServer.Create (funcServer);
36 threadClient.Create (funcClient);
37
38 threadClient.Wait ();
39 threadServer.Wait ();
40
41 return TRUE;
42}
43
45{
46 _tprintf (_T ("DriveUdpController1ConsoleHandler(%d) IN.\n"), dwType);
47
48 BOOL ret = FALSE;
49
50 switch (dwType)
51 {
52 case 0: // Ctrl + C
53 case 1: // Ctrl + Break
55 ret = TRUE; // 終了させません。
56 break;
57
58 case 2: // Console Close
59 case 3: // Log off
60 case 4: // Shut down
61 ret = FALSE; // 次に委ねます。
62 break;
63 }
64
65 _tprintf (_T ("DriveUdpController1ConsoleHandler(%d) OUT.\n"), dwType);
66 return ret;
67}
68
70{
71 _tprintf (_T ("DriveUdpController1() IN.\n"));
72
73 DWORD dwRet;
74 alt::TString ipAddress (MAX_PATH);
75 USHORT wPort;
76
77 dwRet = ::GetPrivateProfileString (SECTION_UDP_CONTROLLER_1, KEYWORD_IP_ADDRESS, nullptr, ipAddress.Ptr (), MAX_PATH, CONFIG_FILE);
78 if (dwRet == 0)
79 {
80 _tprintf (_T ("IPAddressの指定が見つかりません。\n"));
81 return;
82 }
83
84 wPort = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_1, KEYWORD_PORT, 0, CONFIG_FILE);
85 if (wPort == 0)
86 {
87 _tprintf (_T ("Portの指定が見つかりません。\n"));
88 return;
89 }
90
91 int kickOffValue = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_1, KEYWORD_KICK_OFF, 0, CONFIG_FILE);
92 bool kickOff = kickOffValue == 1 ? true : false;
93
94 alt::TString ipAddressCounter (MAX_PATH);
95 USHORT wPortCounter;
96
97 dwRet = ::GetPrivateProfileString (SECTION_UDP_CONTROLLER_2, KEYWORD_IP_ADDRESS, nullptr, ipAddressCounter.Ptr (), MAX_PATH, CONFIG_FILE);
98 if (dwRet == 0)
99 {
100 _tprintf (_T ("対向IPAddressの指定が見つかりません。\n"));
101 return;
102 }
103
104 wPortCounter = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_2, KEYWORD_PORT, 0, CONFIG_FILE);
105 if (wPortCounter == 0)
106 {
107 _tprintf (_T ("対向Portの指定が見つかりません。\n"));
108 return;
109 }
110
111 auto object = std::make_unique<UdpController> ();
112 __udpController1 = object.get ();
113
114 SetConsoleCtrlHandler (DriveUdpController1ConsoleHandler, TRUE);
115
116 object->Init ();
117 object->Start (ipAddress.Ctr (), wPort, ipAddressCounter.Ctr (), wPortCounter, kickOff);
118
119 _tprintf (_T ("DriveUdpController1() OUT.\n"));
120}
121
123{
124 _tprintf (_T ("DriveUdpController2ConsoleHandler(%d) IN.\n"), dwType);
125
126 BOOL ret = FALSE;
127
128 switch (dwType)
129 {
130 case 0: // Ctrl + C
131 case 1: // Ctrl + Break
133 ret = TRUE; // 終了させません。
134 break;
135
136 case 2: // Console Close
137 case 3: // Log off
138 case 4: // Shut down
139 ret = FALSE; // 次に委ねます。
140 break;
141 }
142
143 _tprintf (_T ("DriveUdpController2ConsoleHandler(%d) OUT.\n"), dwType);
144 return ret;
145}
146
148{
149 _tprintf (_T ("DriveUdpController2() IN.\n"));
150
151 DWORD dwRet;
152 alt::TString ipAddress (MAX_PATH);
153 USHORT wPort;
154
155 dwRet = ::GetPrivateProfileString (SECTION_UDP_CONTROLLER_2, KEYWORD_IP_ADDRESS, nullptr, ipAddress.Ptr (), MAX_PATH, CONFIG_FILE);
156 if (dwRet == 0)
157 {
158 _tprintf (_T ("IPAddressの指定が見つかりません。\n"));
159 return;
160 }
161
162 wPort = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_2, KEYWORD_PORT, 0, CONFIG_FILE);
163 if (wPort == 0)
164 {
165 _tprintf (_T ("Portの指定が見つかりません。\n"));
166 return;
167 }
168
169 int kickOffValue = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_2, KEYWORD_KICK_OFF, 0, CONFIG_FILE);
170 bool kickOff = kickOffValue == 1 ? true : false;
171
172 alt::TString ipAddressCounter (MAX_PATH);
173 USHORT wPortCounter;
174
175 dwRet = ::GetPrivateProfileString (SECTION_UDP_CONTROLLER_1, KEYWORD_IP_ADDRESS, nullptr, ipAddressCounter.Ptr (), MAX_PATH, CONFIG_FILE);
176 if (dwRet == 0)
177 {
178 _tprintf (_T ("対向IPAddressの指定が見つかりません。\n"));
179 return;
180 }
181
182 wPortCounter = ::GetPrivateProfileInt (SECTION_UDP_CONTROLLER_1, KEYWORD_PORT, 0, CONFIG_FILE);
183 if (wPortCounter == 0)
184 {
185 _tprintf (_T ("対向Portの指定が見つかりません。\n"));
186 return;
187 }
188
189 auto object = std::make_unique<UdpController> ();
190 __udpController2 = object.get ();
191
192 SetConsoleCtrlHandler (DriveUdpController2ConsoleHandler, TRUE);
193
194 object->Init ();
195 object->Start (ipAddress.Ctr (), wPort, ipAddressCounter.Ctr (), wPortCounter, kickOff);
196
197 _tprintf (_T ("DriveUdpController2() OUT.\n"));
198}
199
201{
202 _tprintf (_T ("UdpController::UdpController() IN.\n"));
203
204 _stop = false;
206 _connector = nullptr;
208
209 _tprintf (_T ("UdpController::UdpController() OUT.\n"));
210}
211
213{
214 _tprintf (_T ("UdpController::~UdpController() IN.\n"));
215
216 if (_connector) _connector->Close ();
217 _thread->Close ();
218
219 delete _connector;
220 delete _builder;
221 delete _thread;
222
223 _tprintf (_T ("UdpController::~UdpController() OUT.\n"));
224}
225
227{
228 _tprintf (_T ("UdpController::Init() CALL.\n"));
229
230 return _builder->Startup () == 0 ? true : false;
231}
232
233bool UdpController::Start (LPCTSTR lpctszIP, USHORT wPort, LPCTSTR lpctszTargetIP, USHORT wTargetPort, bool kickOff)
234{
235 _tprintf (_T ("UdpController::Start(IP:%s, Port:%d, kickoff:%d) IN.\n"), lpctszIP, wPort, kickOff);
236
237 _connector = _builder->CreateUdpConnector (lpctszIP, wPort);
238 if (_connector)
239 {
240 _connector->SetSockAddr (lpctszTargetIP, wTargetPort);
241 if (kickOff)
242 {
243 BYTE byData[DATA_SIZE];
244 DWORD dwDataLen;
245 dwDataLen = MakeData (byData);
246
247 INT ret = _connector->Send (byData, dwDataLen);
248 if ((DWORD)ret != dwDataLen)
249 {
250 _tprintf (_T ("UdpController::Start() Send() invalid send size (%d). reason=%d \n"), ret, _connector->GetErrNo ());
251 }
252 }
253
254 _thread->Create ();
255 _thread->Wait ();
256 }
257
258 _tprintf (_T ("UdpController::Start(IP:%s, Port:%d, kickoff:%d) OUT.\n"), lpctszIP, wPort, kickOff);
259 return true;
260}
261
262bool UdpController::SetClient (LPCTSTR lpctszIP, USHORT wPort)
263{
264 _tprintf (_T ("UdpController::SetClient(IP:%s, Port:%d) IN.\n"), lpctszIP, wPort);
265 _tprintf (_T ("UdpController::SetClient(IP:%s, Port:%d) OUT.\n"), lpctszIP, wPort);
266 return true;
267}
268
270{
271 _tprintf (_T ("UdpController::Stop() CALL.\n"));
272 _stop = true;
273 _connector->Close ();
274}
275
276DWORD UdpController::Invoke (LPVOID lpvParam)
277{
278 _tprintf (_T ("UdpController::Invoke(LPVOID) IN.\n"));
279
280 BYTE byData[DATA_SIZE]{ 0 };
281
282 int count = 0;
283 while (_stop == false)
284 {
285 INT recvSize = _connector->Recv (byData, sizeof (byData));
286 if (recvSize <= 0)
287 {
288 _tprintf (_T ("UdpController::Invoke() recvSize=%d Socket disconnected. reason:%d\n"),
289 recvSize, _connector->GetErrNo ());
290 return -1;
291 }
292#ifdef _DUMP_DATA
293 DumpData (_T ("UDP"), 0, byData, recvSize);
294#else
295 _tprintf (_T ("%d\r"), count++);
296#endif
297 int dataLen = MakeData (byData);
298
299 INT sendSize = _connector->Send (byData, dataLen);
300 if (sendSize != dataLen)
301 {
302 _tprintf (_T ("UdpController::Invoke() send=%d sended=%d Invalid send size. reason:%d\n"),
303 dataLen, sendSize, _connector->GetErrNo ());
304 return -2;
305 }
306 }
307
308 _tprintf (_T ("UdpController::Invoke(LPVOID) OUT.\n"));
309 return 0;
310 }
#define CONFIG_FILE
Definition: ConsoleDriver.h:10
void DumpData(LPCTSTR lpctszFrom, int direction, BYTE byData[], int iDataLen)
バイナリデータをコンソールにダンプします。
int MakeData(BYTE byData[])
#define KEYWORD_KICK_OFF
#define KEYWORD_PORT
#define KEYWORD_IP_ADDRESS
#define DATA_SIZE
UdpController * __udpController2
UdpController * __udpController1
BOOL DriveUdpController2ConsoleHandler(DWORD dwType)
BOOL DriveUdpController1ConsoleHandler(DWORD dwType)
void DriveUdpController2()
void DriveUdpController1()
UDP性能測定用
#define SECTION_UDP_CONTROLLER_1
#define SECTION_UDP_CONTROLLER_2
プリコンパイル済みヘッダー ファイルです。
UDPPerformanceCheck(alt::Console &console)
virtual BOOL DoAction()
処理開始
bool SetClient(LPCTSTR lpctszIP, USHORT wPort)
bool Start(LPCTSTR lpctszIP, USHORT wPort, LPCTSTR lpctszTargetIP, USHORT wTargetPort, bool kickOff)
alt::SocketBuilder * _builder
alt::UdpConnector * _connector
virtual DWORD Invoke(LPVOID lpvParam)
コールバック関数プレースホルダ
コンソールに関するクラス
Definition: Console.h:88
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
ソケットに関するWindowsAPIを集約したクラス
Definition: SocketBuilder.h:18
int APIENTRY Startup()
Windowsソケットの使用準備
UdpConnector *APIENTRY CreateUdpConnector(LPCTSTR lpctszIpAddr, u_short portNo)
UdpConnectorの作成
DWORD APIENTRY GetErrNo() const
WinSock API呼び出し時にエラーとなった時、 エラーの詳細を返します。
int APIENTRY Close()
ソケットが使用されていた場合、クローズします。
文字列に関するWindowsAPIを集約したクラス
Definition: TString.h:17
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:46
LPTSTR APIENTRY Ptr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:42
スレッドに関するWindowsAPIを集約したクラス
Definition: Thread.h:43
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
Definition: Thread.cpp:24
INT APIENTRY Send(LPVOID lpvBuf, DWORD dwSize) const
UDP送信処理
INT APIENTRY Recv(LPVOID lpvBuf, DWORD dwSize) const
UDP受信処理
BOOL APIENTRY SetSockAddr(LPCTSTR lpctszAddress, u_short portNo)
UDP送信先アドレスの設定
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
Threadクラスのスレッド実行関数を設定します。