第2章基于NetBIOS的网络编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第2章基于NetBIOS的网络编程网络基本输入/输出系统(NetBIOS)是一个传统的应用程序接口(API),用于数据源和目的地之间的数据交换。NetBIOS同时兼容于较老的操作系统,如OS/2和DOS等。NetBIOS为程序提供了请求低级网络服务的统一命令集,从而实现了给局域网(LAN)提供网络以及其他特殊功能的目的。目前NetBIOS改进版(NetBEUI)与TCP/IP以及IPX/SPX合称为LAN通信三大协议。此外,几乎所有的LAN都是在NetBIOS协议基础上工作的。第2章基于NetBIOS的网络编程2.1NetBIOS的基本概念2.2NetBIOS命令2.3数据报通信程序设计2.4会话通信程序设计2.1.1NetBIOS概述NetBIOS是一种标准的应用程序编程接口(API),1983年由Sytex公司专为IBM开发成功,它为网络通信定义了一种编程接口。1985年,IBM创建了NetBIOS扩展用户接口NetBEUI,它同NetBIOS接口集成在一起,构成了一套完整的协议。后来由于NetBIOS接口愈来愈流行,所以各大厂商也开始在其他(如TCP/IP)协议上实施NetBIOS程序接口。NetBIOS特性1、NetBIOSAPI接口适用于为数众多的网络协议,使得程序接口“与协议无关”。2、NetBIOS协议短小精练,与TCP/IP和IPX/SPX相比具有极高的网络通信性能,非常适用于实时性要求较高的小型LAN网络环境3、NetBIOS同时提供了“面向连接”与“非面向连接(无连接)”服务NetBIOS特性4、利用NetBIOS接口编程必须注意以下三个问题:①为保证两个NetBIOS应用程序通过网络进行正常通信,那么对它们各自执行的计算机来说,至少必须安装一种两者通用的协议②MicrosoftTCP/IP和NetBEUI在默认的情况下已提供了NetBIOS接口,但是IPX/SPX却并非如此;③与TCP/IP和IPX/SPX不同,NetBEUI不是一种“可路由”协议,因此要想在两个不同子网中保证两个NetBIOS应用程序正常通信,那么在配置网络时,至少应安装一种可路由的传送协议。NetBIOS在Windows中的应用Windows的客户机/服务器(C/S)网络系统就是基于NetBIOS的网络;WindowsNT操作系统中的大量的内部联网工作也都是利用NetBIOS来完成的。微软还为许多协议提供了标准NetBIOS界面,如TCP/IP、NetBEUI和NWLink,使NetBIOS的应用更加趋于方便网络应用举例:浏览网上邻居、共享文件Windows2000/XP中的NetBIOS的设置DHCP是DynamicHostConfigurationProtocol的缩写,它是TCP/IP协议簇中的一种,主要是用来给网络客户机分配动态的IP地址。这些被分配的IP地址都是DHCP服务器预先保留的一个由多个地址组成的地址集,并且它们一般是一段连续的地址。在TCP/IP上使用NetBIOS需要LMHOSTS与WINS服务器来注册NetBIOS名字。Windows2000/XP中的NetBEUI的设置2.1.2LANA编号问题:传送协议与NetBIOS如何对应起来呢?LANA编号——LAN适配器编号定义:每个LANA编号对应于网卡及传输协议的唯一组合。举例:假定某工作站安装了两块网卡,以及两种具有NetBIOS能力地传输协议:TCP/IP和NetBEUI,那么总共就有4个LANA编号。LANA编号下面是它们之间的一种对应关系:0NetBEUI—网卡11TCP/IP—网卡12NetBEUI—网卡23TCP/IP—网卡2通常,LANA编号的范围在0~9之间,除LANA0之外,其它编号由操作系统自行分配,LANA0表示的是“默认”LANA若某工作站装有两块网卡以及三种具有NetBIOS能力的传输协议(如TCP/IP、NetBEUI和IPX/SPX),那么它有多少个LANA编号?2.1.3NetBIOS名字NetBIOS是一种按名字工作的系统,NetBIOS保留一张名字表,每个名字都是16字节长。NetBIOS名字有两种类型:–唯一名:某个节点的应用进程在网络中注册的独一无二的名字。–组名:多个节点可拥有同一组名。主要用于多点发送的数据通信,NetBIOS名字注意:1、为一个节点指定名字时,注意不要用“*”号或二进制“0”开头,也不要用“IBM”这3个字母开头。2、对每个LANA来说,能够添加的名字的最大数量是254,名字号从1到254(0和255由系统保留)2.1.4NetBIOS接口函数NetBIOSAPI函数:UCHARNetbios(PNCBpncb)(1)该函数只有一个参数pncb,它对应于指向某个网络控制块NCB的一个指针,在NCB结构中,包含了为执行一个Netbios命令相对应的Netbios函数需要用到的全部信息。结构定义见书上P14-P15:typedefstruct_NCB{UCHARncb_command;//指定要执行的Netbios命令UCHARncb_retcode;//指定操作的返回值UCHARncb_lsn;//对应一个本地交互编号,成功执行NCBCALL或NCBLISTEN命令后,函数会返回一个新的交互编号UCHARncb_num;//指定本地名字的编号,NCBADDNAME或NCBADDGRNAME命令的每一次使用,都会返回一个新的编号PUCHARncb_buffer;//指向数据缓冲区WORDncb_length;//指定缓冲区的长度UCHARncb_callname[NCBNAMSZ];//指定远程应用程序名字UCHARncb_name[NCBNAMSZ];//指定应用程序已知的名字UCHARncb_rto;//设置接收操作的超时期限UCHARncb_sto;//设置发送操作的超时期限void(CALLBACK*ncb_post)(struct_NCB*);//指定异步命令完成后需要使用的post例程的地址UCHARncb_lana_num;//指定要在上面执行命令的LANA编号UCHARncb_cmd_cplt;//指定操作代码的返回值UCHARncb_reserve[10];//保留,必须为0HANDLEncb_event;//指定设置Nonsignaled状态的一个windows事件对象的句柄}NCB,*PNCB;并不是在对NetBIOS的每次调用中都需要用到Ncb结构内的全部成员,在调用一个NetBIOS命令时并不一定要填写每一个NCB域;此外,NCB中的一些域具有输出参数的功能,命令执行后的返回值将填充到这些域中。还应当注意的是,在填写NCB结构成员之前,必须对这个NCB结构清零,消除残留参数的影响,然后再开始填写结构内的相应成员。UCHARAddName(CHAR*Name,UCHARLana,UCHAR*NameNum){NCBncb;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBADDNAME;ncb.ncb_lana_num=Lana;strcpy((char*)ncb.ncb_name,Name);Netbios(&ncb);*NameNum=ncb.ncb_num;return(ncb.ncb_cmd_cplt);}NetBIOS接口函数(2)使用函数Netbios必须注意:①程序的头文件中必须包含“nb30.h”:#includenb30.h②程序在链接时加入“netapi32.lib”:#pragmacomment(lib,“netapi32.lib”)2.2NetBIOS命令NetBIOS的所有功能都是通过执行一系列的命令来完成的,共26条命令。(1)NetBIOS命令中大多命令都有同步(等待)或异步(非等待)两种状态,所有命令默认为同步:同步状态:命令原型异步状态:命令原型|ASYNCH同步方式和异步方式的比较:–采用同步方式时,NetBIOS要等到该命令完成之后才能返回到你的程序。–采用异步方式时,将后续处理程序的地址或一个事件句柄告诉给NetBIOS,然后NetBIOS立即返回到当前程序,当该命令执行完成时将自动唤醒处理程序或触发相应的事件。为了提高程序的执行效率,通常采用异步方式,只有少数几个NetBIOS命令必须采用同步方式,如NetBIOS复位命令。(2)26条命令分类:①控制和测试命令(5条):控制命令(3条):NCBRESET、NCBCANCEL、NCBUNLINK;测试命令(2条):NCBSSTAT、NCBASTAT②名字管理命令(3条):NCBADDNAME、NCBADDGRNAME、NCBDELNAME③数据报通信命令(4条):NCBDGSEND(或NCBDGSEND|ASYNCH)NCBDGRECV(或NCBDGRECV|ASYNCH)NCBDGSENDBC(或NCBDGSENDBC|ASYNCH)NCBDGRECVBC(或NCBDGRECVBC|ASYNCH)④会话通信命令(9条):NCBCALL、NCBLISTEN、NCBSEND、NCBCHAINSEND、NCBSENDNA、NCBCHAINSENDNA、NCBRECV、NCBRECVANY、NCBHANGUP⑤其他(5条):NCBACTION、NCBENUM、NCBFINDNAME、NCBLANSTALERT、NCBTRACE2.3基本程序2.3.1初始化程序2.3.2加名字与删除名字2.3.1初始化程序NetBIOS的初始化程序主要包括两个函数:•EnumLana():获得当前所有可用的网卡编号(0~254)•ResetNcb():复位指定网卡上的NetBIOS接口,并重设相关的环境参数ResetNcb()必须在所有NetBIOS应用中首先被执行,只有初始化成功,才能进行后面的工作。LanaEnum()NCB输入:ncb_command=NCBENUMncb_buffer:分配一个LANA_ENUM结构ncb_length:设为LANA_ENUM结构的长度NCB输出:ncb_cmd_cplt:命令的最终返回码,成功为NRC_GOODRET若命令成功执行,则会填充指定的LANA_ENUM结构,其结构定义如下:TypedefstructLANA_ENUM{UCHARlength;//指出本地计算机共有多少个LANA编号UCHARlana[MAX_LANA];//由实际的LANA编号构成的一个数组,}而length值指出lana数组内有多少个元素会被填充LANA编号。UCHARLanaEnum(LANA_ENUM*lenum){NCBncb;UCHARucRc;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBENUM;ncb.ncb_buffer=(PUCHAR)lenum;ncb.ncb_length=sizeof(LANA_ENUM);ucRc=Netbios(&ncb);return(ucRc);}ResetNcb()NCB输入:ncb_command=NCBRESETncb_callname[0]:可同时进行的最大会话数(0为缺省)ncb_callname[2]:可增加的最大NetBIOS名字数(0为缺省)ncb_callname[3]:是否允许主机名作为自己的NetBIOS名字ncb_lana_num:指定要执行复位的LANA编号NCB输出:ncb_cmd_cplt:命令的最终返回码,成功为NRC_GOODRET(0)UCHARRestNCB(UCHARlana){NCBncb;UCHARucRc;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBRESET;ncb.ncb_callname[0]=MAXSESSIONS;ncb.ncb_callname[2]=MAXNAMES;ncb.ncb

1 / 95
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功