现代网络技术(第二版)第15章 Winsock网络编程接口.ppt

现代网络技术(第二版)第15章 Winsock网络编程接口.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
  这样,应用程序便可引用事件数组中已传信的事件,并检索与哪个事件对应的套接字,判断到底是在哪个套接字上,发生了什么网络事件类型。对事件数组中的事件进行引用时,应该用WSAWaitForMultipleEvents的返回值,减去预声明值WSA_WAIT _EVENT_0,得到具体的引用值(即索引位置)。如: Index=WSAWaitForMultipleEvents ( …… ); MyEvent=EventArray [ Index – WSA_WAIT_EVENT_0 ];   知道了产生网络事件的套接字后,接下来可调用WSAEnumNetworkEvents函数知道发生了什么类型的网络事件。该函数原型为: int WSANnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ); 其中,   ●s参数标识套接字的描述宇。   ●hEventObject参数是可选的,用于标识需要重设的相应事件对象,由于事件对象处在一个“已传信”状态,所以可将它传入,令其自动成为“未传信”状态。如果不想用hEventObject参数来重设事件,那么可使用WSAResetEvent函数。   ●lpNetworkEvents参数是一个WSANETWORKEVENTS结构的数组,每一个元素记录了一个网络事件和相应的错误代码。   WSANETWORKEVENTS结构的格式为: typedef struct WSANETWORKEVENTS{ long lNetworkEvents; int iErrorCodes[ FD_MAX_EVENTS ]; } WSANETWORKEVENTS; 其中,   ●lNetworkEvents参数用于指定套接字上发生的所有网络事件类型。   ●iErrorCode参数指定的是一个错误代码数组,同lNetworkEvents中的事件关联在一起。   针对每个网络事件类型,都存在着一个特殊的事件索引,名字与事件类型的名字类似,只是要在事件名字后面添加一个“_BIT”后缀字串即可。例如,对FD_READ事件类型来说,iErrorCode数组的索引标识符便是FD_READ_BIT。   完成了对WSANETWORKEVENTS结构中的事件处理之后,应用程序可在所有可用的套接字上继续等待更多的网络事件。 15.4 Winsock 2的扩展特性 15.4.1 原始套接字   与Winsock1.1仅支持TCP/IP协议栈不同,Winsock 2通过声明了一个Winsock DLL和底层协议栈间的标准服务提供接口(SPI),使一个 Winsock DLL能够同时访问不同软件开发商的多个底层协议栈,从而使用户能够同时使用多个传输协议。   应用程序可以通过调用WSAEnumProtocols函数得到目前可以使用的传输协议数目,并且得到与每个传输协议相关的信息,这些信息包含在PROTOCOL_INFO结构中。   Winsock1.1仅有一个地址簇(AF_INET),它包含了数量不多的一些众所周知的套接字类型和协议标识符,而Winsock 2除现有的地址簇、套接字类型和协议标识符以外,加入了许多惟一的,但是可能并不为大家所知的地址簇、套接字类型和协议标识符。   Winsock 2通过原始套接字这一重要的套接字类型来支持多种协议。通过原始套接字,程序员可以对网络底层的传输机制进行控制。原始套接字与前面提到的流套接字和数据报套接字的最大不同在于套接字的创建。在一般情况下,在Winsock为IP列出的目录中,并不存在SOCK_RAW这一套接字类型。因此,程序员在通过调用socket或WSASocket函数创建原始套接字时,必须自行设定SOCK_RAW标志。下面一段代码用于创建一个将ICMP作为一种基层IP协议的原始套接字: SOCKET s; s = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP); // 或 s= WSASocket (AF_INET,SOCK_RAW,IPPROTO,NULL, //     0,WSA_FLAG_OVERLAPPED); if (s = = INVALID_SOCKET ) { // 创建失败 }   完成了原始套接字的创建之后,接下来的事情便是在发送及接收调用中,使用对应的套接字句柄。创建原始套接字时,无论是否设定了IP_HDRINCL选项,IP都会包含在接收到的任何返回数据中。 15.4.2 重叠I/O模型   Winsock 2引入了重叠I/O的概念,并且要求所有的传输协议提供者都

文档评论(0)

autohhh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档