网络编程实用教程第3章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《网络编程实用教程第3章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 实用教程 课件
- 资源描述:
-
1、吉林大学软件学院吉林大学软件学院3.1 Windows Sockets规范规范3.1.1 概述概述lMicrosoft公司以公司以Berkeley Sockets规范为范例,定义规范为范例,定义了了Windows Socktes规范,简称规范,简称Winsock规范规范。l这是这是Windows操作系统环境下的套接字网络应用程序操作系统环境下的套接字网络应用程序编程接口(编程接口(API)。)。l包含:包含:lBerkeley Socket 风格的库函数;l针对Windows操作系统的扩展库函数。l可以充分利用可以充分利用Windows的消息驱动机制编程。的消息驱动机制编程。lWinsock规
2、范定义了应用程序开发者能够使用,并且规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数和相关语义,网络软件供应商能够实现的一套库函数和相关语义,让各个软件供应商共同遵守,做到让各个软件供应商共同遵守,做到Winsock兼容。兼容。吉林大学软件学院吉林大学软件学院图图3.1 网络应用进程利用网络应用进程利用Windock进行通信进行通信 吉林大学软件学院吉林大学软件学院3.1.2 Windows Sockets规范规范lWindows Sockets 规范是一套开放的、支持多种协规范是一套开放的、支持多种协议的议的Windows下的网络编程接口。下的网络编程接口。l从从19
3、91年到年到1995年,从年,从1.0版发展到版发展到2.0.8版,已成版,已成为为Windows网络编程的事实上的标准。网络编程的事实上的标准。1Windows Sockets 1.1版本版本l在在Winsock.h包含文件中,定义了包含文件中,定义了WinSock 1.1版本版本、和和。l库函数的实现在库函数的实现在Winsock.dll动态链接库文件中。动态链接库文件中。(1) WinSock 1.1 全面继承了全面继承了Berkeley Sockets规范。规范。l见表 3.1吉林大学软件学院吉林大学软件学院(1) WinSock 1.1 全面继承了全面继承了Berkeley Sock
4、ets规范。规范。lWinsock1.1继承了Berkeley Sockets规范的主要特征,一部分库函数与之在形式上保持一致,包括库函数的名称、参数格式、结构定义。l见表 3.1。l其中,带*号的表明该例程在某些情况下可能会发生阻塞。主要函数SOCKET()创建一个套接字,并返回套接字的标识符BIND()把套接字绑定到特定的网络地址上LISTEN()启动指定的套接字,监听到来的连接请求ACCEPT()*接收一个连接请求,并新建一个套接字,原来的套接字返回监听状态CONNECT()*请求讲本地套接字连接到一个指定的远方套接字上SEND()*向一个已经与对方建立连接的套接字发送数据SENDTO(
5、)*向一个未与对方建立连接的套接字发送数据,并指定对方网络地址RECV()*从一个已经与对方建立连接的套接字接收数据RECVFROM()*从一个未与对方建立连接的套接字接收数据,并返回对方网络地址SHUTDOWN()有选择的关闭套接字的全双工连接CLOSESOCEKT()*关闭套接字,释放相应的资源表表3.1 WinSock 1.1继承继承Berkeley Sockets的函数的函数辅助函数HTONL()把32位无符号数从主机字节序转换为网络字节序HTONS()把16位无符号数从主机字节序转换为网络字节序NTOHL()把32位无符号数从网络字节序转换为主机字节序NTOHS()把16位无符号数从
6、网络字节序转换为主机字节序INET_ADDR()把标准的点分十进制的IP转换成长整形地址数据INET_NTOA()把长整形的IP地址数据转换成点分十进制的字符串GETPEERNAME()获得套接字连接上对方的网络地址GETSOCKENAME() 获得指定套接字的网络地址控制函数GETSOCKOPT()获得指定套接字的属性选项SETSOCKOPT()设置与指定套接字相关的属性选项IOCTLSOCKET()为套接字提供控制SELECT()*执行同步I/O多路复用表表3.1 WinSock 1.1继承继承Berkeley Sockets的函数的函数(cont.)(2) 数据库函数数据库函数l表表3.
7、2列出了列出了Winsock规范定义的数据库查询函数。规范定义的数据库查询函数。l其中其中6个采用个采用的形式,大多要借助网络上的数的形式,大多要借助网络上的数据库来获得信息,而不采用本地数据库来实现。据库来获得信息,而不采用本地数据库来实现。函数名说明gethostname()用来返回本地计算机的标准主机名gethostbyname()*返回对英语给定主机名的主机信息gethostbyaddr()*根据一个IP地址取回相应的主机信息getservbyname()*返回对应于给定服务名和协议名的相关服务信息getservbyport()*返回对应于给定端口号和协议名的相关服务信息getport
8、byname()*返回对应于给定协议名的相关服务信息getportbynumber()*返回对应于给定协议号的相关服务信息表表3.2 数据库查询函数数据库查询函数吉林大学软件学院吉林大学软件学院lgetXbyY( )形式的数据库例程都返回一个指针,指形式的数据库例程都返回一个指针,指向某种类型的结构区域,用来存放函数返回的数向某种类型的结构区域,用来存放函数返回的数据信息。据信息。l这些结构区域是由winsock实现(即Winsock.dll)分配的,由系统管理,所以指针指向的结构数据是易失的,只在该线程的下一个Winsock API调用前有效。l一个线程中只有一个该结构的副本,因此应用程序在
9、发出下一个Winsock API调用前,应把所需的信息复制下来。l应用程序不应试图修改或释放这个结构。吉林大学软件学院吉林大学软件学院(3) WinSock 1.1 扩充了扩充了Berkeley Sockets规范规范l针对微软针对微软 Windows的特点,的特点,WinSock 1.1定义了一定义了一批新的库函数,提供了对批新的库函数,提供了对的支持,的支持,有效地利用有效地利用的机制。的机制。l扩充主要是提供了一些异步函数,增加了符合Windows消息驱动特性的网络事件异步选择机制,有利于开发符合Windows编程模式的软件,使得开发高性能网络通信程序成为可能。l这些扩充函数的名字都以W
10、SA开头,后面跟async表示是专为实现异步机制而设置的。l编程时必须使用WSAStartup()和WSACleanup(),其它函数随意使用。10表表3.3 Winsock 1.1的常用扩展函数的常用扩展函数Winsock的注册与注销函数WSAStartup()初始化低层Windows Socks DLLWSACleanup()从低层的Windows Sockets DLL撤销注册异步执行的数据库查询函数WSAAsynGetHostBYName()GetHostBYName()的异步版本WSAAsynGetHostBYAddr()GetHostBYAddr()的异步版本WSAAsynGetS
11、ervByName()GetServByName()的异步版本WSAAsynGetServByPort()GetServByPort()的异步版本WSAAsynGetProtobyNameGetProtobyName()的异步版本WSAAsynGetProtobyNumber()GetProtobyNumber()的异步版本11表表3.3 Winsock 1.1的常用扩展函数(续)的常用扩展函数(续)异步机制的相关函数WSAAsynSelect()Select()的异步版本WSACancelAsyncRequest()取消一个未完成的WSAAsyncGetXByY()函数的实例WSACance
12、lBlockingCall ()取消未完成的阻塞的API调用WSAIsBlocking()确定线程是否被一个调用阻塞错误处理相关函数WSAGetLastError()得到最近一个Winsock调用出错的详细信息WSASetLastError()设置下一次WSAGetLastError()返回的错误信息吉林大学软件学院吉林大学软件学院(4) WinSock 1.1只支持只支持TCP/IP协议栈协议栈 lWinsock 1.1的实现,即的实现,即Winsock.dll和底层协议栈和底层协议栈的接口是唯一的,且是独占的,只能访问的接口是唯一的,且是独占的,只能访问TCP/IP协议栈。协议栈。l因此,
13、因此, Winsock 1.1套接字仅支持单一的通信域,套接字仅支持单一的通信域,即即Internet域。域。吉林大学软件学院吉林大学软件学院2WinSock 2.0规范规范lWinSock 2.0在源码和二进制代码方面与WinSock 1.1兼容,此外还增强了许多功能。(1)支持多种协议(2)引入了重叠I/O的概念(3)使用事件对象异步通知(4)服务的质量(QOS)(5)套接口组(6)扩展的字节顺序转换例程(7)分散/聚集方式I/O(8)新增了许多函数。 吉林大学软件学院吉林大学软件学院3. WinSock 1.1中的阻塞问题中的阻塞问题l阻塞是在把应用程序从Berkeley套接口环境中移植
14、到Windows环境中的一个主要焦点,虽然Windows Sockets支持关于套接口的阻塞操作,但是这种应用是被强烈反对的。l阻塞,是指唤起一个函数,该函数直到相关操作完成时才返回。l在Berkeley套接口模型中,一个套接口的操作的缺省行为是阻塞方式的,除非程序员显式地请求该操作为非阻塞方式。l在Windows环境下,强烈推荐程序员尽可能使用非阻塞方式(异步方式)的操作,因为非阻塞方式的操作能够更好地在非占先的Windows环境下工作。吉林大学软件学院吉林大学软件学院l有些Sockets操作在阻塞和非阻塞方式下没什么区别;而有些Sockets操作取决于传输情况,会立即完成或阻塞一段时间。l
15、当操作用于阻塞套接口(打*号标记的)时,这些操作被认为是工作于阻塞方式的。l在Windows Sockets实现中,一个无法立刻完成的阻塞操作是按如下方式处理的:lDLL先初始化操作,然后进入一个循环,在循环中发送收到的任何信息,以便必要时将处理器交给其它线程;l然后检查Windows Sockets功能是否完成,如果完成了,WSACancleBlockingCall()被唤起,阻塞操作以一个适当的返回值结束。吉林大学软件学院吉林大学软件学院l如果一个正在运行某一阻塞操作的进程收到了一个Windows消息,那么应用程序有可能试图发出另一个Windows Sockets调用。l由于难以安全的处理
16、这种情况,Windows Sockets规范不支持这种应用程序的工作方式,此时可以借助两个函数来解决:lWSAIsBlocking () 可以用来确定在该进程上是否有阻塞的Windows Sockets调用;lWSACancleBlockingCall()可以用来取消在线的阻塞调用,如果有的话。l其它任何Windows Sockets函数此时被调用,都会失败并返回错误代码WSAEINPROGRESS。l这一限制适用于所有阻塞和非阻塞操作。吉林大学软件学院吉林大学软件学院3.1.3 WinSock规范与规范与Berkeley套接口的区别套接口的区别1套接口数据类型和该类型的错误返回值l在在UNI
17、X中,包括套接口句柄在内的所有句柄,都是中,包括套接口句柄在内的所有句柄,都是非负的短整数;非负的短整数;l在在WinSock规范中定义了一个新的数据类型,称作规范中定义了一个新的数据类型,称作SOCKET,用来代表套接字描述符。,用来代表套接字描述符。typedef u_int SOCKET;lsocket( )和和accept( )函数返回时,返回的就是函数返回时,返回的就是SOCKET类型。类型。lSOCKET可以取从可以取从0到到INVALID_SOCKET-1之间的任之间的任意值。意值。吉林大学软件学院吉林大学软件学院l要判断要判断socket()和和accept()是否正确执行,可
18、以将返回是否正确执行,可以将返回值和值和INVALID_SOCKET来比较,该常量已在来比较,该常量已在Winsock.h中定义。中定义。l例如:例如:l在UNIX套接字规范中s=socket();if(s=-1)执行错误处理代码 l在Winsock套接字规范中:s=socket();if(s=INVALID_SOCKET)执行错误处理代码 吉林大学软件学院吉林大学软件学院2select()函数和FD_*宏l在在Winsock中,使用中,使用select()函数时,应用程序应坚持函数时,应用程序应坚持用用FD_XXX宏来设置、初始化、清除和检查宏来设置、初始化、清除和检查fd_set结结构,构
19、, fd_set结构用来代表一组套接口。结构用来代表一组套接口。3错误代码的获得lUNIX套接字规范中,如果函数执行时发生了错误,套接字规范中,如果函数执行时发生了错误,会把错误代码放到会把错误代码放到errno或或h_errno变量中。变量中。l在在Winsock中错误代码可以使用中错误代码可以使用WSAGetLastError()调用得到。调用得到。4指针l所有应用程序与所有应用程序与Windows Sockets使用的指针都必须是使用的指针都必须是FAR指针。指针。吉林大学软件学院吉林大学软件学院5. 重命名的函数l有两个伯克利套接口函数改了名字,避免与其它有两个伯克利套接口函数改了名字
20、,避免与其它API冲突。冲突。lclose()改变为closesocket()lioctl()改变为ioctlsocket() 6. Winsock支持的最大套接口数目l一个特定的一个特定的Windows Sockets提供者所支持的套接口提供者所支持的套接口的最大数目是由实现确定的;任何一个应用程序都不的最大数目是由实现确定的;任何一个应用程序都不应假设某个待定数目的套接口可用。应假设某个待定数目的套接口可用。l一个一个Windows Sockets应用程序可以使用的套接口的应用程序可以使用的套接口的最大数目在最大数目在Winsock.h中缺省值是中缺省值是64,在编译时由常,在编译时由常量
21、量决定。决定。吉林大学软件学院吉林大学软件学院7. 头文件lBerkeley头文件被包含在头文件被包含在Winsock.h中。中。l一个一个Windows Sockets应用程序只需简单地包含应用程序只需简单地包含Winsock.h就足够了。就足够了。8原始套接口lWindows Sockets规范并没有规定规范并没有规定Windows Sockets DLL必须支持原始套接口必须支持原始套接口(用用SOCK_RAW打开的套接打开的套接口口),但是鼓励提供原始套接口支持。,但是鼓励提供原始套接口支持。9、Winsock规范对于消息驱动机制的支持l体现在异步选择机制、异步请求函数、阻塞处理方法体
22、现在异步选择机制、异步请求函数、阻塞处理方法、错误处理、启动和终止等方面。、错误处理、启动和终止等方面。 吉林大学软件学院吉林大学软件学院3.2 Winsock 1.1的库函数的库函数3.2.1 Winsock的注册与注销的注册与注销 1初始化函数WSAStartup()lWinsock应用程序要做的第一件事,就是必须首先调应用程序要做的第一件事,就是必须首先调用用WSAStartup()函数对函数对Winsock进行进行。l初始化也称为初始化也称为,注册成功后,才能调用其他的,注册成功后,才能调用其他的Winsock API函数。函数。(1) WSAStartup()函数的调用格式函数的调用
23、格式int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );lwVersionRequested:应用程序要使用的winsock最高版本号;llpWSAData:指向WSADATA结构,返回Winsock API实现细节。图图3.2 在一台计算机中,使用同一在一台计算机中,使用同一Winsock实现的多个网络应用程序实现的多个网络应用程序 (2) WSAStartup()函数的初始化过程函数的初始化过程吉林大学软件学院吉林大学软件学院24(3) WSADATA结构的定义结构的定义#define WSADESCRIPTION_L
24、EN 256#define WSASYS_STATUS_LEN 128typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char * lpVendorInfo; WSADATA; 吉林大学软件学院吉林大学软件学院25(4) 初始化函数可能返回的错误代码初始化函数可能返
25、回的错误代码WSASYSNOTREADY: 网络通信依赖的网络子系统没有准备好。网络通信依赖的网络子系统没有准备好。WSAVERNOTSUPPORTED: 找不到所需的找不到所需的Winsock API相应的动态连接库。相应的动态连接库。WSAEINVAL: DLL不支持应用程序所需的不支持应用程序所需的Winsock版本。版本。WSAEINPROGRESS: 正在执行一个阻塞的正在执行一个阻塞的Winsock 1.1操作。操作。WSAEPROCLIM: 已经达到已经达到Winsock支持的任务数上限。支持的任务数上限。 WSAEFAULT: 参数参数lpWSAData不是合法指针。不是合法指
展开阅读全文