欢迎来到天天文库
浏览记录
ID:40239754
大小:1.12 MB
页数:118页
时间:2019-07-28
《Windows网络编程 罗莉琴 詹祖桥 第8章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Windows网络编程实用教程授课教师:职务:第8章高级Socket编程课程描述我们在第5章中介绍了Socket编程的基础技术,可以实现简单的服务器和客户机通信。但在实际应用中,服务器往往需要同时与很多客户端进行通信,对服务器的性能要求很高。要在Windows平台上构建高效、实用的客户机/服务器应用程序,就必须选择最适合的Socket编程模型。本章知识点Socket编程模型概述阻塞与非阻塞模式Socket编程基于Select模型的Socket编程基于WSAAsyncSelect模型的Socket编程基于WSAEventSelect模型的Socket编程基于重叠I/O模型的S
2、ocket编程基于完成端口模型的Socket编程8.1Socket编程模型概述Socket编程可以分为阻塞和非阻塞两种开发模式。阻塞模式是指在指定套接字上调用函数执行操作时,在没有完成操作之前,函数不会立即返回。例如,服务器程序在阻塞模式下调用accept()函数时将会阻塞服务器线程,直至接收到一个来自客户端的连接请求。默认创建的套接字为阻塞模式。非阻塞模式是指在指定套接字上调用函数执行操作时,无论操作是否完成,函数都会立即返回。例如,在非阻塞模式下调用recv()函数时,程序会直接读取网络缓冲区中的数据,无论是否读到数据,函数都会立即返回,而不会一直挂在此函数的调用上。1
3、.Select模型Select模型又称为选择模型,它可以使WindowsSockets应用程序同时对多个套接字进行管理,调用select()函数可以获取指定套接字的状态。然后调用WindowsSocketsAPI实现数据发送和接收等操作。select()函数中使用集合来表示进行管理的多个套接字。默认情况下,套接字集合中包含64个元素,最多可以管理的套接字数量为1024个。尽管Select模型可以同时管理多个连接,但对集合的管理比较繁琐。而且每次在使用套接字发送和接收数据之前,都需要调用select()函数判断套接字的状态,这会导致CPU额外的负担,从而影响应用程序的工作效率
4、。2.WSAAsyncSelect模型WSAAsyncSelect模型又称为异步选择模型,它为每个套接字绑定一个消息。当套接字上出现事先设置事件时,操作系统会给应用程序发送这个消息,从而使应用程序可以对该事件做相应的处理。WSAAsyncSelect模型的优点是在系统开销不大的情况下可以同时处理许多个客户端连接。它的缺点是,即使应用程序不需要窗口,也要至少设计一个窗口用于处理套接字事件。而且,在一个窗口中处理大量的事件也可能成为性能瓶颈。3.WSAEventSelect模型WSAEventSelect模型又称为事件Select模型,它允许在多个套接字上接收以事件为基础的网络
5、事件通知。应用程序在创建套接字后,调用WSAEventSelect()函数将事件对象与网络事件集合相关联。当网络事件发生时,应用程序以事件的形式接收网络事件通知。WSAEventSelect模型与WSAAsyncSelect模型之间的主要区别是网络事件发生时系统通知应用程序的方式不同。WSAAsyncSelect模型以消息的形式通知应用程序,而WSAEventSelect模型则以事件的形式进行通知。Select模型是主动获取指定套接字的状态,而WSAEventSelect模型和WSAAsyncSelect模型则是被动选择系统通知应用程序套接字的状态变化。WSAEventSe
6、lect模型每次只能等待64个事件,这也是WSAEventSelect模型的不足之处。4.重叠I/O模型重叠I/O模型又称为OverlappedI/O模型,它的基本设计原理是可以让应用程序使用重叠的数据结构一次投递多个I/O请求,当系统完成I/O操作后通知应用程序。重叠I/O模型是真正意义上的异步I/O模型。在应用程序中调用输入/输出函数后,程序将立即返回。当I/O操作完成后,系统会通知应用程序。系统通知应用程序的形式有两种,即事件通知和完成例程。事件通知方式即通过事件来通知应用程序I/O操作已完成,而完成例程则指定应用程序在完成I/O操作后调用一个事先定义的回调函数。5.
7、完成端口模型完成端口(Completionport)是一种在Windows服务平台上比较成熟和高效的I/O操作方法,它使用线程池处理异步I/O请求。利用完成端口模型,应用程序可以管理成百上千个套接字。可以把完成端口看成系统维护的一个队列,操作系统把重叠I/O操作完成的事件通知放到该队列中,因此称其为“完成”端口。当套接字被创建后,可以将其与一个完成端口联系起来。一个应用程序可以创建多个工作线程用于处理完成端口上的通知事件。通常应该为每个CPU创建一个线程。8.2阻塞与非阻塞模式Socket编程8.2.1设置非阻塞模
此文档下载收益归作者所有