2基于NetBIOS的网络编程_第1页
2基于NetBIOS的网络编程_第2页
2基于NetBIOS的网络编程_第3页
2基于NetBIOS的网络编程_第4页
2基于NetBIOS的网络编程_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章 基于NetBIOS的网络编程 网络基本输入/输出系统(NetBIOS)是一个传统的应用程序接口(API),用于数据源和目的地之间的数据交换。 NetBIOS 同时兼容于较老的操作系统,如O S / 2和D O S等。NetBIOS为程序提供了请求低级网络服务的统一命令集,从而实现了给局域网(LAN)提供网络以及其他特殊功能的目的。 目前NetBIOS改进版(NetBEUI)与TCP/IP以及IPX/SPX合称为LAN通信三大协议。此外,几乎所有的LAN都是在NetBIOS协议基础上工作的。 第2章 基于NetBIOS的网络编程2.1 NetBIOS的基本概念2.2 NetBIOS命令2

2、.3 数据报通信程序设计2.4 会话通信程序设计2.1.1 NetBIOS概述 NetBIOS是一种标准的应用程序编程接口(API),1983年由Sytex公司专为IBM开发成功,它为网络通信定义了一种编程接口。1985年,IBM创建了NetBIOS扩展用户接口NetBEUI,它同NetBIOS接口集成在一起,构成了一套完整的协议。后来由于NetBIOS接口愈来愈流行,所以各大厂商也开始在其他(如TCP/IP)协议上实施NetBIOS程序接口。NetBIOS特性1、NetBIOS API接口适用于为数众多的网络协议,使得程序接口“与协议无关”。 2、NetBIOS协议短小精练,与TCP/IP和

3、IPX/SPX相比具有极高的网络通信性能,非常适用于实时性要求较高的小型LAN网络环境3、NetBIOS同时提供了“面向连接”与“非面向连接(无连接)”服务 NetBIOS特性4、利用NetBIOS接口编程必须注意以下三个问题: 为保证两个NetBIOS应用程序通过网络进行正常通信,那么对它们各自执行的计算机来说,至少必须安装一种两者通用的协议 Microsoft TCP/IP和NetBEUI在默认的情况下已提供了NetBIOS接口,但是IPX/SPX却并非如此; 与TCP/IP和IPX/SPX不同,NetBEUI不是一种“可路由”协议,因此要想在两个不同子网中保证两个NetBIOS应用程序正

4、常通信,那么在配置网络时,至少应安装一种可路由的传送协议。NetBIOS在Windows中的应用Windows的客户机/服务器(C/S)网络系统就是基于NetBIOS的网络;Windows NT操作系统中的大量的内部联网工作也都是利用NetBIOS来完成的。微软还为许多协议提供了标准NetBIOS界面,如TCP/IP、NetBEUI和NWLink,使NetBIOS的应用更加趋于方便网络应用举例:浏览网上邻居、共享文件Windows 2000/XP中的NetBIOS的设置DHCP是Dynamic Host Configuration Protocol的缩写,它是TCPIP协议簇中的一种,主要是用

5、来给网络客户机分配动态的IP地址。这些被分配的IP地址都是DHCP服务器预先保留的一个由多个地址组成的地址集,并且它们一般是一段连续的地址。在TCP/IP上使用NetBIOS需要LMHOSTS与WINS服务器来注册NetBIOS名字。Windows 2000/XP中的NetBEUI的设置2.1.2 LANA编号问题:传送协议与NetBIOS如何对应起来呢? LANA编号LAN适配器编号定义:每个LANA编号对应于网卡及传输协议的唯一组合。举例:假定某工作站安装了两块网卡,以及两种具有NetBIOS能力地传输协议:TCP/IP和NetBEUI,那么总共就有4个LANA编号。LANA编号下面是它们

6、之间的一种对应关系: 0 NetBEUI网卡1 1 TCP/IP网卡1 2 NetBEUI网卡2 3 TCP/IP网卡2 通常,LANA编号的范围在09之间,除LANA 0之外,其它编号由操作系统自行分配,LANA 0表示的是“默认”LANA若某工作站装有两块网卡以及三种具有NetBIOS能力的传输协议(如TCP/IP、NetBEUI和IPX/SPX),那么它有多少个LANA编号?2.1.3 NetBIOS名字NetBIOS是一种按名字工作的系统,NetBIOS保留一张名字表,每个名字都是16字节长。NetBIOS名字有两种类型:唯一名:某个节点的应用进程在网络中注册的独一无二的名字。组名:多

7、个节点可拥有同一组名。主要用于多点发送的数据通信,NetBIOS名字注意:1、为一个节点指定名字时,注意不要用“*”号或二进制“0”开头,也不要用“IBM”这3个字母开头。2、对每个LANA来说,能够添加的名字的最大数量是254,名字号从1到254(0和255由系统保留)2.1.4 NetBIOS接口函数NetBIOS API函数: UCHAR Netbios(PNCB pncb)(1)该函数只有一个参数pncb,它对应于指向某个网络控制块NCB的一个指针,在NCB结构中,包含了为执行一个Netbios命令相对应的Netbios函数需要用到的全部信息。结构定义见书上P14P15:typedef

8、 struct _NCB UCHAR ncb_command; /指定要执行的 Netbios命令 UCHAR ncb_retcode; /指定操作的返回值 UCHAR ncb_lsn; /对应一个本地交互编 号,成功执行NCBCALL或NCBLISTEN 命令后,函数会返回一个新的交互编号 UCHAR ncb_num; /指定本地名字的编号, NCBADDNAME或NCBADDGRNAME命 令的每一次使用,都会返回一个新的编号 PUCHAR ncb_buffer; /指向数据缓冲区 WORD ncb_length; /指定缓冲区的长度 UCHAR ncb_callnameNCBNAMSZ;

9、 /指定 远程应用程序名字 UCHAR ncb_nameNCBNAMSZ; /指定应用程 序已知的名字 UCHAR ncb_rto; /设置接收操作的超时期限 UCHAR ncb_sto; /设置发送操作的超时期限 void (CALLBACK*ncb_post) (struct _NCB *); / 指定异步命令完成后需 要使用的post例程的地址 UCHAR ncb_lana_num; /指定要在上面执行命 令的LANA编号 UCHAR ncb_cmd_cplt; /指定操作代码的返回 值 UCHAR ncb_reserve10; /保留,必须为0 HANDLE ncb_event; /指

10、定设置Nonsignaled 状态的一个windows事件对象的句柄 NCB,*PNCB; 并不是在对NetBIOS的每次调用中都需要用到Ncb结构内的全部成员,在调用一个NetBIOS命令时并不一定要填写每一个NCB域;此外,NCB中的一些域具有输出参数的功能,命令执行后的返回值将填充到这些域中。 还应当注意的是,在填写NCB结构成员之前,必须对这个NCB结构清零,消除残留参数的影响,然后再开始填写结构内的相应成员。UCHAR AddName(CHAR * Name,UCHAR Lana,UCHAR * NameNum) NCB ncb; memset(&ncb,0,sizeof(NCB);

11、 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”: include 程序在链接时加入“netapi32.lib”: pragma comment(lib,“netapi32.lib”)2.2 NetBIOS命令 NetBIOS的所有功能都是通过执行

12、一系列的命令来完成的,共26条命令。 (1)NetBIOS命令中大多命令都有同步(等待)或异步(非等待)两种状态,所有命令默认为同步: 同步状态:命令原型 异步状态:命令原型|ASYNCH 同步方式和异步方式的比较: 采用同步方式时,NetBIOS要等到该命令完成之后才能返回到你的程序。采用异步方式时,将后续处理程序的地址或一个事件句柄告诉给NetBIOS,然后NetBIOS立即返回到当前程序,当该命令执行完成时将自动唤醒处理程序或触发相应的事件。 为了提高程序的执行效率,通常采用异步方式,只有少数几个NetBIOS命令必须采用同步方式,如NetBIOS复位命令。 (2)26条命令分类: 控制

13、和测试命令(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、NCBSEN

14、D、NCBCHAINSEND、NCBSENDNA、NCBCHAINSENDNA、NCBRECV、NCBRECVANY、NCBHANGUP 其他(5条): NCBACTION、NCBENUM、NCBFINDNAME、NCBLANSTALERT、NCBTRACE2.3 基本程序2.3.1 初始化程序2.3.2 加名字与删除名字2.3.1 初始化程序 NetBIOS的初始化程序主要包括两个函数:EnumLana():获得当前所有可用的网卡编号(0254)ResetNcb():复位指定网卡上的NetBIOS接口,并重设相关的环境参数 ResetNcb()必须在所有NetBIOS应用中首先被执行,只有初

15、始化成功,才能进行后面的工作。LanaEnum()NCB输入: ncb_command = NCBENUM ncb_buffer: 分配一个LANA_ENUM结构 ncb_length: 设为LANA_ENUM结构的长度NCB输出: ncb_cmd_cplt: 命令的最终返回码,成功为NRC_GOODRET 若命令成功执行,则会填充指定的LANA_ENUM结构,其结构定义如下:Typedef struct LANA_ENUM UCHAR length; /指出本地计算机共有多少个LANA编号 UCHAR lanaMAX_LANA; /由实际的LANA编号构成的一个数组, 而length值指出l

16、ana数组内有多少个元素会被填充LANA编号。UCHAR LanaEnum(LANA_ENUM *lenum) NCB ncb; UCHAR ucRc; 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 = NCBRESET ncb_callname0:可同时进行的最大会话数(0为缺省) nc

17、b_callname2:可增加的最大NetBIOS名字数(0为缺省) ncb_callname3:是否允许主机名作为自己的NetBIOS名字 ncb_lana_num: 指定要执行复位的LANA编号NCB输出: ncb_cmd_cplt: 命令的最终返回码,成功为 NRC_GOODRET(0) UCHAR RestNCB(UCHAR lana) NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBRESET; ncb.ncb_callname0=MAXSESSIONS; ncb.ncb_callname2=MAX

18、NAMES; ncb.ncb_callname3=TRUE; ncb.ncb_lana_num=lana; ucRc=Netbios(&ncb); return(ucRc);初始化NetBIOS程序示例改造main()函数void main() LANA_ENUM lenum; UCHAR ucRc; int i; PNCB pncb; ucRc=LanaEnum(&lenum); if(ucRc!=0) printf(LanaEnum Error code:%d,ucRc); return; else printf(LanaEnum ok!%dn,lenum.length); for(i=0

19、;incb_command=NCBDGSEND; strcpy(char *)pncb-ncb_callname,(char * )DestName); pncb-ncb_num=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=Length; Netbios(pncb);数据报接收函数DatagramRecv()NCB输入: ncb_command = NCBDGRECV|ASYNCH ncb_num: 本地名字号(接收方为自己注册的名字编号) ncb_callname: 发送方的NetBIOS名字 ncb_buffer: 指向接收缓冲区的指针 nc

20、b_length: 接收缓冲区的长度(1512字节) ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令为“空”NCB输出: ncb_cmd_cplt: 命令的最终返回码,成功为 NRC_GOODRETvoid DatagramRecv(PNCB pncb,UCHAR * Name,UCHAR Num, HANDLE hEvent,UCHAR * Buff) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBDGRECV|ASYNCH; strcpy(char *)pncb-ncb_callname,(char * )Name); p

21、ncb-ncb_num=Num; pncb-ncb_buffer=Buff; pncb-ncb_length=512; pncb-ncb_cmd_cplt=0 xff; pncb-ncb_event=hEvent; Netbios(pncb);(1)创建事件HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEvent,/安全属性 BOOL bManuaReset,/是否人工重置 BOOL bInitialState, /初始是否有信号状态 LPCTSTR lpName /名字)DWORD WaitForSingleObject(HANDLE hHandle

22、, DWORD dwMilliseconds) hHandle:同步对象句柄 dwMilliseconds:以毫秒为单位的超时间隔hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); if(hEvent=NULL) return;.DatagramRecv(&RecvNcb,(UCHAR *)RemoteName,LocalNameNum,hEvent,buff);WaitForSingleObject(hEvent,0 xffffffff);简单数据报通信程序示例 发送方“abc”不断给接收方“xyz”发送数据(数据内容由用户指定),双方直到收到一条“exit

23、”消息后停止通信。数据报发送程序数据报接收程序程序说明1、发送方程序采用循环发送结构,接收方程序采用循环接收结构。当发送方从键盘上键入一个字符串后,发送程序将该字符串作为数据报直接发送给接收方,接收方在收到一个数据报后,将收到的字符串显示在屏幕上,如果发送方键入的是“exit”,则通信双方结束通信,程序退出。2、接收方程序用到了两个Windows API函数:创建事件函数CreateEvent()和等待事件函数WaitForSingleObject(),利用这两个函数的目的是用来配合处理异步接收命令。2.3.2 组播与广播通信程序组播通信程序设计: 组播通信与点对点通信程序的结构类似,所用的发

24、送和接收命令也相同,只是发送方在指定接受方的名字时应设置为特定的远程组名,而多个接收方均应使用相同的组名来设置接收。这样,只要发送方发送一个特定的组播数据报,那些以特定组名等待接收的进程均能同时接收到这个组播数据报。课堂练习作业1:拟写程序实现组播通信。发送方 接收工作组ResetNcb()AddName()Send()DeleteName()ResetNcb()AddGRName()Recv()DeleteName()发送数据报到工作组作业一P56页2.3 2.4 2.5 2.62.10广播通信程序设计: 广播通信与组播通信略有不同,主要差别在于: 1. 广播发送与接收应采用特定的广播命令,

25、广播发送用NCBDGSENDBC命令,而广播接收用NCBDGRECVBC命令 2. 由于所有工作站均接收广播消息,因此发送方在发送广播数据报时无需指定ncb_callname的值。利用广播通信实现时间同步程序示例 假设有一个标准时间服务器,当网内一个工作站发出“对时”请求数据报后,标准时间服务器便以广播方式发送一个标准时间,以同步局域网内所有工作站的基准时间。时间服务器工作站ResetNcb()AddName()SendBaseTime()DeleteName()ResetNcb()AddName()RecvBaseTime()DeleteName()请求基准时间 WaitTimeReques

26、t()发送基准时间 RequestSystemTime()void SendBaseTime(PNCB pncb,UCHAR Num, CHAR * pBuffer,WORD Length)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBDGSENDBC;pncb-ncb_num=Num;pncb-ncb_buffer=pBuffer;pncb-ncb_length=Length;Netbios(pncb);注:不需要指定接收方名字void RecvBaseTime(PNCB pncb,UCHAR Num, UCHAR * pBuffer) mems

27、et(pncb,0,sizeof(NCB); pncb-ncb_command=NCBDGRECVBC; pncb-ncb_num=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=512; pncb-ncb_cmd_cplt=0 xff; Netbios(pncb);补充:NCBASTAT命令测试网络中任一个目前正在工作的工作站的网络适配器状态。NCB输入: ncb_command = NCBASTAT ncb_callname: 工作站名字 ncb_lana_num: 指定要执行命令的LANA编号 ncb_buffer: 状态缓冲区指针 ncb_l

28、ength: 状态缓冲区长度NCB输出: ncb_cmd_cplt: 命令的最终返回码,成功为 NRC_GOODRET(0)UCHAR Astatus(UCHAR lana, PVOID pBuffer, int cbBuffer,char *szName)NCB ncb;ZeroMemory(&ncb,sizeof(NCB);ncb.ncb_command=NCBASTAT;ncb.ncb_lana_num=lana;ncb.ncb_buffer=(PUCHAR)pBuffer;ncb.ncb_length=cbBuffer;strcpy(char *)ncb.ncb_callname,sz

29、Name);Netbios(&ncb);return(ncb.ncb_cmd_cplt);2.4 会话通信程序设计 会话是一种面向连接的可靠通信方式。与数据报相比,会话通信可以保证数据的完整性、抵达顺序及传输的可靠性。一般分成三个阶段:建立连接数据传输断开连接基于NetBIOS的会话通信模型服务器客户机ResetNcb()AddName()Listen()HangUp()ResetNcb()AddName()Call()HangUp()建立会话连接Send/Recv()Recv/Send会话通信DeleteName()DeleteName()关闭会话NetBIOS的会话通信步骤 初始化。通信双

30、方分别执行NCBRESET命令,复位各自的NetBIOS。 添加名字。为了建立会话,通信双方应分别执行NCBADDNAME命令,在各自的本地名字表中添加唯一名。NetBIOS的会话通信步骤 建立会话。在进行会话通信之前,必须首先建立一个会话连接。该过程需由服务器和客户机协同完成,服务器方使用NCBLISTEN命令等待客户机的连接请求,客户方使用NCBCALL命令向服务器发起会话连接请求。一旦会话建立成功,在双方的NetBIOS接口上便会建立一个会话,并分别为会话双方赋予唯一的会话号,以后通信双方就可以利用该会话号进行会话通信。NetBIOS的会话通信步骤 数据传输。会话建立后,双方便可利用NC

31、BSEND和NCBRECV等会话命令进行会话通信。 拆除会话。当数据传输结束后,任何一方均可发出NCBHANGUP命令来拆除指定会话号上的会话连接,以及时释放系统资源。 删除名字。在会话通信进行结束后,双方还应删除各自本地名字表中的名字。会话通信命令 NetBIOS的会话通信命令共有9条,每条命令都有等待和非等待两种方式,通常情况下发送方采用等待方式,而接收方则采用非等待方式。(1)发起连接请求Call命令命令代码:NCBCALL,NCBCALL|ASYNCH命令功能:请求与某个远程工作站建立一个会话 NCB输入: ncb_command = NCBCALL 或 NCBCALL|ASYNCH

32、ncb_name: 本地名字 ncb_callname: 远程名字 ncb_rto: 接收时限(以0.5s为单位) ncb_sto: 发送时限(以0.5s为单位) ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令时为“空” NCB输出: ncb_lsn: 分配的本地会话号 ncb_cmd_cplt: 命令的最终返回码注意:1、要在两个名字之间真正建立会话,对方必须已经发出Listen命令才行。如果Call命令成功,NetBIOS即返回一个本地会话号LSN,供后面的会话通信命令引用。如果Call命令呼叫的对方没有发出Listen命令,那么Call命令会反复试几次,最后返回出错信

33、息。2、在会话过程中发送超时和接收超时的时限应在Call命令中指定,而不是在后面的发送/接收命令中指定的。ncb_sto(发送时限)和ncb_rto(接收时限)两个字段的值是以0.5s为单位的,若设为“0”表示没有超时机制,即可以无限期等待,这一点在使用时要非常小心。void NetbiosCall(PNCB pncb,char SourName,char DestName)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBCALL;strcpy(char *)pncb-ncb_name,SourName);strcpy(char *)pncb-ncb

34、_callname,DestName);pncb-ncb_rto=0;pncb-ncb_sto=10;Netbios(pncb);(2)侦听连接请求Listen命令命令代码:NCBLISTEN、 NCBLISTEN|ASYNCH命令功能:侦听远程工作站的会话呼叫(Call)请求,建立一个会话。 NCB输入: ncb_command = NCBLISTEN或 NCBLISTEN|ASYNCH ncb_name: 本地名字 ncb_callname: 呼叫方的名字,“*”表示可以响应任何站对 本站的呼叫 ncb_rto: 接收时限(以0.5s为单位) ncb_sto: 发送时限(以0.5s为单位)

35、 ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令时为“空” NCB输出: ncb_lsn: 分配的本地会话号 ncb_cmd_cplt: 命令的最终返回码注意:1、ncb_callname字段的第一个字节为 * 号,则可以响应任何站对本站的呼叫。如果Listen命令成功,NetBIOS就会返回一个本地会话号lsn,供后面的发送、接收、挂机命令引用。2、Call/Listen命令可以多次被使用,在同一对命令间建立多个会话。3、Listen命令是没有超时机制的,应避免使用Wait方式,否则有可能产生无限等待。4、在会话过程中发送超时和接收超时的时限应在Listen命令中指定。v

36、oid NetbiosListen(PNCB pncb,HANDLE hEvent,char SourName,char DestName)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBLISTEN|ASYNCH;strcpy(char *)pncb-ncb_name,SourName);strcpy(char *)pncb-ncb_callname,DestName);pncb-ncb_rto=0;pncb-ncb_sto=5;pncb-ncb_cmd_cplt=0 xff;pncb-ncb_event=hEvent;Netbios(pncb);

37、(3)数据发送Send命令命令代码:NCBSEND、 NCBSEND|ASYNCH命令功能:向指定的会话方发一个长度为165535字节的消息 NCB输入: ncb_command = NCBSEND或 NCBSEND|ASYNCH ncb_lsn: 本地会话号 ncb_buffer: 指定要发送数据的缓存地址 ncb_length: 要发送数据的字节数 ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令时为“空” NCB输出: ncb_cmd_cplt: 命令的最终返回码 注意:发送的时限是在Call或Listen中指定的,如果超时的时候对方还没有收到数据,则会话非正常终止,返

38、回超时出错信息。此外,不论何种原因造成Send不能完成,都会使会话终止,返回响应的出错信息。void SessionSend(PNCB pncb,UCHAR Num,UCHAR * pBuffer,WORD Length)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBSEND;pncb-ncb_lsn=Num;pncb-ncb_buffer=pBuffer;pncb-ncb_length=Length;Netbios(pncb);(4)数据接收Receive命令命令代码:NCBRECV、 NCBRECV|ASYNCH命令功能:接收由会话方发过来的数

39、据。 NCB输入: ncb_command = NCBSEND或 NCBSEND|ASYNCH ncb_lsn: 本地会话号 ncb_buffer: 接收缓存区指针 ncb_length: 接收缓冲区长度 ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令时为“空” NCB输出: ncb_length: 实际收到的字节数 ncb_cmd_cplt: 命令的最终返回码 注意:接收的时限是在Call或Listen中指定的,如果接收超时,不会引起会话终止。如果给Recevie命令规定的缓存长度小于要接收的数据长度,则会发生错误,这时可以再发一条Receive命令,接收剩余的数据(但必

40、须在超时之前完成)void SessionRecv(PNCB pncb,UCHAR Num,HANDLE hEvent,UCHAR * pBuffer)memset(pncb,0,sizeof(NCB);pncb-ncb_command=NCBRECV|ASYNCH;pncb-ncb_lsn=Num;pncb-ncb_buffer=pBuffer;pncb-ncb_length=512;pncb-ncb_cmd_cplt=0 xff;pncb-ncb_event=hEvent;Netbios(pncb);(5)关闭会话Hang Up命令命令代码:NCBHANGUP、 NCBHANGUP|ASYNCH命令功能:在会话结束时,双方都要发这条命令,表示关闭会话。 NCB输入: ncb_command = NCBHANGUP或 NCBHANGUP|ASYNCH ncb_lsn: 本地会话号 ncb_event: 指定异步命令完成后需触发的事件句柄,同步命令时为“空” NCB输出: ncb_cmd_cplt: 命令的最终返回码void HangupSession(PNCB pncb,UCHAR SessionNum)memset(pncb,0,sizeof(NCB);pncb-ncb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论