加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Windows网络编程技术

Windows网络编程技术.pdf

Windows网络编程技术

老书不好找
2010-11-10 0人阅读 举报 0 0 暂无简介

简介:本文档为《Windows网络编程技术pdf》,可适用于IT/计算机领域

WINDOWS网络编程技术目录第一部分传统网络API第章NetBIOSMicrosoftNetBIOSLANA编号NetBIOS名字NetBIOS特性NetBIOS编程基础常规NetBIOS例程会话服务器:异步回调模型会话服务器:异步事件模型NetBIOS会话客户机数据报的工作原理其他NetBIOS命令适配器状态查找名字将传送协议同LANA编号对应起来平台问题WindowsCEWindowsx常规问题小结第章重定向器通用命名规范多UNC提供者网络提供者重定向器简介服务器消息块安全问题安全描述符访问令牌网络安全一个实例小结第章邮槽邮槽实施细节邮槽的名字消息的长度应用程序的编译错误代码基本客户机服务器邮槽服务器的详情邮槽客户机的详情其他邮槽API平台和性能问题字符名字限制不能取消“凝结”的IO请求超时引起的内存废弃小结第章命名管道命名管道的实施细节命名管道命名规范字节模式及消息模式应用程序的编译错误代码客户机与服务器的基础服务器的细节高级服务器的细节客户机的细节其他API调用平台和性能问题小结第二部分WinsockAPI第章网络原理和协议协议的特征面向消息面向连接和无连接可靠性和次序性从容关闭广播数据多播数据服务质量部分消息路由选择的考虑其他特征支持的协议支持的Win网络协议WindowsCE网络协议Winsock协议信息Windows套接字具体平台的问题选择适当的协议小结第章地址家族和名字解析IPTCPUDP定址创建套接字名字解析红外线套接字定址名字解析红外线设备列举查询IAS创建套接字套接字选项IPXSPX编址创建套接字NetBIOS定址创建套接字AppleTalk定址AppleTalk名的注册AppleTalk名的解析创建套接字ATM定址创建套接字把套接字和SAP绑定在一起名字解析Winsock支持的其他函数小结第章Winsock基础Winsock的初始化错误检查和控制面向连接的协议服务器API函数客户机API函数数据传输流协议中断连接综合分析无连接协议接收端发送端基于消息的协议释放套接字资源综合分析其他API函数WindowsCE其他地址家族AppleTalkIrDANetBIOSIPXSPXATM小结第章WinsockIO方法套接字模式锁定模式非锁定模式套接字IO模型select模型WSAAsyncSelectWSAEventSelect重叠模型完成端口模型IO模型的问题小结第章套接字选项和IO控制命令套接字选项SOLSOCKET选项级别SOLAPPLETALK选项级别SOLIRLMP选项级别IPPROTOIP选项级IPPROTOTCP选项级别NSPROTOIPX选项级别IOCTLSOCKET和WSAIOCTL标准IO控制命令其他IO控制命令安全套接字层的IO控制命令ATMIO控制命令小结第章名字注册和解析背景知识名字空间模型服务的注册安装服务类服务的注册服务注册示例服务的查询怎样对服务进行查询查询DNS小结第章多播多播的含义IP多播Internet网关管理协议IP叶节点IP多播的实施ATM多播ATM叶节点ATM根节点多播与WinsockWinsock多播Winsock多播常用的Winsock选项拨号网络多播的一处限制小结第章常规服务质量背景知识资源预约协议网络组件应用组件策略组件QoS和WinsockQoS结构QoS调用函数QoS中止QoS编程RSVP和套接字类型QoS通知QoS模板示例单播TCP单播UDP多播UDPATM和QoS小结第章原始套接字原始套接字的创建Internet控制消息协议Ping示例Traceroute示例Internet组管理协议IPHDRINCL的使用小结第章Winsock服务提供者接口SPI基础SPI命名规则WinsockAPI和SPI函数之间的映射传输服务提供者WSPStartup参数实例计数套接字句柄WinsockIO模型支持扩展函数传输服务提供者的安装命名空间服务提供者名字空间的安装名字空间的实施名字空间提供者示范WinsockSPI函数的调试追踪小结第章微软VisualBasicWinsock控件属性方法事件UDP示例UDP消息的发送UDP消息的接收获取Winsock信息运行UDP示例UDP状态TCP示例TCP服务器TCP客户机获取Winsock信息运行TCP示例TCP状态存在的局限常见错误WindowsCE的Winsock控件WindowsCEWinsock示例已知的问题小结第三部分远程访问服务第章RAS客户机编译和链接数据结构和平台兼容问题DUN升级和WindowsRASDIAL同步模式异步模式状态通知关闭连接电话簿电话簿条目的增添电话簿条目的重命名电话簿条目的删除电话簿条目的列举用户凭据的管理多链接电话簿的子条目连接管理小结第四部分附录附录ANetBIOS命令索引附录BIP助手函数附录CWinsock错误代码下载下载本书第一部分讲述的是传统的网络接口NetBIOS、重定向器以及通过重定向器进行的各类网络通信。尽管本书大部分内容均围绕Winsock编程这一主题展开但是API比起Winsock来仍然具有某些独到之处。其中第章探讨的是NetBIOS接口它和Winsock类似也是一种与协议无关的网络API。NetBIOS提供了异步调用同时兼容于较老的操作系统如OS和DOS等等。第章讨论了重定向器的问题它是接下去的两个新主题邮槽(第章)和命名管道(第章)的基础。重定向器提供了与传输无关的文件输入/输出方式。邮槽是一种简单的接口可在Windows机器之间实现广播和单向数据通信。最后命名管道可建立一种双向信道这种信道提供了对Windows安全通信的支持。第章NetBIOS“网络基本输入/输出系统”(NetworkBasicInputOutputSystem,NetBIOS)是一种标准的应用程序编程接口(API)年由Sytek公司专为IBM开发成功。NetBIOS为网络通信定义了一种编程接口但却没有详细定义物理性的“帧”如何在网上传输。年IBM创制了NetBIOS扩展用户接口(NetBIOSExtendedUserInterface,NetBEUI)它同NetBIOS接口集成在一起终于构成了一套完整的协议。由于NetBIOS接口变得愈来愈流行所以各大厂商也开始在其他如TCPIP和IPXSPX的协议上实施NetBIOS编程接口。到目前为止全球已有许多平台和应用程序需要依赖于NetBIOS其中包括WindowsNT、Windows、Windows和Windows的许多组件。注意WindowsCE并不支持NetBIOSAPI只是用TCPIP作为其传送协议并同时支持NetBIOS的名字与名字解析。WinNetBIOS接口向后兼容于早期的应用程序。本章要讨论的是NetBIOS编程基础。首先向大家介绍的是NetBIOS的一些基本知识从NetBIOS的名字及LANA编号开始接着我们围绕NetBIOS提供的基本服务展开讨论比如面向会话和“无连接”通信等等。在每一节都展示了一个简单的客户机和服务器示例。在本章最后我们陈列了程序员需留意的一系列陷阱以及易犯的错误。在本书的附录A中大家可找到一份命令索引其中对每个NetBIOS命令都进行了总结包括必要的参数以及对其行为的简单说明。OSI网络模型“开放系统互连”(OSI)模型从一个很高的层次对网络系统进行了描述。OSI模型总共包含了七层。从最顶部的“应用层”开始一直到最底部的“物理层”这七个层完整阐述了最基本的网络概念。图展示的正是OSI模型的样子。第一部分传统网络API图OSI网络模型对应OSI模型NetBIOS主要在会话和传输层发挥作用。MicrosoftNetBIOS如前所述NetBIOSAPI实施方案适用于为数众多的网络协议使得编程接口“与协议无关”。换言之假如根据NetBIOS规范设计了一个应用程序它就能在TCPIP、NetBIOS甚至IPXSPX上运行。这是一项非常有用的特性因为对一个设计得当的NetBIOS应用程序来说它几乎能在任何机器上运行无论机器连接的物理网络是什么。然而我们也必须留意几个方面的问题。要想使两个NetBIOS应用(程序)通过网络进行正常通信那么对它们各自运行的机器来说至少必须安装一种两者通用的协议。举个例子来说假定小张的机器只安装了TCPIP而小马的机器只安装了NetBEUI那么对小张机器上的NetBIOS应用来说便无法同小马机器上的应用进行通信。除此以外只有部分协议实施了NetBIOS接口。MicrosoftTCPIP和NetBEUI在默认情况下已提供了一个NetBIOS接口然而IPXSPX却并非如此。为此微软专门提供了一个IPXSPX版本在其中实现了该接口。在设计网络时这个问题必须注意。安装协议时具有NetBIOS能力的IPXSPX协议通常会自动提醒你注意这方面的问题。例如Windows提供的协议本身就叫作“NWLinkIPXSPXNetBIOS兼容传送协议”。而在Windows和Windows中请留意IPXSPX协议属性对话框其中有一个特殊的复选框名为“希望在IPXSPX上启用NetBIOS”。另外要注意的一个重要问题是NetBEUI并非是一种“可路由”协议。假定在客户机和服务器之间存在一个路由器那么这种协议在两部机器上的应用便无法沟通。收到数据包后路由器便会将其“无情地”地抛弃。TCPIP和IPXSPX则不同它们均属“可路由”协议不会出现这方面的问题。要注意的是假如你需要在很大程度上依靠NetBIOS那么在配置网络时至少应安装一种可路由的传送协议。要想深入了解各种协议的特征以及相应的注意事项请参阅第章。LANA编号从编程角度思考大家或许会觉得奇怪传送协议与NetBIOS如何对应起来呢?答案便在于LAN适配器(LANadapter,LANA)编号它是我们理解NetBIOS的关键。在最初的NetBIOS实施方案中每张物理网卡都会分配到一个独一无二的值:即LANA编号。但到Win下这种做法便显得有些问题。因为对一个工作站来说它完全可能同时安装了多种网络协议也可能安装了多张网卡。计计第一部分附传统网络API下载应用层层描述为用户提供相应的界面以便使用提供的连网功能完成数据的格式化控制两个主机间的通信链路(开放、操作和关闭)提供数据传输服务(可靠或不可靠)在两个主机之间提供一套定址寻址机制同时负责数据包的路由选择控制两个主机间的物理通信链路:同时还要负责对数据进行整形以便在物理媒体上传输物理媒体负责以一系列电子信号的形式传出数据表示层会话层传输层网络层数据链路层物理层每个LANA编号对应于网卡及传输协议的唯一组合。例如假定某工作站安装了两张网卡以及两种具有NetBIOS能力的传输协议(如TCPIP和NetBEUI)那么总共就有四个LANA编号。下面是一种对应关系的例子:TCPIP网卡NetBEUI网卡TCPIP网卡NetBEUI网卡通常LANA编号的范围在到之间除LANA之外操作系统并不按某种固定的顺序来分配这些编号。那么LANA有什么特殊含义呢?LANA代表的是“默认”LANA!NetBIOS问世早期许多应用都采用硬编码的形式只依赖LANA进行工作。在那时大多数操作系统也只支持一个LANA编号。考虑到向后兼容的目的我们可将LANA人工分配给一种特定的协议。在Windows和Windows中通过选择控制面板中的“网络”图标可访问一种网络协议的“属性”对话框。在“网络”对话框中选择“配置”选项卡再从网络组件列表中选择一种网络协议按下“属性”按钮即可。对具有NetBIOS能力的每一种协议来说其属性对话框的“高级”选项卡都有一个“设成默认的通信协议”复选框。若选中这个复选框会重新安排协议的绑定使默认协议能够分配到LANA。注意在任何时候只能有一种协议才能选中这个复选框。由于Windows和Windows具有所谓的“即插即用”功能所以我们没有其他办法可对协议的编号顺序进行更改。WindowsNT则允许用户在设置NetBIOS时拥有更大的灵活性。在“网络”对话框的“服务”选项卡中可从“网络服务”列表框内选择NetBIOS接口然后点按“属性”按钮。随后便会出现“NetBIOS配置”对话框在这里可针对每一对网卡/传输协议的组合分配各自的LANA编号。在这个对话框中每张网卡都以其驱动程序的名字加以标识但协议名称却显得有些暧昧。在图中我们展示了NetBIOS配置对话框的样子。单击其中的“Edit”(编辑)按钮便可为每种协议单独分配LANA编号。Windows也允许我们单独分配LANA编号。在控制面板中双击“网络和拨号连接”图标。随后从“高级”菜单中选择“高级设置”然后在高级设置对话框中选择“LANA编号”选项卡。图NetBIOS配置对话框。这是一部多宿主机器安装了两张网卡和三种传输协议:TCPIP(NetBT)、NetBEUI(Nbf)以及IPXSPX(NwlnkNb)第章计NetBIOS计计下载要想设计出一个“健壮”的NetBIOS应用必然需要让自己的代码能对任意LANA编号上的连接进行控制。例如假定小马编写了一个NetBIOS服务器应用对LANA上的客户机进行监听。在小马的机器(即服务器)上LANA正好对应于TCPIP。后来小张需要编写一个客户端应用同小马的服务器通信所以他决定让自己的程序通过工作站的LANA建立连接。然而小张工作站上的LANA对应于NetBEUI。这样一来两个应用相互间均无法通信尽管两者都安装了TCPIP和NetBEUI。为纠正协议的这种差异小马的服务器应用程序必须对小马工作站上每个可能的LANA编号上的客户机连接进行“监听”。类似地小张的客户机应用程序需要针对本机每个可能的LANA编号尝试在其上面的连接。只有这样小马和小张才能保证自己的应用尽最大可能成功通信。当然尽管我们需要在代码中对任何LANA编号上的连接进行控制但并不表示能够百分之百地成功。假如两台机器根本就没有安装一种共通的协议那么无论如何都是不能成功的!NetBIOS名字现在我们知道了LANA编号是什么接着再来讨论NetBIOS名字(名称)的问题。对一个进程(或“应用”、“应用程序”)来说它会注册自己希望与其通信的每个LANA编号。一个NetBIOS名字长度为个字符其中第个字符是为特殊用途保留的。在名字表内添加一个名字时应将名字缓冲区初始化成空白。在Win环境中针对每个可用的LANA编号每个进程都会为其维持一张NetBIOS名字表。若为LANA增添一个名字意味着你的应用程序只能在LANA上同客户机建立连接。对每个LANA来说能够添加的名字的最大数量是编号从到(和由系统保留)。然而每种操作系统都设置了一个低于的最大默认值。重设每个LANA编号时我们可对此默认值进行修改。另外NetBIOS名字共有两种类型:唯一名字和组名。“唯一名字”意味着它是独一无二的:网络上不能再有其他任何进程来注册这个名字。如果一台机器已注册了某名字那么在你注册该名字时便会收到一条“重复名字”出错提示。大家或许已经知道微软网络中的机器名采用的便是NetBIOS名字。机器启动时会将自己的名字注册到本地的“Windows互联网命名服务器”(WINS)。如果事前已有另一台机器注册了同样的名字WINS服务器便会报错。WINS服务器维护着已注册的所有NetBIOS名字的一个列表。除此以外随名字一道还可保存协议特有的一些信息。比如在TCPIP网络中WINS同时维护着NetBIOS名字以及注册那个名字的IP地址(亦即相应的机器)。假如配置网络时未为其分配一个WINS服务器那么如何检查名字是否重复呢?这时便要采用在整个网络内“发广播”的形式。当一名发送者向全网络发出一条特殊的广播消息时如果没有其他机器回应这条消息便允许发送者使用该名字。而在另一方面“组名”的作用是将数据同时发给多个接收者或者相反接收发给多个接收者的数据。组名并非一定要“独一无二”它主要用于多播(多点发送)数据通信。在NetBIOS名字中第个字符用于区分不同的微软网络服务。各种网络服务和组名需要用一个WINS服务器完成注册。要么由配置了WINS功能的计算机进行名字的直接注册要么由那些尚未配置WINS功能的计算机通过在本地子网内进行广播注册。Nbtstat命令是一个非常有用的工具可用它获取与本地(或远程)计算机上注册的NetBIOS名字有关的信息。在表展示的例子中Nbtstatn命令可针对用户“Davemac”生成这个已注册的NetBIOS名字的列表。Davemac登录进入的那部计算机已被配置成一个主域控制器而且运行的是计计第一部分附传统网络API下载WindowsNTServer操作系统且已安装了Internet信息服务器(IIS)。表NetBIOS名字表名字第个字节名字类型服务DAVEMAC<>唯一工作站服务名DAVEMAC<>唯一服务器服务名DAVEMACD<>成组域名DAVEMACD<C>成组域控制器名DAVEMACD<B>唯一主控浏览器名DAVEMAC<>唯一发信者名Inet~Services<C>成组Internet信息服务器组名IS~DAVEMAC<>唯一Internet信息服务器唯一名DAVEMAC<BF>唯一网络监视器名字只有在安装了TCPIP协议的前提下才会安装Nbtstat命令。该工具亦可用来查询远程机器的名字表方法是在远程机器的名字后面接上一个a参数或在远程机器的IP地址后接上一个A参数。在表中我们总结了各种不同的Microsoft网络服务为唯一NetBIOS计算机名追加的默认第个字节值。表唯一名字标识符第个字节含义<>工作站服务名。通常它对应于NetBIOS计算机名<>收发消息时采用的信使服务名。WINS服务器会将这个名字注册成WINS客户机上的信使服务并通常追加到计算机名后面以及当前登录到计算机的用户名的后面<B>域主控浏览器名。这个名字用于标识主域控制器并指出用什么客户机和其他浏览器同域主控浏览器取得联系<>远程访问服务(RAS)服务器服务<F>网络动态数据交换(NetDDE)服务<>用于为文件共享提供“共享点”的服务器服务名<>RAS客户机<BE>网络监视器代理<BF>网络监视器工具表则列出了在常用的一系列NetBIOS组名后追加的默认第个字节字符。如此多的标识符很易使人产生混淆很难真正记住。所以请考虑把它作为一个“速查表”或“索引”使用。大家或许不应在自己的NetBIOS名字中使用它们。为防止偶然同你的NetBIOS名字发生冲突最好避免使用唯一名字标识符。对于组名恐怕更要引起高度注意假如你的名字同一个已有的组名相同那么不会产生任何错误提示。若发生这种情况结果就是会收到原本发给其他人的数据。表组名标识符第个字节含义<C>一个域组名在这个组内包含了已注册域名的一系列计算机的特定地址。由域控制器来注册这个名字。WINS将它当作一个域组看待:组内每个成员必须单独更新自己的名字。域组最多只能包容个名字。若复制的一个静态C名字同另一个WINS服务器上的某个动态C名字发生冲突便会增加成员的一个“联合”同时将记录标定为“静态”。假如记录是静态的组内成员便不必定时刷新自己的IP地址第章计NetBIOS计计下载(续)第个字节含义<D>指定一个主控浏览器的名字客户机通过它访问主控浏览器。在一个子网上只能有一个主控浏览器。WINS服务器会对域名注册作出“正”(肯定)响应但却不会将域名保存在自己的数据库中。假如一台计算机向WINS服务器送出一个域名查询则WINS服务器会返回一个“负”(否定)响应。若送出域名查询的那台计算机已被配置成h节点或m节点便会随之广播那个查询以解析出正确的名字。客户机解析名字的方法是由节点的类型决定的。如客户机配置成b节点解析便会送出广播包以便广告并解析出NetBIOS名字。p节点解析采用与WINS服务器的点到点通信方式。而m节点属于b及p节点的一种混合形式:首先使用的是b节点如有必要再接着使用p节点。最后一种解析方式是h节点亦称“混合模式”。它无论如何都会先尝试使用p节点注册和解析然后只有在解析失败的前提下才会换用b节点。Windows操作系统默认为h节点<E>一个普通组名。浏览器可向这个名字发送广播数据并通过对它的监听来挑选一个主控浏览器。这些广播面向的是本地子网绝对不应通过路由器传输<>一个Internet组名。这种类型的名字由WINS服务器进行注册以便为了管理方面的目的来标定特定的计算机组。例如“printersg”可以是一个注册的组名用于标定由打印服务器构成的一个管理性组MSBROWSE不再是单独一个追加的第位字符“MSBROWSE”需要追加到一个域名后面并在本地子网上进行广播向其他主控浏览器通告这个新增的域NetBIOS特性NetBIOS同时提供了“面向连接”服务以及“无连接”服务。面向连接的服务是指它允许两个客户机相互间建立一个会话或者说建立一个“虚拟回路”。这种“会话”实际是一种双向的通信数据流通信的每一方都可向另一方发送消息。面向连接的服务可担保在两个端点之间任何数据都能准确无误地传送。在这种服务中服务器通常将自己注册到一个已知的名字下。客户机会搜寻这个名字以便建立与服务器的通信。就拿NetBIOS的情况来说服务器进程会针对想通过它建立通信的每一个LANA编号将自己的名字加入与其对应的名字表。而对位于其他机器上的客户来说就可将一个服务名解析成机器名然后要求同服务器进程建立连接。大家可以看到为建立这种虚拟回路必须采取一些适当的步骤。而且在初次建立连接的时候还会牵涉到一些额外的开销。“面向连接”或“面向会话”的通信可保证通信具有极高的可靠性而且数据包的收发顺序亦能确保正确无误。然而它仍然是一种“以消息为基础”的服务。也就是说假如已连接好的某个客户机执行一个“读”命令那么服务器在流中仍然只会返回一个数据包尽管客户机此时提供了一个足够大的缓冲区可同时容下几个包!“无连接”或数据报服务中服务器并不将自己注册到一个特定的名下而只是由客户机收集数据然后将其送入网络事前不必先建好任何连接(即无连接)。对于数据的目的地址客户机会将其定义成服务器相应进程对应的NetBIOS名字。这种类型的服务不提供任何保障但同面向连接的服务相比却可有更好的性能如在使用数据报服务(无连接服务)时省下了建立连接所需的开销。例如客户机可能向服务器兴冲冲地一下子发出数千字节的数据但那台服务器早在一两天前便已当机了。除非依赖自服务器传来的响应否则客户机永远都收不到任何错误提示(在这种情况下假如在一个特定的时间段内没有收到任何响应便计计第一部分附传统网络API下载可认为服务器出了故障)。数据报服务既不能保证数据传输的可靠性也不能保证数据包的传送顺序正确无误。NetBIOS编程基础现在我们已理解了NetBIOS的一些基本概念接下来要讨论的是NetBIOSAPI的设置这其实非常简单因为只有一个函数:UCHARNetbios(PNCBpNCB)用于NetBIOS的所有函数声明、常数等等均是在头文件Nbh内定义的。若想连接NetBIOS应用唯一需要的库是Netapilib。该函数最重要的特征便是pNCB这个参数它对应于指向某个网络控制块(NCB)的一个指针。在那个NCB结构中包含了为执行一个NetBIOS命令相应的Netbios函数需要用到的全部信息。该结构的定义如下:注意并不是在对NetBIOS的每次调用中都需要用到该结构内的全部成员有些数据字段对应的是输出参数(换言之自Netbios调用返回之后才能设置)。在此提醒大家重要的一点:进行任何Netbios调用之前不要一开始就填写结构内的各个成员而应先将这个NCB结构清零!请看看表的总结其中解释了每个字段的用法。此外本书附录A的命令索引对每个NetBIOS命令都进行了详尽总结并解释了它需要用到NCB结构中的哪些字段以及哪些字段可选。表NCB结构成员字段定义ncbcommand指定要执行的NetBIOS命令。许多命令都可同步或异步与ASYNCH(X)标志以及命令进行按位OR(或)运算ncbretcodef指定操作的返回代码。在一个异步操作进行期间函数会将该值设为NRCPENDINGncblsn对应一个本地会话编号与当前环境内的一次会话有着唯一对应的关系。成功执行了一次NCBCALL或NCBLISTEN命令后函数会返回一个新的会话编号ncbnum指定本地名字的编号。伴随NCBADDNAME或NCBADDGRNAME命令的每一次调用都会返回一个新编号。针对所有数据报命令都必须使用一个有效的编号ncbbuffer指向数据缓冲区。对那些需要发送数据的命令该缓冲区包含了要送出的实际数据而对那些需要接收数据的命令则包含了要从Netbios函数返回的数据。对其第章计NetBIOS计计下载(续)字段定义他命令来说如NCBENUM缓冲区便是预定义的结构LANAENUMncblength以字节数为单位指定缓冲区的长度。对于接收命令来说Netbios会将该值设为收到的字节数。若指定的缓冲区不够大Netbios就会返回NRCBUFLEN错误ncbcallname指定远程应用的名字ncbname指定应用程序已知的名字ncbrto设定接收操作的超时期限。该值应设为毫秒的一个整数倍数。若为表示没有超时限制。该值是为NCBCALL和NCBLISTEN命令设置的它们会影响后续的NCBRECV命令ncbsto设定发送操作的超时期限。该值应设为毫秒的一个整数倍数。若为表示不存在超时限制。该值是为NCBCALL和NCBLISTEN命令设置的它们会影响后续的NCBSEND和NCBCHAINSEND命令ncbpost指定异步命令完成后需要调用的后例程的地址。函数定义为:voidCALLBACKPostRoutine(PNCBpncb)其中pncb指向已完成命令的网络控制块ncblananum指定要在上面执行命令的LANA编号ncbcmdcpl指定操作的返回代码。异步操作进行期间Netbios会将这个值设为NRCPENDINGncbreserve保留必须为ncbevent指定设置为“未传信”(Nonsignaled)状态的一个Windows事件对象的句柄。完成一个异步命令后事件便会设置成它的“传信”(Signaled)状态。只应使用人工重设事件。假若ncbcommand未设置ASYNCH标志或者ncbpost不为那么该字段必须为。否则Netbios会返回NRCILLCMD错误同步与异步调用Netbios函数时可选择进行同步调用还是进行异步调用。所有NetBIOS命令本身均是同步的。换言之完成命令以前会一直调用Netbios块。而对一个NCBLISTEN命令来说当有一个客户机建立了连接或发生某种类型的错误时对Netbios的调用才会返回。要想异步调用一个命令需要让NetBIOS命令同ASYNCH标志进行一次逻辑OR(或)运算。如指定了ASYNCH标志那么必须在ncbpost字段中指定一个后例程(PostRoutine)或必须在ncbevent字段中指定一个事件句柄。执行一个异步命令时从Netbios返回的值是NRCGOODRET(x)但ncbcmdcplt字段会设为NRCPENDING(xFF)。除此以外Netbios函数还会将NCB结构的ncbcmdcplt字段设为NRCPENDING(待决)直到命令完成为止。命令完成后ncbcmdcplt字段会设为该命令的返回值。Netbios也会在完成后将ncbretcode字段设为命令的返回值。常规NetBIOS例程本节将讨论一个基本的NetBIOS服务器应用程序。之所以首先拿服务器开刀是由于服务器的设计决定了客户机的行为。由于大多数服务器都要求同时为多个客户提供服务所以异步NetBIOS模型是最适合的。展示这个服务器应用程序例子时我们同时用到了异步回调(CallBack)例程以及事件模型。但在我们首先展示的源码中必须实现大多数NetBIOS应用程序、都要用到的一些常规函数。程序清单取自文件Nbcommonc它可在本书配套光盘计计第一部分附传统网络API下载的ExamplesChapterCommon目录下找到。贯穿全书的示范代码都会用到来自本文件的一系列基本函数。程序清单常规NetBIOS例程(Nbcommonc)第章计NetBIOS计计下载计计第一部分附传统网络API下载第章计NetBIOS计计下载计计第一部分附传统网络API下载在Nbcommonc中出现的第一个常规例程是LanaEnum。这是几乎所有NetBIOS应用都会用到的一个最基本的例程。该函数可列举一个指定系统上可用的所有LANA编号。函数会将一个NCB结构初始化成将ncbcommand字段设为NCBENUM为ncbbuffer字段分配一个LANAENUM结构并将ncblength字段设为LANAENUM结构的长度。在NCB结构正确初始化之后为执行NCBENUM命令LanaEnum函数需要采取的唯一行动便是调用Netbios函数。如大家所见一个NetBIOS命令的执行异常简单。对同步命令来说自Netbios返回的值可告诉我们命令是否成功执行。注意常数NRCGOODRET肯定意味着“成功”。使用当前机器上可用的LANA编号数量以及各个实际的LANA编号一次成功的NetBIOS调用会填充完善指定的LANAENUM结构。LANAENUM结构的定义如下:其中length成员指出本地机器共有多少个LANA编号。lana字段代表由实际的LANA编号构成的一个数组。而length值指出lana数组内有多少个元素会被填充LANA编号。接下去的一个函数是ResetAll(全部重设)。同样该函数会在所有NetBIOS应用中用到。对一个编写风格良好的NetBIOS程序来说必须重设计划使用的每个LANA编号。一旦拥有一个LANAENUM结构并有来自LanaEnum的LANA编号便可针对结构中的每个LANA编号调用NCBRESET命令来重设它们。这正是ResetAll要帮我们达到的目的函数的第一个参数是LANAENUM结构。重设只要求函数将ncbcom

用户评价(9)

  • jackli2012 书很好,很清晰,里面有很多讲解的实例代码。

    2013-04-15 00:57:26

  • 10.49.1.14 非常不错,谢谢了

    2013-02-26 05:34:30

  • zqc260216637 看看再说也不迟哦

    2012-11-16 18:10:05

  • cuizichuan 是不错,很好,顶一个

    2012-06-22 22:10:04

  • glue4177 很清晰,有目录

    2012-06-15 19:39:31

点击加载更多内容
关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

Windows网络编程技术

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利