您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 基于NetBIOS的网络编程
网络编程与开发技术天津职业技术师范大学信息学院第二章基于NetBIOS的网络编程内容提要1、NetBIOS基本概念2、NetBIOS命令功能3、网络编程设计要素4、NetBIOS基本程序5、数据报通信程序设计6、会话通信程序设计§2.1NetBIOS基本概念第二章基于NetBios的网络编程NetBIOS概述LANA编号NetBIOS名字服务NetBIOS命令网络控制块(NCB)§2.1.1NetBIOS概述第二章基于NetBios的网络编程NetBIOS是网络基本输入/输出系统的缩写,为网络通信程序提供了一种会话层的编程接口。与TCP/IP和IPX/SPX等协议比,具有极高的通信效率。MicrosoftTCP/IP和NetBEUI在默认情况下已提供了一个NetBIOS接口。对IPX/SPX来说,在Windows9X中,有一个特殊的复选框,名为“希望在IPX/SPX上启用NetBIOS”,在Windows2000提供的协议本身就叫作“NWLinkIPX/SPX/NetBIOS兼容传送协议”。NetBEUI并非是一种“可路由”协议。假定在客户机和服务器之间存在一个路由器,那么这种协议在两部机器上的应用便无法沟通。§2.1.2LANA编号第二章基于NetBios的网络编程LANA(LANadapter)编号:每个LANA编号对应于网卡及传输协议的唯一组合。用于指定使用哪块网卡进行网络通信。例如,假定某工作站安装了两张网卡,以及两种具有NetBIOS能力的传输协议(如TCP/IP和NetBEUI),那么总共就有四个LANA编号。下面是一种对应关系的例子:LANA0NetBEUI—网卡1LANA1TCP/IP—网卡1LANA2NetBEUI—网卡2LANA3TCP/IP—网卡2通常,LANA编号的范围在0到9之间,除LANA0之外,系统并不按某种固定的顺序来分配这些编号。LANA0代表的是“默认”LANA。§2.1.3NetBIOS名字第二章基于NetBios的网络编程NetBIOS名字:NetBIOS是一种按名字工作的系统,在进行通信时,信息的源地址和目的地址都是用名字来表示的。每一个网络计算机都有一个或几个名字,由NetBIOS保留一张名字表,每个名字都为16字节长。NetBIOS名字类型:唯一名:它是独一无二的,网络上不能再有其他任何进程来注册这个名字,如果一台机器已注册了某名字,那么在你注册该名字时,便会收到一条“重复名字”出错提示。组名:多个节点可拥有同一组名,它主要用于多播(多点发送)数据通信。§2.1.3NetBIOS名字第二章基于NetBios的网络编程命名规则:在为一个节点指定名字时,注意不要用*号或二进制0开头,也不要用“IBM”这3个字母开头,因为这些名字都是系统保留的。每个名字都为16字节长。为了保证名字表中的唯一名字都是互不相同的,在往名字表中加入新的唯一名字时,NetBIOS首先在本地名字表中检查,如无重名,则在整个网络内发出一条特殊的广播询问消息,如果在规定的时间内没有其他节点回应这条消息,便允许发送者使用该名字,同时给出对应的名字号。对每个LANA来说,能够添加的名字的最大数量是254,名字号从1到254(0和255由系统保留)。§2.1.4NetBIOS命令第二章基于NetBios的网络编程NetBIOS命令:NetBIOS的所有功能都是由通过执行一系列命令来完成的,大部分NetBIOS命令都有等待(同步)和非等待(异步)两种调用方式。NetBIOS命令执行方式:等待方式:指NetBIOS要等到该命令完成之后才能返回到主调程序。只有少数几个NetBIOS命令必须采用这种方式,如NetBIOS复位命令、取消命令等。非等待方式:将处理程序地址(回调地址)或一个事件句柄传递给NetBIOS,让它在命令完成时唤醒该处理程序或触发一个事件。命令发送后NetBIOS立即返回到主调程序。当该命令执行完成时将自动唤醒处理程序或触发相应的事件。§2.1.5网络控制块(NCB)第二章基于NetBios的网络编程NCB(网络控制块):提供执行一个NetBIOS命令需要的全部信息。在WIN32环境下,各种NetBIOS命令是通过调用NetBIOSAPI的Netbios函数来实现的,该函数的调用方式为:UCHARNetbios(PNCBpNCB);在头文件Nb30.h内定义有用于NetBIOS的所有函数声明、常数。若想连接NetBIOS应用,唯一需要的库是Netapi32.lib。例:#includenb30.h#pragmacomment(lib,netapi32.lib)……PNCBncb1;Netbios(&ncb1);§2.1.5网络控制块(NCB)第二章基于NetBios的网络编程struct_NCB{UCHARncb_command;//commandcodeUCHARncb_retcode;//returncodeUCHARncb_lsn;//localsessionnumberUCHARncb_num;//numberofournetworknamePUCHARncb_buffer;//addressofmessagebufferWORDncb_length;//sizeofmessagebufferUCHARncb_callname[NCBNAMSZ];//blank-paddednameofremoteUCHARncb_name[NCBNAMSZ];//ourblank-paddednetnameUCHARncb_rto;//rcvtimeout/retrycountUCHARncb_sto;//sendtimeout/systimeoutvoid(CALLBACK*ncb_post)(struct_NCB*);//POSTroutineaddressUCHARncb_lana_num;//lana(adapter)numberUCHARncb_cmd_cplt;//0xff=commmandpendingUCHARncb_reserve[10];//reserved,usedbyBIOSHANDLEncb_event;//HANDLEtoWin32eventwhichwillbesettothe//signalledstatewhenanASYNCHcommandcompletes}NCB,*PNCB;§2.1.5网络控制块(NCB)第二章基于NetBios的网络编程NCB结构各字段含义说明如下:1)ncb_command:指定要执行的NetBIOS命令。许多命令都可同步或异步,通过将NetBIOS命令代码与ASYNCH(0X80)标志按位OR运算来表示异步执行。2)ncb_retcode:指定操作的立即返回代码。在一个异步操作进行期间,函数会将该值设为NRC_PENDING。3)ncb_lsn:对应一个本地会话编号,与当前环境内的一次会话有着唯一对应的关系。成功执行了一次NCBCALL或NCBLISTEN命令后,函数会返回一个新的会话编号。4)ncb_num:指定本地名字的编号。伴随NCBADDNAME或NCBADDGRNAME命令的每一次调用,都会返回一个新编号。针对所有数据报命令,都必须使用一个有效的编号。5)ncb_buffer:指向数据缓冲区。对那些需要发送数据的命令,该缓冲区包含了要送出的实际数据;而对那些需要接收数据的命令,则包含了要从NetBIOS函数返回的数据。6)ncb_length:以字节数为单位,指定缓冲区的长度。对于接收命令来说,NetBIOS会将该值设为收到的字节数。若指定的缓冲区不够大,NetBIOS就会返回NRC_BUFLEN错误。§2.1.5网络控制块(NCB)第二章基于NetBios的网络编程7)ncb_callname:指定远程应用的名字。8)ncb_name:指定应用程序本地名字。9)ncb_rto:设定接收操作的超时期限。该值应设为500毫秒的一个整数倍数。若为-1,表示没有超时限制。该值是为NCBCALL和NCBLISTEN命令设置的,它们会影响后续的NCBRECV命令。10)ncb_sto:设定发送操作的超时期限。该值应设为500毫秒的一个整数倍数。若为-1,表示不存在超时限制。该值是为NCBCALL和NCBLISTEN命令设置的,它们会影响后续的NCBSEND和NCBCHAINSEND命令。11)ncb_post:指定异步命令完成后需要调用的后例程的地址。函数定义为:voidCALLBACKPostRoutine(PNCBpncb);其中,pncb指向已完成命令的网络控制块。12)ncb_lana_num:指定要在上面执行命令的LANA编号。13)ncb_cmd_cpl:指定操作的最终返回代码。异步操作进行期间,Netbios会将这个值设为NRC_PENDING。14)ncb_reserve:保留,必须为0。§2.1.5网络控制块(NCB)第二章基于NetBios的网络编程15)ncb_event:指定设置为“无信号”(Nonsignaled)状态的一个Windows事件对象的句柄。完成一个异步命令后,事件便会设置成它的“有信号”(Signaled)状态,通知并唤醒应用程序一个异步命令执行结束,返回码可由ncb_cmd_cpl字段获得。假若ncb_command未设置ASYNCH标志,或者ncb_post不为0,那么该字段必须为0。否则,NetBIOS会返回NRC_ILLCMD错误。注意,并不是在对NetBIOS的每次调用中都需要用到该结构内的全部成员;有些数据字段对应的是输出参数(即NetBIOS调用返回之后才能设置)。在此提醒大家重要的一点,进行任何NetBIOS调用之前,应先将这个NCB结构清零,然后再开始填写结构内的相应成员。§2.2NetBIOS命名功能第二章基于NetBios的网络编程名字管理命令数据报通信命令会话通信命令控制和测试命令§2.2.1名字管理命令第二章基于NetBios的网络编程NetBIOS名字管理命令包括AddName、AddGroupName、DeleteName3条,每条命令都有等待和非等待两种方式,通常均应采用等待方式。(1)AddName命令命令代码:NCBADDNAME(等待),NCBADDNAME|ASYNCH(非等待);命令功能:在本地名字表中添加一个唯一名字,并返回一个名字号;NCB输入:ncb_command:NCBADDNAME(0x30)或NCBADDNAME|ASYNCH(0xB0);ncb_name:要添加的16字节名字串,最后一个字符为“空”字符;ncb_post:异步命令完成后需要调用的后例程地址或“空”;ncb_event:异步命令完成后需触发的事件句柄,同步命令时为“空”;ncb_lana_num:网络适配器编号,选0或1;NCB输出:ncb_num:返回新注册名字的编号;ncb_retcode:命令的立即返回码,成功为NRC_GOODRET(0x00);ncb_cmd_cplt:命令的最终返回码,成功为NRC_GOODRET(0x00),在异步等待期该字段值为NRC_PENDING;§2.2.1名字管理命令第二章基于NetBios的网络编程例:加名字UCHARAddName(UCHAR*Name,UCHAR*NameNum){NCBncb;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBADDNAME;ncb.ncb_lana_num=0;strcpy(ncb.ncb_name,Name);Netbios(&ncb);*NameNum=ncb.ncb_num;return(ncb.ncb_cmd_cplt);}§2.2.1名字管理命令第二章基于NetBios的网络编程(2)AddGroupName命令代码:NCBADDNAME(等待),NCBADDNAME|ASYNCH(非等待);命令功能:在本地名字表中添加
本文标题:基于NetBIOS的网络编程
链接地址:https://www.777doc.com/doc-485 .html