牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

IOCP包裹类

头文件:
/**********************************************************************
* Copyright (C) 2008 -  - All Rights Reserved
*
* 文件名称:        IOCP.h
* 摘    要:        IOCP包裹类
*     
* 作    者:        yanglinbo, 
* 修    改:        查看文件最下方.

**********************************************************************
*/

#ifndef __IOCP_H__
#define __IOCP_H__


#include <assert.h>
#include <WinSock2.h>


//////////////////////////////////////////////////////////////////////////
/// IOCP包装类,完成IOCP创建,关联等动作
//////////////////////////////////////////////////////////////////////////
class CIOCP
{
public:
    CIOCP(int nMaxConcurrency = -1);
    virtual ~CIOCP(void);

    CIOCP& operator = (const CIOCP& rht);
    CIOCP& operator = (const HANDLE& rht);

    operator HANDLE() const;

    /// 创建IOCP
    
/// @param [in] nMaxConcurrency 最大线程数
    BOOL Create(int nMaxConcurrency);

    /// 销毁IOCP
    BOOL Destroy();

    /// 完全端口是否有效
    BOOL IsValid() const;

    /// 关联指定SOCKET及参数到IOCP
    
/// @param [in] socket
    
/// @param [in] CompKey
    BOOL AssociateSocket(SOCKET socket, ULONG_PTR CompKey);

    /// 发送通知到IOCP
    
/// @param [in] CompKey
    
/// @param [in] dwNumBytes
    
/// @param [in] po
    BOOL PostStatus(ULONG_PTR CompKey, DWORD dwNumBytes = 0, OVERLAPPED* po = NULL);

    /// 取得IOCP状态
    
/// @param [in] pCompKey
    
/// @param [in] pdwNumBytes
    
/// @param [in] ppo
    
/// @param [in] dwMilliseconds
    BOOL GetStatus(ULONG_PTR* pCompKey, PDWORD pdwNumBytes, OVERLAPPED** ppo, DWORD dwMilliseconds = INFINITE);

private:
    HANDLE        m_hIOCP;    ///< IOCP句柄
};


#endif


cpp文件:
/**********************************************************************
* Copyright (C) 2008 -  - All Rights Reserved
*
* 文件名称:        IOCP.cpp
* 摘    要:        IOCP包裹类
*     
* 作    者:        yanglinbo, 
* 修    改:        查看文件最下方.

**********************************************************************
*/


#include 
"StdAfx.h" 
#include 
"IOCP.h"


CIOCP::CIOCP( 
int nMaxConcurrency /*= -1*/ )
: m_hIOCP(INVALID_HANDLE_VALUE)
{
    
if (nMaxConcurrency != -1)
    
{
        Create(nMaxConcurrency);
    }

}


CIOCP::
~CIOCP( void )
{
    Destroy();
}


CIOCP
& CIOCP::operator=const CIOCP& rht )
{
    m_hIOCP 
= rht.m_hIOCP;
    
return *this;
}


CIOCP
& CIOCP::operator=const HANDLE& rht )
{
    m_hIOCP 
= rht;
    
return *this;
}


CIOCP::
operator HANDLE() const
{
    
return (HANDLE)(this == NULL ? NULL : m_hIOCP);
}


BOOL CIOCP::Create( 
int nMaxConcurrency )
{
    m_hIOCP 
= ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nMaxConcurrency);
    ASSERT(IsValid());
    
return IsValid();
}


BOOL CIOCP::Destroy()
{
    
if (IsValid() == FALSE) return TRUE;

    BOOL bClosed 
= ::CloseHandle(m_hIOCP);
    m_hIOCP 
= INVALID_HANDLE_VALUE;

    
return bClosed;
}


BOOL CIOCP::AssociateSocket( SOCKET socket, ULONG_PTR CompKey )
{
    ASSERT(IsValid());
    
if ( IsValid() == FALSE ) return FALSE;
    
return (::CreateIoCompletionPort((HANDLE)socket, m_hIOCP, CompKey, 0== m_hIOCP);
}


BOOL CIOCP::PostStatus( ULONG_PTR CompKey, DWORD dwNumBytes 
/*= 0*/, OVERLAPPED* po /*= NULL*/ )
{
    ASSERT(IsValid());
    
if ( IsValid() == FALSE ) return FALSE;
    
return ::PostQueuedCompletionStatus(m_hIOCP, dwNumBytes, CompKey, po);
}


BOOL CIOCP::GetStatus( ULONG_PTR
* pCompKey, PDWORD pdwNumBytes, OVERLAPPED** ppo, DWORD dwMilliseconds /*= INFINITE*/ )
{
    ASSERT(IsValid());
    
if ( IsValid() == FALSE ) return FALSE;
    
return ::GetQueuedCompletionStatus(m_hIOCP, pdwNumBytes, pCompKey, ppo, dwMilliseconds);
}


BOOL CIOCP::IsValid() 
const
{
    
return (m_hIOCP != NULL) && (m_hIOCP != INVALID_HANDLE_VALUE);
}

posted on 2012-07-16 18:38 杨粼波 阅读(1080) 评论(0)  编辑 收藏 引用 所属分类: 网络编程C++Windows


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理