下载此文档

WinSock完成端口IO模型.docx


文档分类:IT计算机 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
关于重叠I/O,参考《WinSock重叠I/O模型》;关于完成端口的概念及内部机制,参考译文《深度探索I/O完成端口》。
完成端口对象取代了WSAAsyncSelect中的消息驱动和WSAEventSelect中的事件对象,当然完成端口模型的内部机制要比WSAAsyncSelect和WSAEventSelect模型复杂得多。
IOCP内部机制如下图所示:
在WinSock中编写完成端口程序,pletionPort函数创建完成端口。其原型如下:
WINBASEAPI HANDLE WINAPI
pletionPort(
HANDLE FileHandle,
HANDLE pletionPort,
pletionKey,
DWORD NumberOfConcurrentThreads );
第一次调用此函数创建一个完成端口时,通常只关注NumberOfConcurrentThreads,它定义了在完成端口上同时允许执行的线程数量。一般设为0,表示系统内安装了多少个处理器,便允许同时运行多少个线程为完成端口提供服务。每个处理器各自负责一个线程的运行,避免了过于频繁的线程上下文切换。
hCompletionPort = pletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)
这个类比重叠I/O事件通知模型中(WSA)CreateEvent。
然后再调用GetSystemInfo(&SystemInfo);,根据CPU数创建线程池,在完成端口上,为已完成的I/O请求提供服务。一般线程池的规模,即线程数= CPU数*2+2。
下面的代码片段演示了线程池的创建。
// 创建线程池,规模为CPU数的两倍
for(int i = 0; i < * 2; i++)
{
HANDLE ThreadHandle;
// 创建一个工作线程,并将完成端口作为参数传递给它。
if ((ThreadHandle = CreateThread(NULL, 0, WorkerThread, hCompletionPort,
0, &ThreadID)) == NULL)
{
printf("CreateThread() failed with error %d/n", GetLastError());
return;
}
// 关闭线程句柄
CloseHandle(ThreadHandle);
}
然后需要将一个句柄与已经创建的完成端口关联起来,eptSocket,以后针对这个套接字的I/O完成状态交由完成端口通知,程序接到完成通知后做善后处理。
pletionPort函数(囧)。参数四NumberOfConcurrentThreads依旧填0,eptSocket,pletionPort。参数三即“完成键”,一般存放套接字句柄的背景信息,也就是所谓的“单句柄数据”。之所以把它叫作“单句柄数据”,因为它是用来保存参数一套接字句柄的关联信息。一般可简单定义如下:
typedef struct {
SOCKET Socket;
} PER_H

WinSock完成端口IO模型 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数7
  • 收藏数0 收藏
  • 顶次数0
  • 上传人taotao0a
  • 文件大小50 KB
  • 时间2017-07-24