|
Posted on 2009-09-18 22:33 S.l.e!ep.¢% 阅读(602) 评论(0) 编辑 收藏 引用 所属分类: IOCP
ICOP可以这么简单?
class
CIOCompletionPort
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
public
:
explicit
CIOCompletionPort(size_t maxConcurrency);
~
CIOCompletionPort();
![](/Images/OutliningIndicators/InBlock.gif)
void
AssociateDevice(HANDLE hDevice, ULONG_PTR completionKey);
![](/Images/OutliningIndicators/InBlock.gif)
void
PostStatus(ULONG_PTR completionKey, DWORD dwNumBytes
=
0
, OVERLAPPED
*
pOverlapped
=
0
);
![](/Images/OutliningIndicators/InBlock.gif)
void
GetStatus(ULONG_PTR
*
pCompletionKey, PDWORD pdwNumBytes, OVERLAPPED
**
ppOverlapped);
![](/Images/OutliningIndicators/InBlock.gif)
bool
GetStatus(ULONG_PTR
*
pCompletionKey, PDWORD pdwNumBytes, OVERLAPPED
**
ppOverlapped, DWORD dwMilliseconds);
![](/Images/OutliningIndicators/InBlock.gif)
private
:
HANDLE m_iocp;
![](/Images/OutliningIndicators/InBlock.gif)
//
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))
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if
(m_iocp
==
0
)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw
CWin32Exception(_T(
"
CIOCompletionPort::CIOCompletionPort() - CreateIoCompletionPort
"
), ::GetLastError());
}
}
CIOCompletionPort::
~
CIOCompletionPort()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
::CloseHandle(m_iocp);
}
void
CIOCompletionPort::AssociateDevice(
HANDLE hDevice,
ULONG_PTR completionKey)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if
(m_iocp
!=
::CreateIoCompletionPort(hDevice, m_iocp, completionKey,
0
))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw
CWin32Exception(_T(
"
CIOCompletionPort::AssociateDevice() - CreateIoCompletionPort
"
), ::GetLastError());
}
}
void
CIOCompletionPort::PostStatus(
ULONG_PTR completionKey,
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) DWORD dwNumBytes
/**/
/*
= 0
*/
,
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) OVERLAPPED
*
pOverlapped
/**/
/*
= 0
*/
)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if
(
0
==
::PostQueuedCompletionStatus(m_iocp, dwNumBytes, completionKey, pOverlapped))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw
CWin32Exception(_T(
"
CIOCompletionPort::PostStatus() - PostQueuedCompletionStatus
"
), ::GetLastError());
}
}
void
CIOCompletionPort::GetStatus(
ULONG_PTR
*
pCompletionKey,
PDWORD pdwNumBytes,
OVERLAPPED
**
ppOverlapped)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if
(
0
==
::GetQueuedCompletionStatus(m_iocp, pdwNumBytes, pCompletionKey, ppOverlapped, INFINITE))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw
CWin32Exception(_T(
"
CIOCompletionPort::GetStatus() - GetQueuedCompletionStatus
"
), ::GetLastError());
}
}
bool
CIOCompletionPort::GetStatus(
ULONG_PTR
*
pCompletionKey,
PDWORD pdwNumBytes,
OVERLAPPED
**
ppOverlapped,
DWORD dwMilliseconds)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
bool
ok
=
true
;
![](/Images/OutliningIndicators/InBlock.gif)
if
(
0
==
::GetQueuedCompletionStatus(m_iocp, pdwNumBytes, pCompletionKey, ppOverlapped, dwMilliseconds))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DWORD lastError
=
::GetLastError();
![](/Images/OutliningIndicators/InBlock.gif)
if
(lastError
!=
WAIT_TIMEOUT)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw
CWin32Exception(_T(
"
CIOCompletionPort::GetStatus() - GetQueuedCompletionStatus
"
), lastError);
}
ok
=
false
;
}
return
ok;
}
SURE,IOCP 在WINDOWS下是一种机制,一种高效的IO访问机制,‘IO’不仅仅只限于网络,这样就变得简单多了!
|