分类: WINDOWS
2005-10-17 15:27:49
NETWORKING SERVICES -----DLC INTERFACE
作者:谢小荣
在NT和W2K中,DLC接口可以被基于WIN32位的应用程序访问(16位也可),32位适用CCB2接口,16位适用CCB1接口,但WIN95/98不支持CCB1或16位接口.
在DLC接口中最重要的是CCB(COMMAND CONTROL BLOCK),即命令控制块,它和NetBios接口的NCB块一样,都是传给设备驱动程序的一个数据结构,该协议中所用的网络地址,包括以太网地址都是用一个特殊的格式,此格式中的字节的每一位在网络中表现出相反的顺序,此顺序与IP包头部的IP地址顺序大体相同.该协议工作在链路层,可对网络适配器进行操作,并可直接发送和接收网络帧.在学习使用DLC 接口时,你必须首先具备对各种网络协议的了解,各种数据包头部的数据结构等等.
第一章:DLC协议命令
在命令控制块中的命令大多数都需要一个站点标志,它是指一个指示站点(DIRECT STATION),一个服务访问点(service access point),或是一个连接站点(LINK STATION).在WINDOWS平台,通过调用AcsLan()函数来发出一个DLC命令.该函数带有两个LLC_CCB结构,该结构的主体主要是一个要执行的命令,一个触发事件句柄,一个参数表的指针.在命令中主要分为三个群组:
一、Direct Interface Commands
此命令可使你对适配器执行控制功能,如打开或关闭一适配器,得到该适配器的错误状态,设置地址等。这些命令主要有以下几个:
LLC_DIR_CLOSE_ADAPTER | 在逻辑上关闭适配合器,并释放所占资源,结束未决命令 |
LLC_DIR_CLOSE_DIRECT | 释放所有指示站点的所有权 |
LLC_DIR_INITIALIZE | 初始化适配器,返回任何未决命令,释放缓冲 |
LLC_DIR_INTERRUPT | 不做任何事情 |
LLC_DIR_OPEN_ADAPTER | 为通信准备设备驱动程序,适配器在逻辑上是关闭的 |
LLC_DIR_OPEN_DIRECT | 给应用程序对指示站点的拥有权,并能用LLC_RECEIVE接收网络帧 |
LLC_DIR_READ_LOG | 读或重置日志 |
LLC_DIR_SET_EXCEPTION_FLAGS | 定义一例外标志 |
LLC_DIR_SET_FUNCTIONAL_ADDRESS | 设置或重置接收数据的函数地址 |
LLC_DIR_SET_GROUP_ADDRESS | 设置组播地址,对于没有多播地址的以太网此命令将失败 |
LLC_DIR_SET_MULTICAST_ADDRESS | 设置一个48位的多播地址,如果该以太网不支持,命令将失败 |
LLC_DIR_STATUS | 读状态信息 |
LLC_DIR_TIMER_CANCEL | 结束一个定时器 |
LLC_DIR_TIMER_CANCEL_GROUP | 结束一组定时器 |
LLC_DIR_TIMER_SET | 设定一定时器 |
二、DLC(IEEE802.3)接口命令
此接口命令提供对逻辑链路层的控制,提供无连接和导向连接服务。
LLC_DLC_CLOSE_SAP | 关闭SAP站点(直到所有连接站点关闭才关闭) |
LLC_DLC_CLOSE_STATION | 关闭连接站点 |
LLC_DLC_CONNECT_STATION | 在本地与远程站点建立或完成一个连接,本地与远程站点都必须发出一个命令来确立连接 |
LLC_DLC_FLOW_CONTROL | 在SAP中的连接站点中控制访问数据流 |
LLC_DLC_MODIFY | 在一个连接站点处于忙状态时必须立即发出此命令,当缓冲区有足够的空间接收帧时,设备驱动程序将清除忙状态标志 |
LLC_DLC_OPEN_SAP | 激活一个SAP,为SAP保存许多连接站点 |
LLC_DLC_OPEN_STATION | 分配资源给一个连接站点 |
LLC_DLC_REALLOCATE_STATIONS | 重新分配已分配给SAP的连接站点的数量,当减少连接站点数量时,命令返回没有分配的站点给适配器缓冲池,当增加联结站点数时,命令从适配器缓冲池分配一个新的站点. |
LLC_DLC_RESET | 重置SAP和相关联的站点,释放所占资源,终止所有未决命令 |
LLC_DLC_SET_THRESHOLD | 设置SAP或指示站点的缓冲池的限制,当缓冲数量不够时,应用程序将收到通知. |
LLC_DLC_STATISTICS | 读或重置日志 |
三、传输和接收命令
使 用此命令可在网络帧一级进行数据交换,如:协议驱动程序把应用程序缓冲区中的数据
移 到网卡的工作区中进行发送,并把网卡中的数据转移到应用程序的数据区中.
LLC_BUFFER_CREATE | 建立一新的DLC缓冲池并返回一句柄,应用程序在建立之前必须打开至少一个适配器 |
LLC_BUFFER_FREE | 返回一个或多个缓冲给适配器,此缓冲必须用LLC_BUFFER_GET得到 |
LLC_BUFFER_GET | 返回请求的缓冲,你可为指定的帧的大小得到几个大小相同的或最佳的一组缓冲 |
LLC_READ | 执行一读指令,当系统设置此结构成员uchDlcStatus和置uchDlcStatus为传信状态时,此命令完成,数据和可选头开始于偏移64处 |
LLC_READ_CANCEL | 结束一未决的LLC_READ命令 |
LLC_RECEIVE | 接收数据,如果应用程序没有建立一缓冲池,命令将失败 |
LLC_RECEIVE_CANCEL | 结束一未决的LLC_RECEIVE命令 |
LLC_RECEIVE_MODIFY | 接收数据并把数据的一些放入用户的数据缓冲中 |
LLC_TRANSMIT_DIR_FRAME | 传送数据到指示站点 |
LLC_TRANSMIT_FRAMES | |
LLC_TRANSMIT_I_FRAME | 传送信息数据给连接站点 |
LLC_TRANSMIT_TEST_CMD | 请求适配器传送一测试位置位的命令网络帧,该命令只用于SAP |
LLC_TRANSMIT_UI_FRAME | 传送一未编号的信息数据给SAP,该命令只用于SAP |
LLC_TRANSMIT_XID_CMD | 传送一测试位置位的XID命令, 该命令只用于SAP |
LLC_TRANSMIT_XID_RESP_FINAL | 传送一结束位置位的回应XID命令, 该命令只用于SAP, |
LLC_TRANSMIT_XID_RESP_NOT_FINAL | 传送一结束位未置位的回应XID命令, 该命令只用于SAP, |
以上为DLC调用的所有命令,每个命令均带有一个相应的参数表。
当一个同步命令完成时,可用以下几种方法或几种方法的结合:
设置LLC_CCB的ulCompletionFlag 为一个非0值,然后发出一个 LLC_READ命令读命令完成状态.