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

下载本文档

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

文档简介

第2章基于NetBIOS的网络编程 网络基本输入 输出系统 NetBIOS 是一个传统的应用程序接口 API 用于数据源和目的地之间的数据交换 NetBIOS同时兼容于较老的操作系统 如OS 2和DOS等 NetBIOSLAN 提供网络以及其他特殊功能的目的 目前NetBIOS改进版 NetBEUI 与TCP IP以及IPX SPX合称为LAN通信三大协议 此外 几乎所有的LANNetBIOS协议基础上工作的 第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 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 NetBIOS接口函数 2 使用函数Netbios必须注意 程序的头文件中必须包含 nb30 h include 程序在链接时加入 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 NCBTRACE 2 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 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 初始化NetBIOS程序示例 改造main 函数 voidmain LANA ENUMlenum UCHARucRc inti PNCBpncb ucRc LanaEnum 运行结果 2 3 2加名字与删除名字 NetBIOS是基于名字通信的系统 通常情况下 都应该为应用进程加入若干名字 唯一名或组名 以适应不同通信进程的需要 在一个通信进程结束时 还应该删除不再使用的名字 以便释放相应的系统资源 加名字与删除名字函数 主要函数有 AddName 在本地名字表中添加一个唯一名字 并返回一个名字号AddGroupName 在本地名字表中添加一个组名 并返回一个名字号DeleteName 在本地名字表中删除一个唯一名或组名 AddName AddName AddGroupName DeleteName 与AddName 类似NCB输入 ncb command NCBADDNAMEncb name 要添加的16字节的名字字符串ncb lana num 指定要执行命令的LANA编号NCB输出 ncb num 返回新注册名字的编号ncb cmd cplt 命令的最终返回码 成功为NRC GOODRET 0 UCHARAddName CHAR Name UCHARLana UCHAR NameNum NCBncb memset UCHARAddGroupName CHAR Name UCHARLana UCHAR NameNum NCBncb memset UCHARDeleteName CHAR Name UCHARLana NCBncb memset 加名字与删除名字程序示例 加名字与删除名字程序示例 续 2 3数据报通信程序设计 数据报 Datagram 是一种 非面向连接 的通信方式 作为发送方 只需指定接收方的NetBIOS名字作为目标地址便可实现数据报发送 此时 NetBIOS不会执行任何检查 不能确保数据的完整性 抵达顺序或者传输的可靠性等等 数据报发送共有三种方式 将数据报发送到一个特定的唯一名 则只有注册了该名字的那个进程才有权接收将数据报发给一个组名 则只有注册了该组名的那些进程才有权接收将数据报广播到整个网络 局域网内任何一个工作站上的任何进程都有权接收这个数据报消息数据报的接收对应也有三种方式 前两种要用特定的本地名字来接收 若有指定发送方名字 则只接收这个名字发来的数据 反之则无论谁发来的数据都接收 对于第三种 不用指定任何本地名字号 基于NetBIOS的数据报通信的基本模型 客户机A 客户机B 2 3 1点对点数据报通信程序 点对点通信是数据报通信程序的一种简单应用 发送方使用NCBDGSEND命令发送数据报 接收方使用NCBDGRECV命令接收数据 通常情况下 数据报发送采用同步 等待 方式 而数据报接收则采用异步 非等待 方式 发送和接收的数据报最大长度为512字节 多余部分将会被丢弃 数据报发送函数DatagramSend NCB输入 ncb command NCBDGSENDncb num 本地名字号 发送方为自己注册的名字编号 ncb callname 接收方的NetBIOS名字ncb buffer 指向发送缓冲区的指针ncb length 发送缓冲区的长度 1 512字节 NCB输出 ncb cmd cplt 命令的最终返回码 成功为NRC GOODRET voidDatagramSend PNCBpncb UCHAR DestName UCHARNum UCHAR pBuffer WORDLength memset pncb 0 sizeof NCB pncb ncb 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 ASYNCHncb num 本地名字号 接收方为自己注册的名字编号 ncb callname 发送方的NetBIOS名字ncb buffer 指向接收缓冲区的指针ncb length 接收缓冲区的长度 1 512字节 ncb event 指定异步命令完成后需触发的事件句柄 同步命令为 空 NCB输出 ncb cmd cplt 命令的最终返回码 成功为NRC GOODRET voidDatagramRecv PNCBpncb UCHAR Name UCHARNum HANDLEhEvent UCHAR Buff memset pncb 0 sizeof NCB pncb ncb command NCBDGRECV ASYNCH strcpy char pncb ncb callname char Name pncb ncb num Num pncb ncb buffer Buff pncb ncb length 512 pncb ncb cmd cplt 0 xff pncb ncb event hEvent Netbios pncb 1 创建事件HANDLECreateEvent LPSECURITY ATTRIBUTESlpEvent 安全属性BOOLbManuaReset 是否人工重置BOOLbInitialState 初始是否有信号状态LPCTSTRlpName 名字 DWORDWaitForSingleObject HANDLEhHandle DWORDdwMilliseconds hHandle 同步对象句柄dwMilliseconds 以毫秒为单位的超时间隔 hEvent CreateEvent NULL FALSE FALSE NULL if hEvent NULL return DatagramRecv 简单数据报通信程序示例 发送方 abc 不断给接收方 xyz 发送数据 数据内容由用户指定 双方直到收到一条 exit 消息后停止通信 数据报发送程序 数据报接收程序 程序说明 1 发送方程序采用循环发送结构 接收方程序采用循环接收结构 当发送方从键盘上键入一个字符串后 发送程序将该字符串作为数据报直接发送给接收方 接收方在收到一个数据报后 将收到的字符串显示在屏幕上 如果发送方键入的是 exit 则通信双方结束通信 程序退出 2 接收方程序用到了两个WindowsAPI函数 创建事件函数CreateEvent 和等待事件函数WaitForSingleObject 利用这两个函数的目的是用来配合处理异步接收命令 2 3 2组播与广播通信程序 组播通信程序设计 组播通信与点对点通信程序的结构类似 所用的发送和接收命令也相同 只是发送方在指定接受方的名字时应设置为特定的远程组名 而多个接收方均应使用相同的组名来设置接收 这样 只要发送方发送一个特定的组播数据报 那些以特定组名等待接收的进程均能同时接收到这个组播数据报 课堂练习作业1 拟写程序实现组播通信 发送方接收工作组 ResetNcb AddName Send DeleteName ResetNcb AddGRName Recv DeleteName 发送数据报到工作组 作业一 P56页2 32 42 52 62 10 广播通信程序设计 广播通信与组播通信略有不同 主要差别在于 1 广播发送与接收应采用特定的广播命令 广播发送用NCBDGSENDBC命令 而广播接收用NCBDGRECVBC命令2 由于所有工作站均接收广播消息 因此发送方在发送广播数据报时无需指定ncb callname的值 利用广播通信实现时间同步程序示例 假设有一个标准时间服务器 当网内一个工作站发出 对时 请求数据报后 标准时间服务器便以广播方式发送一个标准时间 以同步局域网内所有工作站的基准时间 时间服务器 工作站 ResetNcb AddName SendBaseTime DeleteName ResetNcb AddName RecvBaseTime DeleteName 请求基准时间 WaitTimeRequest 发送基准时间 RequestSystemTime voidSendBaseTime PNCBpncb UCHARNum CHAR pBuffer WORDLength memset pncb 0 sizeof NCB pncb ncb command NCBDGSENDBC pncb ncb num Num pncb ncb buffer pBuffer pncb ncb length Length Netbios pncb 注 不需要指定接收方名字 voidRecvBaseTime PNCBpncb UCHARNum UCHAR pBuffer memset 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 NCBASTATncb callname 工作站名字ncb lana num 指定要执行命令的LANA编号ncb buffer 状态缓冲区指针ncb length 状态缓冲区长度NCB输出 ncb cmd cplt 命令的最终返回码 成功为NRC GOODRET 0 UCHARAstatus UCHARlana PVOIDpBuffer intcbBuffer char szName NCBncb ZeroMemory 2 4会话通信程序设计 会话是一种面向连接的可靠通信方式 与数据报相比 会话通信可以保证数据的完整性 抵达顺序及传输的可靠性 一般分成三个阶段 建立连接数据传输断开连接 基于NetBIOS的会话通信模型 NetBIOS的会话通信步骤 初始化 通信双方分别执行NCBRESET命令 复位各自的NetBIOS 添加名字 为了建立会话 通信双方应分别执行NCBADDNAME命令 在各自的本地名字表中添加唯一名 NetBIOS的会话通信步骤 建立会话 在进行会话通信之前 必须首先建立一个会话连接 该过程需由服务器和客户机协同完成 服务器方使用NCBLISTEN命令等待客户机的连接请求 客户方使用NCBCALL命令向服务器发起会话连接请求 一旦会话建立成功 在双方的NetBIOS接口上便会建立一个会话 并分别为会话双方赋予唯一的会话号 以后通信双方就可以利用该会话号进行会话通信 NetBIOS的会话通信步骤 数据传输 会话建立后 双方便可利用NCBSEND和NCBRECV等会话命令进行会话通信 拆除会话 当数据传输结束后 任何一方均可发出NCBHANGUP命令来拆除指定会话号上的会话连接 以及时释放系统资源 删除名字 在会话通信进行结束后 双方还应删除各自本地名字表中的名字 会话通信命令 NetBIOS的会话通信命令共有9条 每条命令都有等待和非等待两种方式 通常情况下发送方采用等待方式 而接收方则采用非等待方式 1 发起连接请求Call命令 命令代码 NCBCALL NCBCALL ASYNCH命令功能 请求与某个远程工作站建立一个会话 NCB输入 ncb command NCBCALL或NCBCALL ASYNCHncb 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命令会反复试几次 最后返回出错信息 2 在会话过程中发送超时和接收超时的时限应在Call命令中指定 而不是在后面的发送 接收命令中指定的 ncb sto 发送时限 和ncb rto 接收时限 两个字段的值是以0 5s为单位的 若设为 0 表示没有超时机制 即可以无限期等待 这一点在使用时要非常小心 voidNetbiosCall PNCBpncb charSourName charDestName memset pncb 0 sizeof NCB pncb ncb command NCBCALL strcpy char pncb ncb name SourName strcpy char pncb ncb callname DestName pncb ncb rto 0 pncb ncb sto 10 Netbios pncb 2 侦听连接请求Listen命令 命令代码 NCBLISTEN NCBLISTEN ASYNCH命令功能 侦听远程工作站的会话呼叫 Call 请求 建立一个会话 NCB输入 ncb command NCBLISTEN或NCBLISTEN ASYNCHncb name 本地名字ncb callname 呼叫方的名字 表示可以响应任何站对本站的呼叫ncb rto 接收时限 以0 5s为单位 ncb sto 发送时限 以0 5s为单位 ncb event 指定异步命令完成后需触发的事件句柄 同步命令时为 空 NCB输出 ncb lsn 分配的本地会话号ncb cmd cplt 命令的最终返回码 注意 1 ncb callname字段的第一个字节为 号 则可以响应任何站对本站的呼叫 如果Listen命令成功 NetBIOS就会返回一个本地会话号lsn 供后面的发送 接收 挂机命令引用 2 Call Listen命令可以多次被使用 在同一对命令间建立多个会话 3 Listen命令是没有超时机制的 应避免使用Wait方式 否则有可能产生无限等待 4 在会话过程中发送超时和接收超时的时限应在Listen命令中指定 voidNetbiosListen PNCBpncb HANDLEhEvent charSourName charDestName 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 3 数据发送Send命令 命令代码 NCBSEND NCBSEND ASYNCH命令功能 向指定的会话方发一个长度为1 65535字节的消息 NCB输入 ncb command NCBSEND或NCBSEND ASYNCHncb lsn 本地会话号ncb buffer 指定要发送数据的缓存地址ncb length 要发送数据的字节数ncb event 指定异步命令完成后需触发的事件句柄 同步命令时为 空 NCB输出 ncb cmd cplt 命令的最终返回码注意 发送的时限是在Call或Listen中指定的 如果超时的时候对方还没有收到数据 则会话非正常终止 返回超时出错信息 此外 不论何种原因造成Send不能完成 都会使会话终止 返回响应的出错信息 voidSessionSend PNCBpncb UCHARNum UCHAR pBuffer WORDLength 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命令功能 接收由会话方发过来的数据 NCB输入 ncb command NCBSEND或NCBSEND ASYNCHncb lsn 本地会话号ncb buffer 接收缓存区指针ncb length 接收缓冲区长度ncb event 指定异步命令完成后需触发的事件句柄 同步命令时为 空 NCB输出 ncb length 实际收到的字节数ncb cmd cplt 命令的最终返回码注意 接收的时限是在Call或Listen中指定的 如果接收超时 不会引起会话终止 如果给Recevie命令规定的缓存长度小于要接收的数据长度 则会发生错误 这时可以再发一条Receive命令 接收剩余的数据 但必须在超时之前完成 voidSessionRecv PNCBpncb UCHARNum HANDLEhEvent 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 关闭会话HangUp命令 命令代码 NCBHANGUP NCBHANGUP ASYNCH命令功能 在会话结束时 双方都要发这条命

温馨提示

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

评论

0/150

提交评论