完成端口 IOCP DEMO (网络)

本文档详细介绍了如何使用Windows的完成端口(IOCP)进行网络通信,包括创建完成端口、监听套接字、创建工作线程、投递accept请求以及资源销毁等步骤。工作线程等待完成端口事件,处理接收到的数据,并通过GetQueuedCompletionStatus获取套接字事件。资源销毁涉及工作线程退出、关闭活动连接和释放其他资源。此DEMO提供了一个清晰的IOCP网络通信实现流程。
摘要由CSDN通过智能技术生成

网络上有非常详尽的文章,见http://blog.csdn.net/piggyxp/article/details/6922277,感谢他。

完成端口是MS提供的异步通知队列模型,可用于文件读写,管道,网络通讯等,这里只涉及到网络(socket)使用完成端口。

A.完成端口使用主要步骤

  • 主线程端步骤
    1. 创建完成端口
    2. 创建监听套接字,绑定完成端口
    3. 创建工作者线程
    4. 投递accept请求
    5. ------销毁资源开始-----
    6. 发送退出通知至工作线程,等待工作线程退出
    7. 关闭完成端口
    8. 关闭所有活动的套接字
  • 工作者线程步骤
    1. 等待完成端口事件
    2. 完成事件到来,根据不同的事件处理
    3. 投递新的请求

B.主线程步骤

使用windows socket库需使用如下初始化

int WSAStartup(
  __in          WORD wVersionRequested,
  __out         LPWSADATA lpWSAData
);
退出时需要做如下清理
int WSACleanup(void);
创建完成端口
HANDLE WINAPI CreateIoCompletionPort(
  __in          HANDLE FileHandle,
  __in          HANDLE ExistingCompletionPort,
  __in          ULONG_PTR CompletionKey,
  __in          DWORD NumberOfConcurrentThreads
);

FileHandle

需要关联的句柄,可以是文件/管道/套接字。设置为NULL表示新创建一个IOCP句柄。

ExistingCompletionPort

新创建IOCP的情况下,此处设置为NULL,否则应设置为想关联之IOCP句柄。

CompletionKey

用户自定义参数,与每一个句柄相关联。此处用于可以记录每一个套接字相关的信息。

NumberOfConcurrentThreads

完成端口最大调度工作线程数。当有网络数据到达时,完成队列会唤醒工作线程进行处理。这个参数用于记录可同时唤醒的线程数。置0标识使用计算机CPU核心个数。

创建监听套接字,绑定完成端口
SOCKET WSASocket(
  __in          int af,
  __in          int type,
  __in          int protocol,
  __in          LPWSAPROTOCOL_INFO lpProtocolInfo,
  __in          GROUP g,
  __in          DWORD dwFlags
);
WSASocket(AF_INET, 
            SOCK_STREAM, 
            IPPROTO_TCP, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值