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);
}

目录
相关文章
|
8月前
|
API C++
c++进阶篇——初窥多线程(三)cpp中的线程类
C++11引入了`std::thread`,提供对并发编程的支持,简化多线程创建并增强可移植性。`std::thread`的构造函数包括默认构造、移动构造及模板构造(支持函数、lambda和对象)。`thread::get_id()`获取线程ID,`join()`确保线程执行完成,`detach()`使线程独立,`joinable()`检查线程状态,`operator=`仅支持移动赋值。`thread::hardware_concurrency()`返回CPU核心数,可用于高效线程分配。
|
9月前
|
Linux API C++
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
【C++ 线程包裹类设计】跨平台C++线程包装类:属性设置与平台差异的全面探讨
155 2
|
9月前
|
消息中间件 Linux API
跨进程通信设计:Qt 进程间通讯类全面解析
跨进程通信设计:Qt 进程间通讯类全面解析
625 0
|
设计模式 Kubernetes 监控
Go编程模式 - 8-装饰、管道和访问者模式
装饰、管道和访问者模式的使用频率不高,但在特定场景下会显得很酷
48 0
开门小例子学习观察者模式&事件与委托
3.2.一个喊话人(喊话人有权限),多个拿钥匙开门的人(每个人负责不同的门):米老师大喊给我开一下水麒麟的门——>此时听到消息并且拿着水麒麟钥匙的人就会过来开门
|
Java
Java内部类大全(含代码例子)
写在一个类里面的类就叫内部类
110 0
|
设计模式 Java Android开发
跨进程单例 | Andorid进程通信AIDL原理及应用
设计模式中的单例模式在多进程场景下会演变成多例,存在线程安全问题。本文通过跨进程通信机制让多进程共享单例。
461 0
|
Android开发
事件分发四部曲之二《嵌套滑动事件分析》
事件分发四部曲之二《嵌套滑动事件分析》
事件分发四部曲之二《嵌套滑动事件分析》
|
设计模式 存储 Java
监听器模式和观察者模式的关系,写点你不知道的
监听器模式和观察者模式的关系,写点你不知道的
584 0
监听器模式和观察者模式的关系,写点你不知道的
|
存储 安全 C语言
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
223 0

热门文章

最新文章