[工学]网络程序设计 IOCP与可伸缩网络程序.ppt

[工学]网络程序设计 IOCP与可伸缩网络程序.ppt

  1. 1、本文档共126页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]网络程序设计 IOCP与可伸缩网络程序

* 最开始创建一个完成端口时,唯一感兴趣的参数便是NumberOfConcurrentThreads(并发线程的数量);前面三个参数都会被忽略。 NumberOfConcurrentThreads参数的特殊之处在于,它定义了在一个完成端口上,同时允许执行的线程数量。理想情况下,我们希望每个处理器各自负责一个线程的运行,为完成端口提供服务,避免过于频繁的线程“场景”切换。若将该参数设为0,表明系统内安装了多少个处理器,便允许同时运行多少个线程! FileHandle参数指定一个要同完成端口关联在一起的套接字句柄。 ExistingCompletionPort参数指定的是一个现有的完成端口。 CompletionKey(完成键)参数则指定要与某个特定套接字句柄关联在一起的“句柄唯一数据”;在这个参数中,应用程序可保存与一个套接字对应的任意类型的信息。 * 因为在一个套接字首次与完成端口关联到一起的时候,那些数据便与一个特定的套接字句柄对应起来了。这些数据正是我们在进行CreateIoCompletionPort API调用的时候,通过CompletionKey参数传递的。如早先所述,应用程序可通过该参数传递任意类型的数据。 * lpOutputBuffer指向传递给AcceptEx函数接受客户第一块数据的缓冲区 dwReceriveDataLength参数lpOutputBuffer缓冲区的大小,必须与传递给AcceptEx函数的一致 dwlocalAddressLength为本地地址预留的空间大小,必须与传递给AcceptEx函数的一致 dwRemoteAddressLength为远程地址预留的空间大小,必须与传递给AcceptEx函数的一致 LocalSockaddr用来返回连接的本地地址 LocalSockaddrLength用来返回本地的地址的长度 RemoteSockaddr用来返回远程地址 RemoteSockaddLength用来返回远程地址的长度 * 这是非常有效的,因为整个数据传输可在内核模式中进行。也就是说,如果你的应用从指定的文件中读取一堆数据,然后用send或WSASend时,涉及到“用户模式到内核模式传输”的发送调用就有若干个。有了TransmitFile ,整个读取和发送数据的进程就可在内核模式中进行。 hSocket参数用于识别已连接上的套接字(文件的传输便在该套接字上进行)。 nFile参数是一个句柄,该句柄指向一个已打开的套接字(即即将发送的文件)。 nNumberOfBytesToWrite表明写入多少指定文件中的字节。投递0表示将发送整个文件。 nNumberOfBytesPerSend参数则表明写操作所用的发送长度。 例如,指定2048会引起TransmitFile在套接字上以2KB数据块的形式发送指定文件。投递0表示采用默认的发送长度。 lpOverlapped参数指定一个OVERLAPPED结构,该结构用于重叠I / O模式。 lpTransmitBuffers,是一个TRANSMIT_FILE_BUFFERS结构,其中包含文件传输之前和之后准备发送的数据。 TransmitFile的最后一个参数是dwFlags,用于指定即将对TransmitFile行为产生影响的标志。 * hSocket已经建立的套接字句柄,并不要求时面向连接的套接字 lpPacketArray封包元素数组,描述了要传送的数据 nElementCount是lpPacketArray数组中元素的数量 nSendSize发送操作每次发送数据的大小 lpOverlapped同TransmitFile中的参数一样,是可选的重叠结构 dwFlags是标志。 * * * // 增加套接字上的重叠I/O计数和读序列号计数 pContext-nOutstandingRecv ++; pContext-nReadSequence ++; ::LeaveCriticalSection(pContext-Lock); return TRUE; } * * PostSend() BOOL CIOCPServer::PostSend(CIOCPContext *pContext, CIOCPBuffer *pBuffer) {// 跟踪投递的发送的数量,防止用户仅发送数据而不接收,导致服务器抛出大量发送操作 if(pContext-nOutstandingSend m_nMaxSends) return FALSE; // 设置I/O类型,增加套接字上的重叠I/O计数 pBuffer-nOperation = OP_WRITE; // 投递此重叠I/O DWORD dwBytes; DWORD dwFlags

文档评论(0)

jiupshaieuk12 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档