TNB Library
TnbCommunication.h
[詳解]
1#pragma once
11#include "TnbStr.h"
12#include "TnbReportViewer.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
34{
38 enum EState
39 {
43 };
44
48 struct TProperty
49 {
51 DWORD typeId;
56 TProperty(LPCTSTR lpszName, DWORD id, DWORD to = 0, size_t sendSize = INVALID_SIZE, size_t recvSize = INVALID_SIZE)
57 : typeName(lpszName), typeId(id), receiveTimeout(to), sendPacketSize(sendSize), receivePacketSize(INVALID_SIZE)
58 {}//デフォルトは、受信待ち時間0ms、送受信パケットサイズ、なし。
59 };
60
62 virtual ~ICommunication(void) {}
63
69 virtual const TProperty& GetProperty(void) const = 0;
70
79 virtual bool SetReceiveTimeout(DWORD to) = 0;
80
86 virtual bool Open(void) = 0;
87
91 virtual void Close(void) = 0;
92
98 virtual bool IsOpened(void) const = 0;
99
105 virtual bool IsConnect(void) const { return IsOpened(); }
106
112 virtual bool CanSend(void) const { return IsOpened(); }
113
119 virtual bool CanReceive(void) const { return IsOpened(); }
120
128 virtual size_t Send(size_t size, LPCVOID P) = 0;
129
138 virtual size_t Receive(size_t size, LPVOID _P) = 0;
139
146 virtual size_t GetReceivingDataSize(void) const { return INVALID_SIZE; }
147
156 virtual EState Check(void) const { return IsOpened() ? (IsConnect() ? CONNECTING : OPENNING) : CLOSED; }
157
163 virtual void Purge(void) {}
164};
165
166
167
168#ifndef _WIN32_WCE
169
192inline size_t BlockingReadFile(HANDLE hFile, HANDLE hEvent, DWORD wait, size_t size, LPVOID _P)
193{
194 OVERLAPPED overLapped = { 0 };
195 HANDLE hMyEvent = NULL;
196 if ( hEvent == NULL )
197 {
198 hMyEvent = ::CreateEvent(NULL, FALSE, TRUE, NULL);
199 ::ResetEvent(hMyEvent);
200 hEvent = hMyEvent;
201 }
202 overLapped.hEvent = hEvent;
203 DWORD dwRc = ULONG_MAX;
204 DWORD work = ULONG_MAX;
205 if ( ::ReadFile(hFile, _P, ToDword(size), &dwRc, &overLapped) )
206 {
207 // 成功
208 }
209 else if ( ::GetLastError() == ERROR_IO_PENDING )
210 {
211 // 非同期読み取り操作の結果をチェックする。
212 ::Sleep(0);
213 if( ::GetOverlappedResult(hFile, &overLapped, &work, FALSE) )
214 {
215 dwRc = work; // 成功
216 }
217 else if ( ::GetLastError() == ERROR_IO_INCOMPLETE )
218 {
219 switch ( ::WaitForSingleObject(overLapped.hEvent, wait) )
220 {
221 case WAIT_OBJECT_0:
222 if ( ::GetOverlappedResult(hFile, &overLapped, &work, FALSE) )
223 {
224 dwRc = work; // 成功
225 }
226 break;
227 case WAIT_TIMEOUT:
228 dwRc = 0;
229 break;
230 case WAIT_ABANDONED:
231 case WAIT_FAILED:
232 default:
233 break;
234 }
235 }
236 }
237 ::CancelIo(hFile);
238 if ( hMyEvent != NULL )
239 {
240 ::CloseHandle(hMyEvent);
241 }
242 return dwRc;
243}
244
245#else // _WIN32_WCE
246
247inline size_t BlockingReadFile(HANDLE hFile, HANDLE hEvent, DWORD wait, size_t size, LPVOID _P)
248{
249 DWORD dwRc = ULONG_MAX;
250 if ( ::ReadFile(hFile, _P, ToDword(size), &dwRc, NULL) )
251 {
252 return dwRc;
253 }
254 _GetLastError("ReadFile");
255 return INVALID_SIZE;
256}
257
258#endif // _WIN32_WCE
259
260
261
262
263}; // TNB
レポートビュワー関係のヘッダ
文字列管理関係のヘッダ
size_t BlockingReadFile(HANDLE hFile, HANDLE hEvent, DWORD wait, size_t size, LPVOID _P)
EVENT、Wait時間付き ReadFile関数
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
TNB Library
Definition: TnbDoxyTitle.txt:2
性能プロパティ型.
size_t sendPacketSize
送信パケットサイズ。INVALID_SIZE なら制限なし。
DWORD receiveTimeout
受信待ち時間。 INFINITE ならブロックされる。
size_t receivePacketSize
受信パケットサイズ。INVALID_SIZE なら制限なし。
TProperty(LPCTSTR lpszName, DWORD id, DWORD to=0, size_t sendSize=INVALID_SIZE, size_t recvSize=INVALID_SIZE)
コンストラクタ
通信インターフェース
virtual EState Check(void) const
[確認] チェック.
virtual bool SetReceiveTimeout(DWORD to)=0
[設定] 受信待ち時間設定.
virtual bool Open(void)=0
[処理] オープン.
virtual bool IsOpened(void) const =0
[確認] オープン確認.
virtual bool CanSend(void) const
[確認] 送信可能確認.
virtual const TProperty & GetProperty(void) const =0
[取得] 性能取得.
virtual void Close(void)=0
[処理] クローズ.
virtual size_t Send(size_t size, LPCVOID P)=0
[処理] 送信.
virtual void Purge(void)
[処理] パージ.
virtual bool IsConnect(void) const
[確認] 接続確認.
virtual bool CanReceive(void) const
[確認] 受信可能確認.
virtual size_t Receive(size_t size, LPVOID _P)=0
[処理] 受信.
virtual size_t GetReceivingDataSize(void) const
[確認] 受信データ確認.
virtual ~ICommunication(void)
デストラクタ
@ CONNECTING
オープン&接続状態
@ CLOSED
クローズ状態
@ OPENNING
オープン状態