Windows网络编程 教学课件 ppt 作者 罗莉琴 詹祖桥 第8章

上传人:E**** 文档编号:89400692 上传时间:2019-05-24 格式:PPT 页数:117 大小:757.50KB
返回 下载 相关 举报
Windows网络编程 教学课件 ppt 作者  罗莉琴 詹祖桥 第8章_第1页
第1页 / 共117页
Windows网络编程 教学课件 ppt 作者  罗莉琴 詹祖桥 第8章_第2页
第2页 / 共117页
Windows网络编程 教学课件 ppt 作者  罗莉琴 詹祖桥 第8章_第3页
第3页 / 共117页
Windows网络编程 教学课件 ppt 作者  罗莉琴 詹祖桥 第8章_第4页
第4页 / 共117页
Windows网络编程 教学课件 ppt 作者  罗莉琴 詹祖桥 第8章_第5页
第5页 / 共117页
点击查看更多>>
资源描述

《Windows网络编程 教学课件 ppt 作者 罗莉琴 詹祖桥 第8章》由会员分享,可在线阅读,更多相关《Windows网络编程 教学课件 ppt 作者 罗莉琴 詹祖桥 第8章(117页珍藏版)》请在金锄头文库上搜索。

1、,Windows网络编程实用教程,授课教师: 职务:,第8章 高级Socket编程,课程描述 我们在第5章中介绍了Socket编程的基础技术,可以实现简单的服务器和客户机通信。但在实际应用中,服务器往往需要同时与很多客户端进行通信,对服务器的性能要求很高。要在Windows平台上构建高效、实用的客户机/服务器应用程序,就必须选择最适合的Socket编程模型。,本章知识点,Socket编程模型概述 阻塞与非阻塞模式Socket编程 基于Select模型的Socket编程 基于WSAAsyncSelect模型的Socket编程 基于WSAEventSelect模型的Socket编程 基于重叠I/O

2、模型的Socket编程 基于完成端口模型的Socket编程,8.1 Socket编程模型概述,Socket编程可以分为阻塞和非阻塞两种开发模式。 阻塞模式是指在指定套接字上调用函数执行操作时,在没有完成操作之前,函数不会立即返回。例如,服务器程序在阻塞模式下调用accept()函数时将会阻塞服务器线程,直至接收到一个来自客户端的连接请求。默认创建的套接字为阻塞模式。 非阻塞模式是指在指定套接字上调用函数执行操作时,无论操作是否完成,函数都会立即返回。例如,在非阻塞模式下调用recv()函数时,程序会直接读取网络缓冲区中的数据,无论是否读到数据,函数都会立即返回,而不会一直挂在此函数的调用上。,

3、1Select模型,Select模型又称为选择模型,它可以使Windows Sockets应用程序同时对多个套接字进行管理,调用select()函数可以获取指定套接字的状态。然后调用Windows Sockets API实现数据发送和接收等操作。 select()函数中使用集合来表示进行管理的多个套接字。默认情况下,套接字集合中包含64个元素,最多可以管理的套接字数量为1024个。尽管Select模型可以同时管理多个连接,但对集合的管理比较繁琐。而且每次在使用套接字发送和接收数据之前,都需要调用select()函数判断套接字的状态,这会导致CPU额外的负担,从而影响应用程序的工作效率。,2WS

4、AAsyncSelect模型,WSAAsyncSelect模型又称为异步选择模型,它为每个套接字绑定一个消息。当套接字上出现事先设置事件时,操作系统会给应用程序发送这个消息,从而使应用程序可以对该事件做相应的处理。 WSAAsyncSelect模型的优点是在系统开销不大的情况下可以同时处理许多个客户端连接。它的缺点是,即使应用程序不需要窗口,也要至少设计一个窗口用于处理套接字事件。而且,在一个窗口中处理大量的事件也可能成为性能瓶颈。,3WSAEventSelect模型,WSAEventSelect模型又称为事件Select模型,它允许在多个套接字上接收以事件为基础的网络事件通知。应用程序在创建

5、套接字后,调用WSAEventSelect()函数将事件对象与网络事件集合相关联。当网络事件发生时,应用程序以事件的形式接收网络事件通知。 WSAEventSelect模型与WSAAsyncSelect模型之间的主要区别是网络事件发生时系统通知应用程序的方式不同。WSAAsyncSelect模型以消息的形式通知应用程序,而WSAEventSelect模型则以事件的形式进行通知。Select模型是主动获取指定套接字的状态,而WSAEventSelect模型和WSAAsyncSelect模型则是被动选择系统通知应用程序套接字的状态变化。 WSAEventSelect模型每次只能等待64个事件,这也

6、是WSAEventSelect模型的不足之处。,4重叠I/O模型,重叠I/O模型又称为Overlapped I/O模型,它的基本设计原理是可以让应用程序使用重叠的数据结构一次投递多个I/O请求,当系统完成I/O操作后通知应用程序。 重叠I/O模型是真正意义上的异步I/O模型。在应用程序中调用输入/输出函数后,程序将立即返回。当I/O操作完成后,系统会通知应用程序。 系统通知应用程序的形式有两种,即事件通知和完成例程。事件通知方式即通过事件来通知应用程序I/O操作已完成,而完成例程则指定应用程序在完成I/O操作后调用一个事先定义的回调函数。,5完成端口模型,完成端口(Completion por

7、t)是一种在Windows服务平台上比较成熟和高效的I/O操作方法,它使用线程池处理异步I/O请求。利用完成端口模型,应用程序可以管理成百上千个套接字。 可以把完成端口看成系统维护的一个队列,操作系统把重叠I/O操作完成的事件通知放到该队列中,因此称其为“完成”端口。当套接字被创建后,可以将其与一个完成端口联系起来。 一个应用程序可以创建多个工作线程用于处理完成端口上的通知事件。通常应该为每个CPU创建一个线程。,8.2 阻塞与非阻塞模式Socket编程,8.2.1 设置非阻塞模式套接字 8.2.2 非阻塞模式服务器应用程序编程实例 8.2.3 非阻塞模式客户端应用程序编程实例 8.2.4 基

8、于非阻塞模式的多线程服务器应用程序编程实例,8.2.1 设置非阻塞模式套接字,可以调用ioctlsocket()函数将套接字设置为非阻塞模式,语法如下: int ioctlsocket( SOCKET s, long cmd, u_long* argp ); 参数说明如下: s,套接字句柄。 cmd,在套接字s上执行的命令,它的可选值如表9.1所示。 argp,指针变量,指定cmd命令的参数。,ioctlsocket()函数示例代码,/- / 初始化Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2,2), ,8.2.2 非

9、阻塞模式服务器应用程序编程实例,【例8.1】本实例中介绍的非阻塞模式服务器应用程序启动时将在TCP端口9990上进行监听。收到客户端应用程序发送来的数据后,服务器应用程序将向客户端发送一个表示收到数据的字符串。如果服务器收到字符串“quit”,则退出应用程序。本实例的功能和运行界面与5.3.11小节中介绍的实例相同,不同的是本实例中采用非阻塞模式的套接字进行通信。 包含的头文件。 引用的库文件。 常量和变量定义。 初始化套接字环境的代码。 创建用于监听的套接字的代码。 设置服务器套接字地址的代码。 绑定套接字sServer到本地地址的代码。 在套接字sServer上进行监听的代码。 关闭套接字

10、,释放资源。,8.2.3 非阻塞模式客户端应用程序编程实例,【例8.2】本实例中介绍的非阻塞模式客户端应用程序启动时将自动连接到指定服务器的TCP端口9990,然后提示用户输入向服务器发送的字符串。 实现服务器程序的项目为TcpServer,下面介绍服务器程序的实现过程。本实例在下面步骤中的代码与5.3.12小节中介绍的实例相同,请参照理解。 包含的头文件。 引用的库文件。 常量和变量定义。 初始化套接字环境的代码。 设置服务器套接字地址的代码。 关闭套接字,释放资源。,8.2.4 基于非阻塞模式的多线程服务器应用程序编程实例,【例8.3】,设计一个基于非阻塞模式的多线程服务器应用程序。 主函

11、数(即主线程)_tmain()负责接收来自客户端的连接请求,然后创建专门与该客户端进行通信的线程。 程序在成功调用accept()函数接受来自客户端的连接请求后,直接调用CreateThread()创建一个专门的通信线程,线程函数为AnswerThread,建立连接后得到的套接字sClient作为线程参数。创建通信线程后,主线程立即返回while循环的开始部分,继续调用accept()函数接收其他客户端的连接请求。这样就可以同时与多个客户端进行通信了。,8.3 基于Select模型的Socket编程,8.3.1 select()函数 8.3.2 基于Select模型的服务器应用程序实例,8.3

12、.1 select()函数,select()函数可以决定一组套接字的状态,通常用于操作处于就绪状态的套接字。在select()函数中使用fd_set结构体来管理多个套接字,定义代码如下: typedef struct fd_set u_int fd_count; SOCKET fd_arrayFD_SETSIZE; fd_set;,select()函数的语法,int select( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout ); 参数说明如下: nf

13、ds,只为与Berkeley套接字相兼容而保留此参数,在执行函数时会被忽略。 readfds,用于检测可读性的套接字集合。 writefds,用于检测可写性的套接字集合。 exceptfds,用于检测存在错误的套接字集合。 timeout,select()函数等待的最长时间。如果是阻塞模式的操作,则将此参数设置为null。,winsock2.h中定义的宏,FD_CLR(s, *set):从集合中删除指定的套接字。 FD_ISSET(s, *set):如果参数s是集合中的成员,则返回非0值,否则返回0。 FD_SET(s, *set):向集合中添加套接字。 FD_ZERO(s, *set):将集

14、合初始化为空集合。,8.3.2 基于Select模型的服务器应用程序实例,【例8.4】设计一个基于Select模型的回显服务器应用程序。所谓回显,即将它收到的来自客户端的字符串再发送回客户端。假定本实例中的项目名称为SelectServer。,1结构体SOCKET_INFORMATION,typedef struct _SOCKET_INFORMATION CHAR BufferDATA_BUFSIZE;/ 发送和接收数据的缓冲区 / 定义发送和接收数据缓冲区的结构体,包括缓冲区的长度和内容 WSABUF DataBuf; SOCKET Socket; / 与客户端进行通信的套接字 DWORD

15、 BytesSEND; / 保存套接字发送的字节数 DWORD BytesRECV; / 保存套接字接收的字节数 SOCKET_INFORMATION, * LPSOCKET_INFORMATION; 结构体SOCKET_INFORMATION中包含用于通信的套接字、发送和接收数据的缓冲区、发送和接收的字节数等。 WSABUF是winsock2.h中定义的结构体,用于保存缓冲区的地址和长度,代码如下: typedef struct _WSABUF u_long len; /* the length of the buffer */ char FAR * buf; /* the pointer

16、to the buffer */ WSABUF, FAR * LPWSABUF;,2变量定义,为了对所有与客户端进行通信的套接字信息进行统一管理,需要定义下面两个变量: / 记录正在使用的套接字总数量 DWORD TotalSockets = 0; / 保存Socket信息对象的数组,FD_SETSIZE表示SELECT模型中允许的最大套接字数量 LPSOCKET_INFORMATION SocketArrayFD_SETSIZE; 常量FD_SETSIZE等于64,因为默认情况下select()函数最多可以处理64个套接字。,3创建套接字信息,BOOL CreateSocketInformation(SOCKET s) LPSOCKET_INFORMATION SI; / 用于保存套接字的信息 / 为SI分配内存空间 if (SI = (LPSOCKET_INFORMATION

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号