iocp_1_实现步骤.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
iocp_1_实现步骤

IOCP 是什么 以下就是IOCP的模型图,能看懂么? IOCP模型(图1.1) 一IOCP实现步骤 如果懂得了IOCP的工作原理,它实现起来是很简单的。 它的实现步骤如下: 创建好IOCP 创建Socket(socket可以是由Accept得到) 将Socket关联到IOCP socket向IOCP提交各种所需请求 IOCP操作完成之后将结果返回给socket 重复步骤3和4 ,直到socket关闭 它就那么几个步骤,但实现起来需要不少的代码。以下就以创建一个客户端的socket为例,先做部分的讲解。这里主要讲解原理,函数的参数和返回值先忽略。 1.//创建IOCP // 利用函数CreateIoCompletionPort 创建IOCP // 注意参数设置 m_hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,(ULONG_PTR)0,0); // m_hIocp 就代表一个完成端口了 2.// 创建连接型的Socket // 利用利用函数WSASocket创建 socket,必须指定WSA_FLAG_OVERLAPPED m_sockClient = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, NULL, WSA_FLAG_OVERLAPPED); // m_sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 这样也可以 // 默认为WSA_FLAG_OVERLAPPED // 以下的绑定很重要,也是容易漏掉的。(如果少了绑定,在ConnextEx 时将得到错误代码:10022—提供了一个无效的参数 sockaddr_in local_addr; ZeroMemory(local_addr, sizeof(sockaddr_in)); local_addr.sin_family = AF_INET; int irt = ::bind(m_sockClient, (sockaddr*)(local_addr), sizeof(sockaddr_in)); // m_sockClient 是创建好的socket 3.//将Socket关联到IOCP // 又利用上了CreateIoCompletionPort,它将socket关联到IOCP CreateIoCompletionPort((HANDLE)m_sockClient,m_hIocp, (ULONG_PTR)m_sockClient,0); // 已将sockClient关联到m_hIocp // (ULONG_PTR)m_sockClient 为以后识别是那个socket的操作 4.// socket向IOCP提交各种所需请求, 这里提交的是连接请求 // 代码比较长,将整个函数都拷贝了过来 BOOL CIOCP_ClientDlg::ConnectToServer() { //---------------------- LPFN_CONNECTEX m_lpfnConnectEx = NULL; DWORD dwBytes = 0; GUID GuidConnectEx = WSAID_CONNECTEX; // 重点,获得ConnectEx函数的指针 if (SOCKET_ERROR == WSAIoctl(m_sockClient, SIO_GET_EXTENSION_FUNCTION_POINTER, GuidConnectEx, sizeof (GuidConnectEx), m_lpfnConnectEx, sizeof (m_lpfnConnectEx), dwBytes, 0, 0)) { TRACE( WSAIoctl is failed. Error code = %d, WSAGetLastError()); return FALSE; } MYOVERLAPPED *pmyoverlapped = new MYOVERLAPPED; // socket和I/O通讯的载体 pmyoverlapped-operateType = OP_CONNECT; // 设置请求类型,得到I/O结果时根据此 //

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档