您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > CH3基于PACKETDRIVER的网络编程方法
设计、讲授:谭献海Email:xhtan@home.swjtu.edu.cn第3章基于PacketDriver的网络编程直接网卡编程优点:灵活,用户可根据自己的不同需求控制网络的工作。高效,速度快。缺点:编程困难,对编程人员的要求较高。通用性差,针对某一种网络适配器编写的程序只适用于相同或相似的网络适配器。直接网卡编程一般是在产品开发时使用,同时对了解网卡工作原理大有帮助。3.1概述为了屏蔽网络适配器的内部实现细节,使用户与网卡的通信更为方便,几乎所有的网卡生产厂家都随网卡提供相应的网卡驱动程序,其中包含了PacketDriver编程接口,由它来屏蔽网卡的具体工作细节,在上层应用软件和最低层的网卡驱动程序之间提供一个接口,如图1所示。上层应用程序PacketDriver网卡驱动程序NE2000网卡:NE2000.COM9008网卡:PKT9008.COM3COM网卡:3C501.COM3C5X9.COM…….ACTON网卡:NWPD.COMDLINK网卡:DLKDRV.COM(100M)等…….图1PacketDriver的工作原理硬/软中断3.1概述使用PacketDriver不用针对网卡硬件编程,使用较为方便。且PacketDriver做为一个网络编程标准,能用于所有的网卡。另外,PacketDriver与PC机的FTP包驱动程序----PC/TCP包驱动程序规范兼容,开放性较好。PacketDriver不但能直接在MS-DOS,WINDOWS等操作系统上使用,稍加修改(主要是将其中的显示系统调用(int21(09H)等)屏蔽掉)后也能在BIOS上使用。FTP包驱动程序----PC/TCP包驱动程序规范中断:60h用途:对各种网络硬件提供简便的访问。适用:所有机型。细节:中断处理例程一般以3个字节的跳转指令开始,后面紧跟着ASCII字符串“PKTDRVR”。因此,要找到由网络驱动程序使用的中断,用户可以从中断矢量60h扫描到80h,直到找到有字符串“PKTDRVR”的中断为止。3.2网络接口的标识对PacketDriver来说,网络接口由一个三元整数集合Class,Type,Number来标识,各变量的类型为:unsignedcharClass,NumberunsignedintType其中class表示的是网络接口的种类号,标识使用的是那一种网络,PacketDriver所支持的网络类型如下:(注:与ARP协议的硬件地址类型不一样)网络类型Class值Ethernet/IEEE802.31ProNet-102IEEE802.5/ProNet-43Omninet4AppleTalk5SerialLine6StarLan7Arcnet8AX.259KISSAIEEE803.2with802.2HeadersB使用802.2报头的FDDICInternetX.25DN.T.LANSTAR(封装DIXEthernet)E3.2网络接口的标识最后一个参数是网络接口的编号Number,用来指定网络适配器的编号。如果一台机器配置了多个同种类(Class)、同类型(Type)的网络适配器(例如,一个NOVELL网桥可安装4块网卡,用以连接4个局域网),那么就必须对其进行编号(Number)以示区别。一般地,网络种类(Class,一个8比特的无符号整数)和类型(Type,一个16比特的无符号整数)的取值由FTPSoftware公司统一管理,并且规定,0xFFFF标识一个通用的类型(TYPE),它可以和特定种类(CLASS)的任何网络接口相匹配。另外,因为0总是对应特定种类(CLASS)和类型(TYPE)的第一个接口,所以不必对其进行编号。3.3功能调用说明1)网络接口的初始化网络适配器在开始使用之前必须首先进行初始化。初始化包括三个方面的内容:初始化网络适配器,嵌入接收中断处理程序,获取通信句柄。读取网络适配器的物理地址。设置接收帧的类型。①初始化网络适配器,嵌入接收中断服务程序功能号:AH=2用途:对网卡进行初始化。适用:所有机型。入口参数:AH=2----功能号AL=if_class/*网络种类号*/BX=if_type/*网络类型号*/DL=if_number/*网络接口号*/CX=unsignedtypelen/*名字的长度,小于等于8个字节,可赋为0*/DS:SI=charfar*name/*名字的指针,可为空NULL*/ES:DI=int(far*receiver)()/*接收中断服务程序入口*/出口参数:正确返回:carryflag清零AX=句柄号错误返回:carryflag置位DH=错误代码说明:A)参数说明变量name(DS:SI)是一个指向网络接口名字的缓冲区指针;变量typelen存放名字的长度长度;变量receiver指向一个接收中断服务程序入口地址,通过上述功能调用,接收中断服务程序嵌入到PacketDriver中,当一个数据包到达后,网络适配器发出硬件中断,进入接收中断服务程序处理数据包。接收中断分两步进行。第一次中断:AX=0,通知应用程序申请缓冲区。进入中断之前,PacketDriver为用户指定:BX----inthandleAX----intflag(=0,表示是第一次中断)CX----unsignedintlen/*接收到的数据长度*/进入中断服务程序后,用户应根据CX中的数据长度值,申请接收缓冲区来存放接收到的数据包,用ES:DI指向申请到的缓冲区,缓冲区的长度存放到CX中,最后从中断中返回。如果高层应用进程没有缓冲区可用,将指针ES:DI的值设置为0:0,这时PacketDriver将丢弃该数据包,不再执行第二次中断调用。缓冲区申请到后,PacketDriver将接收到的数据移入用户的接收缓冲区,然后通过第二次中断来通知用户“数据已移入接收缓冲区”。第二次中断:AX=1,通知用户数据包已传送到缓冲区。一般地,在第二次中断服务程序中设置一个标志,通知上层应用进程“有接收好的数据包待处理”。接收到的数据包括帧头和数据域,但不包括同步序列和尾部的校验和。B)句柄说明句柄用于指明PacketDriver与用户之间的接口参数。实现方法:开辟一块内存缓冲区,将该缓冲区划分为若干小块,每块对应一个句柄。在NE2000等PacketDriver中,缓冲区长度为24*10个字节,即每个用户接口参数占24字节,共有10块。0189ABEF1617。。。。。。01typetype-len接收服务class02typetype-len接收服务class03程序入口程序入口入口地址长度1824441句柄C)错误代码的定义表2PacketDriver错误代码的值(通过DH寄存器返回)错误代码意义01h02h03h04h05h06h07h08h09h0Ah0Bh0Ch0Dh0Eh0Fh无效句柄号未找到指定种类的接口未找到指定类型的接口未找到指定编号的接口错误的包类型接口不支持多路播送报文该包驱动程序不能终止无效的接收模式空间不够类型可访问但决不释放错误命令包不能被发送硬件地址不能改变硬件地址长度或格式错误不能复位接口2)(2)获取网络适配器的物理地址功能号:AH=6用途:将指定句柄所代表的局域网网卡的物理地址复制到指定的缓冲区。适用:所有机型。入口参数:AH=6/*功能号*/BX=inthandle/*句柄*/CX=intlen/*缓冲区长度(以太网=6)*/ES:DI=charfar*buf/*地址缓冲区*/出口参数:正确返回:carryflag清零CX=实际的地址长度错误返回:carryflag置位DH=错误代码(3)设置接收模式功能号:AH=14h(十进制20)用途:为句柄所指定的网络适配器设置接收模式。在网卡上的数据链路控制器(如DP8390)中设置地址来选择接收方式,同时为多址通信设置屏蔽位,以避免不加区分地、任意地接收。适用:所有机型。入口参数:AH=20(十进制)/*功能号*/BX=inthandle/*句柄*/CX=接收模式代码出口参数:正确返回:carryflag清零错误返回:carryflag置位DH=错误代码表3接收模式的定义接收模式代码含义123456关闭接收只接收发送给本接口的数据包方式2以及广播包方式3以及有限的多址广播包方式4以及所有的多址广播包接收所有的包(包括错误包)2)获取驱动程序相关信息功能号:AH=1用途:返回句柄所代表的接口的信息。适用:所有机型。入口参数:AH=1/*功能号*/AL=0FFhBX=inthandle出口参数:正确返回:carryflag清零BX=版本号CH=种类(class)号DX=类型(type)号CL=接口编号(number)AL=基本/扩展PacketDriverAL=1基本PacketDriverAL=2扩展PacketDriverAL=5基本的和高性能的PacketDriverAL=6扩展的和高性能的PacketDriverAL=0FFh未安装PacketDriver错误返回:carryflag置位DH=错误代码3)关闭网络接口关闭网络接口的方法有两种。第一种关闭方法:功能号:AH=3用途:终止对数据包的访问存取,本调用正确返回后,句柄handle将不再有效。适用:所有机型。入口参数:AH=3/*功能号*/BX=inthandle出口参数:正确返回:carryflag清零错误返回:carryflag置位DH=错误代码第二种关闭方法:功能号:AH=5用途:终止与句柄有关的驱动程序的工作。如果可能,应将驱动程序退出内存。适用:所有机型。入口参数:AH=5/*功能号*/BX=inthandle出口参数:正确返回:carryflag清零错误返回:carryflag置位DH=错误代码4)数据的发送功能号:AH=4用途:将发送缓冲区中的数据发送出去。适用:所有机型。入口参数:AH=4/*功能号*/BX=inthandle/*句柄*/CX=unsigneddata-lengthDS:SI=charfar*data-buffer出口参数:正确返回:carryflag清零错误返回:carryflag置位DH=错误代码所发送的数据包括帧头和数据域,但不包括同步序列和尾部的校验和。5)网络性能参数的统计功能号:AH=18h(十进制24)用途:网络参数的统计,返回一个指向统计结构表的指针。适用:所有机型。入口参数:AH=24/*功能号*/BX=inthandle/*句柄*/出口参数:正确返回:carryflag清零DS:SI=统计结构表的首地址错误返回:carryflag置位DH=错误代码表3统计结构表定义的字段和字节长度字段字段长度PacketsinPacketsoutBytesinBytesoutError_pktsinErrors_pktsoutPacketsdropped44444446)其他功能调用功能号:AH=07用途:将网络适配器硬件复位成初始状态适用:所有机型。入口参数:AH=7(功能号)BX=inthandle(句柄)出口参数:正确返回:carryflag清零错误返回:carryflag置位DH=错误代码功能号:AH=0Ah用途:取网卡工作参数适用:所有机型。入口参数:AH=0Ah(功能号)BX=inthandle(句柄)出口参数:正确返回:carryflag清零ES:DI→参数表错误返回:carryflag置位DH=错误代码表4PacketDriver参数表的定义偏移量尺寸意义00h01h02h03h04h06h08h0Ah0Ch字节字节字节字节字字字字字主版本号次版本号本结构的字节长度MAC地址的长度最
本文标题:CH3基于PACKETDRIVER的网络编程方法
链接地址:https://www.777doc.com/doc-2905906 .html