欢迎来到天天文库
浏览记录
ID:16504703
大小:53.00 KB
页数:8页
时间:2018-08-10
《winsocket模型的探讨——完成端口模型》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WinSocket模型的探讨——完成端口模型众所皆知,完成端口是在WINDOWS平台下效率最高,扩展性最好的IO模型,特别针对于WINSOCK的海量连接时,更能显示出其威力。其实建立一个完成端口的服务器也很简单,只要注意几个函数,了解一下关键的步骤也就行了。这是篇完成端口入门级的文章,分为以下几步来说明完成端口:函数常见问题以及解答步骤例程1、函数:我们在完成端口模型下会使用到的最重要的两个函数是:CreateIoCompletionPort、GetQueuedCompletionStatusCreateIoCompletionPort的作用
2、是创建一个完成端口和把一个IO句柄和完成端口关联起来://创建完成端口HANDLECompletionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);//把一个IO句柄和完成端口关联起来,这里的句柄是一个socket句柄CreateIoCompletionPort((HANDLE)sClient,CompletionPort,(DWORD)PerHandleData,0);其中第一个参数是句柄,可以是文件句柄、SOCKET句柄。第二个就是我们上面创建出来的完成端口,这里就把
3、两个东西关联在一起了。第三个参数很关键,叫做PerHandleData,就是对应于每个句柄的数据块。我们可以使用这个参数在后面取到与这个SOCKET对应的数据。最后一个参数给0,意思就是根据CPU的个数,允许尽可能多的线程并发执行。GetQueuedCompletionStatus的作用就是取得完成端口的结果://从完成端口中取得结果GetQueuedCompletionStatus(CompletionPort,&BytesTransferred,(LPDWORD)&PerHandleData,(LPOVERLAPPED*)&PerIoDa
4、ta,INFINITE)第一个参数是完成端口第二个参数是表明这次的操作传递了多少个字节的数据第三个参数是OUT类型的参数,就是前面CreateIoCompletionPort传进去的单句柄数据,这里就是前面的SOCKET句柄以及与之相对应的数据,这里操作系统给我们返回,让我们不用自己去做列表查询等操作了。第四个参数就是进行IO操作的结果,是我们在投递WSARecv/WSASend等操作时传递进去的,这里操作系统做好准备后,给我们返回了。非常省事!!个人感觉完成端口就是操作系统为我们包装了很多重叠IO的不爽的地方,让我们可以更方便的去使用,下篇
5、我将会尝试去讲述完成端口的原理。2、常见问题和解答a、什么是单句柄数据(PerHandle)和单IO数据(PerIO)单句柄数据就是和句柄对应的数据,像socket句柄,文件句柄这种东西。单IO数据,就是对应于每次的IO操作的数据。例如每次的WSARecv/WSASend等等其实我觉得PER是每次的意思,翻译成每个句柄数据和每次IO数据还比较清晰一点。在完成端口中,单句柄数据直接通过GetQueuedCompletionStatus返回,省去了我们自己做容器去管理。单IO数据也容许我们自己扩展OVERLAPPED结构,所以,在这里所有与应用逻
6、辑有关的东西都可以在此扩展。b、如何判断客户端的断开我们要处理几种情况1)如果客户端调用了closesocket,我们就可以这样判断他的断开:if(0==GetQueuedCompletionStatus(CompletionPort,&BytesTransferred,。。。){}if(BytesTransferred==0){//客户端断开,释放资源}2) 如果是客户端直接退出,那就会出现64错误,指定的网络名不可再用。这种情况我们也要处理的:if(0==GetQueuedCompletionStatus(。。。)){if((GetLas
7、tError()==WAIT_TIMEOUT)
8、
9、(GetLastError()==ERROR_NETNAME_DELETED)){//客户端断开,释放资源}}3、步骤编写完成端口服务程序,无非就是以下几个步骤:1、创建一个完成端口2、根据CPU个数创建工作者线程,把完成端口传进去线程里3、创建侦听SOCKET,把SOCKET和完成端口关联起来4、创建PerIOData,向连接进来的SOCKET投递WSARecv操作5、线程里所做的事情:a、GetQueuedCompletionStatus,在退出的时候就可以使用PostQueudCompl
10、etionStatus使线程退出b、取得数据并处理4、例程下面是服务端的例程,可以使用《WinSocket模型的探讨——Overlapped模型(一)》中的客户端程
此文档下载收益归作者所有