一个对winsock完成端口模型封装的类

一个对winsock完成端口模型封装的类

ID:26201734

大小:65.00 KB

页数:18页

时间:2018-11-25

一个对winsock完成端口模型封装的类_第1页
一个对winsock完成端口模型封装的类_第2页
一个对winsock完成端口模型封装的类_第3页
一个对winsock完成端口模型封装的类_第4页
一个对winsock完成端口模型封装的类_第5页
资源描述:

《一个对winsock完成端口模型封装的类》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、一个对Winsock完成端口模型封装的类在Windows下进行网络服务端程序开发,毫无疑问,Winsock完成端口模型是最高效的。Winsock的完成端口模型借助Widnows的重叠IO和完成端口来实现,完成端口模型懂了之后是比较简单的,但是要想掌握Winsock完成端口模型,需要对WINDOWS下的线程、线程同步,WinsockAPI以及WINDOWSIO机制有一定的了解。如果不了解,推荐几本书:《InsideWindows2000,《WINDOWS核心编程》,《WIN32多线程程序设计》、《WINDOWS网络编程技术

2、》。在去年,我在C语言下用完成端口模型写了一个WebSERVER,前些天,我决定用C++重写这个WEBSERVER,给这个WEBSERVER增加了一些功能,并改进完成端口操作方法,比如采用AcceptEx来代替accept和使用LOOKASIDELIST来管理内存,使得WEBSERVER的性能有了比较大的提高。    在重写的开始,我决定把完成端口模型封装成一个比较通用的C++类,针对各种网络服务端程序的开发,只要简单地继承这个类,改写其中两个虚拟函数就能满足各种需要。到昨天为止,WEBSERVER重写完毕,我就写了这篇

3、文章对完成端口模型做一个总结,并介绍一下我的这个类。    一:完成端口模型    至于完成端口和Winsock完成端口模型的详细介绍,请参见我上面介绍的那几本书,这里只是我个人对完成端口模型理解的一点心得。    首先我们要抽象出一个完成端口大概的处理流程:    1:创建一个完成端口。    2:创建一个线程A。    3:A线程循环调用GetQueuedCompletionStatus()函数来得到IO操作结果,这个函数是个阻塞函数。    4:主线程循环里调用accept等待客户端连接上来。    5:主线程里a

4、ccept返回新连接建立以后,把这个新的套接字句柄用CreateIoCompletionPort关联到完成端口,然后发出一个异步的WSASend或者WSARecv调用,因为是异步函数,WSASend/WSARecv会马上返回,实际的发送或者接收数据的操作由WINDOWS系统去做。    6:主线程继续下一次循环,阻塞在accept这里等待客户端连接。    7:WINDOWS系统完成WSASend或者WSArecv的操作,把结果发到完成端口。这里。    具体的流程请看附图,其中红线表示是Windows系统进行的处理,不

5、需要我们程序干预。    归根到底概括完成端口模型一句话:    我们不停地发出异步的WSASend/WSARecvIO操作,具体的IO处理过程由WINDOWS系统完成,WINDOWS系统完成实际的IO处理后,把结果送到完成端口上(如果有多个IO都完成了,那么就在完成端口那里排成一个队列)。我们在另外一个线程里从完成端口不断地取出IO操作结果,然后根据需要再发出WSASend/WSARecvIO操作。二:提高完成端口效率的几种有效方法    1:使用AcceptEx代替accept。AcceptEx函数是微软的Winso

6、sk扩展函数,这个函数和accept的区别就是:accept是阻塞的,一直要到有客户端连接上来后accept才返回,而AcceptEx是异步的,直接就返回了,所以我们利用AcceptEx可以发出多个AcceptEx调用    等待客户端连接。另外,如果我们可以预见到客户端一连接上来后就会发送数据(比如WebSERVER的客户端浏览器),那么可以随着AcceptEx投递一个BUFFER进去,这样连接一建立成功,就可以接收客户端发出的数据到BUFFER里,这样使用的话,一次AcceptEx调用相当于accpet和recv的一

7、次连续调用。同时,微软的几个扩展函数针对操作系统优化过,效率优于WINSOCK的标准API函数。    2:在套接字上使用SO_RCVBUF和SO_SNDBUF选项来关闭系统缓冲区。这个方法见仁见智,详细的介绍可以参考《Windows核心编程》第9章。这里不做详细介绍,我封装的类中也没有使用这个方法。    3:内存分配方法。因为每次为一个新建立的套接字都要动态分配一个“单IO数据”和“单句柄数据”的数据结构,然后在套接字关闭的时候释放,这样如果有成千上万个客户频繁连接时候,会使得程序很多开销花费在内存分配和释放上。这里

8、我们可以使用lookasidelist。开始在微软的platformsdk里的SAMPLE里看到lookasidelist,我一点不明白,MSDN里有没有。后来还是在DDK的文档中找到了,,    lookasidelist    Asystem-managedqueuefromwhichentriesofafixe

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。