|
Posted on 2009-09-18 22:33 S.l.e!ep.¢% 閱讀(628) 評論(0) 編輯 收藏 引用 所屬分類: IOCP
ICOP可以這么簡單?
class
?CIOCompletionPort

{
public
:
????
explicit
?CIOCompletionPort(size_t?maxConcurrency);
????
~
CIOCompletionPort();

????
void
?AssociateDevice(HANDLE?hDevice,?ULONG_PTR?completionKey);

????
void
?PostStatus(ULONG_PTR?completionKey,?DWORD?dwNumBytes?
=
?
0
,?OVERLAPPED?
*
pOverlapped?
=
?
0
);

????
void
?GetStatus(ULONG_PTR?
*
pCompletionKey,?PDWORD?pdwNumBytes,?OVERLAPPED?
**
ppOverlapped);

????
bool
?GetStatus(ULONG_PTR?
*
pCompletionKey,?PDWORD?pdwNumBytes,?OVERLAPPED?
**
ppOverlapped,?DWORD?dwMilliseconds);

private
:
?HANDLE?m_iocp;

????
//
?No?copies?do?not?implement
????CIOCompletionPort(
const
?CIOCompletionPort?
&
rhs);
????CIOCompletionPort?
&
operator
=
(
const
?CIOCompletionPort?
&
rhs);
}
;
?
CIOCompletionPort::CIOCompletionPort(
???size_t?maxConcurrency)
???:??m_iocp(::CreateIoCompletionPort(INVALID_HANDLE_VALUE,?NULL,?
0
,?maxConcurrency))

{
???
if
?(m_iocp?
==
?
0
)
 ???
{
??????
throw
?CWin32Exception(_T(
"
CIOCompletionPort::CIOCompletionPort()?-?CreateIoCompletionPort
"
),?::GetLastError());
???}
}
CIOCompletionPort::
~
CIOCompletionPort()?

{?
???::CloseHandle(m_iocp);
}
void
?CIOCompletionPort::AssociateDevice(
???HANDLE?hDevice,?
???ULONG_PTR?completionKey)?

{
???
if
?(m_iocp?
!=
?::CreateIoCompletionPort(hDevice,?m_iocp,?completionKey,?
0
))
 ???
{
??????
throw
?CWin32Exception(_T(
"
CIOCompletionPort::AssociateDevice()?-?CreateIoCompletionPort
"
),?::GetLastError());
???}
}
void
?CIOCompletionPort::PostStatus(
???ULONG_PTR?completionKey,?
 ???DWORD?dwNumBytes?
/**/
/*
?=?0?
*/
,?
 ???OVERLAPPED?
*
pOverlapped?
/**/
/*
?=?0?
*/
)?

{
???
if
?(
0
?
==
?::PostQueuedCompletionStatus(m_iocp,?dwNumBytes,?completionKey,?pOverlapped))
 ???
{
??????
throw
?CWin32Exception(_T(
"
CIOCompletionPort::PostStatus()?-?PostQueuedCompletionStatus
"
),?::GetLastError());
???}
}
void
?CIOCompletionPort::GetStatus(
???ULONG_PTR?
*
pCompletionKey,?
???PDWORD?pdwNumBytes,
???OVERLAPPED?
**
ppOverlapped)

{
???
if
?(
0
?
==
?::GetQueuedCompletionStatus(m_iocp,?pdwNumBytes,?pCompletionKey,?ppOverlapped,?INFINITE))
 ???
{
??????
throw
?CWin32Exception(_T(
"
CIOCompletionPort::GetStatus()?-?GetQueuedCompletionStatus
"
),?::GetLastError());
???}
}
bool
?CIOCompletionPort::GetStatus(
???ULONG_PTR?
*
pCompletionKey,?
???PDWORD?pdwNumBytes,
???OVERLAPPED?
**
ppOverlapped,?
???DWORD?dwMilliseconds)

{
???
bool
?ok?
=
?
true
;

???
if
?(
0
?
==
?::GetQueuedCompletionStatus(m_iocp,?pdwNumBytes,?pCompletionKey,?ppOverlapped,?dwMilliseconds))
 ???
{
??????DWORD?lastError?
=
?::GetLastError();

??????
if
?(lastError?
!=
?WAIT_TIMEOUT)
 ??????
{
?????????
throw
?CWin32Exception(_T(
"
CIOCompletionPort::GetStatus()?-?GetQueuedCompletionStatus
"
),?lastError);
??????}
??????ok?
=
?
false
;
???}
???
return
?ok;
}
SURE,IOCP 在WINDOWS下是一種機制,一種高效的IO訪問機制,‘IO’不僅僅只限于網(wǎng)絡(luò),這樣就變得簡單多了!
|