socket编程实现client server程序_第1页
socket编程实现client server程序_第2页
socket编程实现client server程序_第3页
socket编程实现client server程序_第4页
socket编程实现client server程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

一 、 实 验 预 备 知 识 1、 客 户 机 /服 务 器 模 式 在 网 络 中 最 常 用 的 通 信 模 式 是 客 户 机 /服 务 器 模 式 (Client/Server 模 式 或 C/S 模 式 )。 服 务 器 方 要 先 启 动 , 并 监 听 指 定 端 口 , 等 待 客 户 端 的 请 求 , 根 据 客 户 端 的 请 求 提 供 相 应 服 务 。 2、 基 本 套 接 字 一 般 来 说 , 要 进 行 网 络 通 信 , 必 须 要 在 网 络 的 每 一 端 都 要 建 立 一 个 套 接 字 , 两 个 套 接 字 之 间 是 可 以 建 立 连 接 的 , 也 是 可 以 无 连 接 的 , 并 通 过 对 套 接 字 的 “读 ”、 “写 ” 操 作 实 现 网 络 通 信 功 能 。 类 似 于 文 件 的 打 开 、 读 、 写 、 关 闭 的 方 式 。 套 接 字 有 三 种 类 型 : 数 据 流 套 接 字 ( SOCK_STREAM) : 对 应 TCP 协 议 。 数 据 报 套 接 字 ( SOCK_DGRAM) : 对 应 UDP 协 议 。 原 始 套 接 字 ( SOCK_RAW) 。 通 过 使 用 原 始 套 接 字 , 可 以 将 网 卡 设 为 混 杂 模 式 。 并 且 可 以 捕 获 到 的 数 据 包 不 仅 仅 是 单 纯 的 数 据 信 息 , 而 是 包 含 有 IP 头 、 TCP 头 等 信 息 头 的 最 原 始 的 数 据 信 息 , 这 些 信 息 保 留 了 它 在 网 络 传 输 时 的 原 貌 , 通 过 对 这 些 在 低 层 传 输 的 原 始 信 息 的 分 析 可 以 得 到 更 多 网 络 的 信 息 。 一 个 完 整 的 网 间 通 信 需 要 一 个 五 元 组 来 标 识 : ( 协 议 , 本 地 地 址 , 本 地 端 口 号 , 远 地 地 址 , 远 地 端 口 号 ) 3、 基 本 套 接 字 系 统 调 用 为 了 更 好 地 说 明 套 接 字 编 程 原 理 , 下 面 给 出 几 个 基 本 套 接 字 系 统 调 用 说 明 。 a 创 建 套 接 字 socket() 应 用 程 序 在 使 用 套 接 字 前 , 首 先 必 须 拥 有 一 个 套 接 字 , 系 统 调 用 socket()向 应 用 程 序 提 供 创 建 套 接 字 的 手 段 , 其 调 用 格 式 如 下 : SOCKET PASCAL FAR socket(int af, int type, int protocol); 参 数 af: 指 定 通 信 发 生 的 区 域 , UNIX 系 统 支 持 的 地 址 族 有 : AF_UNIX、 AF_INET、 AF_NS 等 , 而 DOS、 WINDOWS 中 仅 支 持 AF_INET, 它 是 互 连 网 区 域 。 参 数 type: 描 述 要 建 立 的 套 接 字 的 类 型 。 参 数 protocol: 说 明 该 套 接 字 使 用 的 特 定 协 议 , 如 果 调 用 者 不 希 望 特 别 指 定 使 用 的 协 议 , 则 置 为 0, 使 用 默 认 的 协 议 。 根 据 这 三 个 参 数 建 立 一 个 套 接 字 , 并 将 相 应 的 资 源 分 配 给 它 , 同 时 返 回 一 个 整 型 套 接 字 号 。 socket()系 统 调 用 实 际 上 指 定 了 相 关 五 元 组 中 的 “协 议 ”这 一 元 。 b 指 定 本 地 地 址 bind() 将 本 地 主 机 地 址 和 本 地 端 口 与 所 创 建 的 套 接 字 号 联 系 起 来 , 其 调 用 格 式 如 下 : int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen); 参 数 s: 是 由 socket()调 用 返 回 的 套 接 字 描 述 符 (套 接 字 号 )。 参 数 name: 是 赋 给 套 接 字 s 的 本 地 地 址 , 其 长 度 可 变 , 结 构 随 通 信 域 的 不 同 而 不 同 , TCP/IP 协 议 使 用 的 地 址 结 构 如 下 : struct sockaddr_in short sin_family; /*AF_INET*/ u_short sin_port; /*16 位 端 口 号 , 网 络 字 节 顺 序 */ struct in_addr sin_addr; /*32 位 IP 地 址 , 网 络 字 节 顺 序 */ char sin_zero8; /*保 留 */ 网 络 字 节 顺 序 : 不 同 的 计 算 机 存 放 多 字 节 值 的 顺 序 不 同 , 有 的 机 器 在 起 始 地 址 先 存 放 低 位 字 节 , 有 的 先 存 高 位 字 节 。 为 保 证 数 据 的 正 确 性 , 在 网 络 协 议 中 须 指 定 网 络 字 节 顺 序 。 TCP/IP 协 议 使 用 16 位 整 数 和 32 位 整 数 的 高 价 先 存 格 式 , 它 们 均 含 在 协 议 头 文 件 中 。 参 数 namelen: 表 明 了 name 的 长 度 。 如 果 没 有 错 误 发 生 , bind()返 回 0。 否 则 返 回 值 SOCKET_ERROR。 c 建 立 套 接 字 连 接 connect()与 accept() connect()用 于 建 立 连 接 。 无 连 接 的 套 接 字 进 程 也 可 以 调 用 connect(), 这 样 就 不 必 每 次 都 指 定 目 的 地 址 。 而 accept()用 于 使 服 务 器 等 待 来 自 某 客 户 进 程 的 实 际 连 接 。 int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen); 参 数 s: 是 欲 建 立 连 接 的 本 地 套 接 字 描 述 符 。 参 数 name: 为 指 向 对 方 套 接 字 地 址 结 构 的 指 针 。 参 数 namelen: 对 方 套 接 字 地 址 结 构 长 度 。 如 果 没 有 错 误 发 生 , connect()返 回 0。 否 则 返 回 值 SOCKET_ERROR。 SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); 参 数 s: 为 本 地 套 接 字 描 述 符 , 在 用 做 accept()调 用 的 参 数 前 应 该 先 调 用 过 listen()。 addr : 指 向 客 户 方 套 接 字 地 址 结 构 的 指 针 , 用 来 接 收 连 接 实 体 的 地 址 。 Addrlen: 为 客 户 方 套 接 字 地 址 结 构 的 长 度 。 如 果 没 有 错 误 发 生 , accept()返 回 一 个 SOCKET 类 型 的 值 , 表 示 接 收 到 的 套 接 字 的 描 述 符 。 否 则 返 回 值 INVALID_SOCKET。 accept()用 于 面 向 连 接 服 务 器 。 参 数 addr 和 addrlen 存 放 客 户 方 的 地 址 信 息 。 调 用 前 , 参 数 addr 指 向 一 个 初 始 值 为 空 的 地 址 结 构 , 而 addrlen 的 初 始 值 为 0; 调 用 accept()后 , 服 务 器 等 待 从 编 号 为 s 的 套 接 字 上 接 受 客 户 连 接 请 求 , 而 连 接 请 求 是 由 客 户 方 的 connect()调 用 发 出 的 。 当 有 连 接 请 求 到 达 时 , accept()调 用 将 请 求 连 接 队 列 上 的 第 一 个 客 户 方 套 接 字 地 址 及 长 度 放 入 addr 和 addrlen, 并 创 建 一 个 与 s 有 相 同 特 性 的 新 套 接 字 号 。 新 的 套 接 字 可 用 于 处 理 服 务 器 并 发 请 求 。 四 个 套 接 字 系 统 调 用 , socket()、 bind()、 connect()、 accept(), 可 以 完 成 一 个 完 全 五 元 相 关 的 建 立 。 socket()指 定 五 元 组 中 的 协 议 元 。 bind()指 定 五 元 组 中 的 本 地 二 元 , 即 本 地 主 机 地 址 和 端 口 号 , 其 用 法 与 是 否 面 向 连 接 有 关 : 在 服 务 器 方 , 无 论 是 否 面 向 连 接 , 均 要 调 用 bind(); 在 客 户 方 , 若 采 用 面 向 连 接 , 则 可 以 不 调 用 bind(), 而 通 过 connect()自 动 完 成 。 若 采 用 无 连 接 , 客 户 方 必 须 使 用 bind()以 获 得 一 个 唯 一 的 地 址 。 d 监 听 连 接 listen() 此 调 用 用 于 面 向 连 接 服 务 器 , 表 明 它 愿 意 接 收 连 接 。 listen()需 在 accept()之 前 调 用 , 其 调 用 格 式 如 下 : int PASCAL FAR listen(SOCKET s, int backlog); 参 数 s: 标 识 一 个 本 地 已 建 立 、 尚 未 连 接 的 套 接 字 号 , 服 务 器 愿 意 从 它 上 面 接 收 请 求 。 Backlog: 表 示 请 求 连 接 队 列 的 最 大 长 度 , 用 于 限 制 排 队 请 求 的 个 数 , 目 前 允 许 的 最 大 值 为 5。 如 果 没 有 错 误 发 生 , listen()返 回 0。 否 则 它 返 回 SOCKET_ERROR。 e 数 据 传 输 send()与 recv() 当 一 个 连 接 建 立 以 后 , 就 可 以 传 输 数 据 了 。 常 用 的 系 统 调 用 有 send()和 recv()。 int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags); 参 数 s: 为 已 连 接 的 本 地 套 接 字 描 述 符 。 buf : 指 向 存 有 发 送 数 据 的 缓 冲 区 的 指 针 , 其 长 度 由 len 指 定 。 Flags: 指 定 传 输 控 制 方 式 , 如 是 否 发 送 带 外 数 据 等 。 如 果 没 有 错 误 发 生 , send()返 回 总 共 发 送 的 字 节 数 。 否 则 它 返 回 SOCKET_ERROR。 int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags); 参 数 s: 为 已 连 接 的 套 接 字 描 述 符 。 Buf: 指 向 接 收 输 入 数 据 缓 冲 区 的 指 针 , 其 长 度 由 len 指 定 。 Flags: 指 定 传 输 控 制 方 式 , 如 是 否 接 收 带 外 数 据 等 。 如 果 没 有 错 误 发 生 , recv()返 回 总 共 接 收 的 字 节 数 。 如 果 连 接 被 关 闭 , 返 回 0。 否 则 它 返 回 SOCKET_ERROR。 * Flags 参 数 可 以 是 0 或 者 是 以 下 的 组 合 : MSG_DONTROUTE: 不 查 找 路 由 表 。 是 send 函 数 使 用 的 标 志 , 这 个 标 志 告 诉 IP 协 议 , 目 的 主 机 在 本 地 网 络 上 面 , 没 有 必 要 查 找 路 由 表 。 MSG_OOB: 表 示 可 以 接 收 和 发 送 带 外 的 数 据 。 MSG_PEEK: 是 recv 函 数 的 使 用 标 志 , 表 示 只 是 从 系 统 缓 冲 区 中 读 取 内 容 , 而 不 清 除 系 统 缓 冲 区 的 内 容 。 这 样 下 次 读 的 时 候 , 仍 然 是 一 样 的 内 容 。 一 般 在 有 多 个 进 程 读 写 数 据 时 可 以 使 用 这 个 标 志 。 MSG_WAITAL: 是 recv 函 数 的 使 用 标 志 , 表 示 等 到 所 有 的 信 息 到 达 时 才 返 回 。 使 用 这 个 标 志 的 时 候 recv 会 一 直 阻 塞 , 直 到 指 定 的 条 件 满 足 , 或 者 是 发 生 了 错 误 。 1)当 读 到 了 指 定 的 字 节 时 , 函 数 正 常 返 回 , 返 回 值 等 于 len。 2)当 读 到 了 文 件 的 结 尾 时 , 函 数 正 常 返 回 , 返 回 值 小 于 len。 3)当 操 作 发 生 错 误 时 ,返 回 -1, 且 设 置 错 误 为 相 应 的 错 误 号 (errno)。 f 数 据 传 输 sendto()与 recvfrom() Sendto()用 于 在 无 连 接 套 接 字 上 发 送 消 息 。 Recvfrom( ) 可 以 记 录 发 送 者 的 地 址 , 该 地 址 与 sendto 所 指 定 的 地 址 结 构 完 全 相 同 。 int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to, int tolen) int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr * from, int *fromlen) sockfd: 表 示 套 接 字 描 述 符 。 buf: 发 送 或 接 收 的 缓 冲 区 。 len: 缓 冲 区 及 大 小 。 recvfrom 负 责 从 sockfd 接 收 数 据 , 如 果 from 不 是 NULL, 那 么 在 from 里 面 存 储 了 信 息 来 源 的 情 况 , 如 果 对 信 息 的 来 源 不 感 兴 趣 , 可 以 将 from 和 fromlen 设 置 为 NULL。 sendto 负 责 向 to 发 送 信 息 , 此 时 在 to 里 面 存 储 了 接 收 信 息 方 的 详 细 信 息 。 g 数 据 传 输 recvmsg()和 sendmsg() recvmsg 和 sendmsg 的 功 能 类 似 于 recvfrom 和 sendto, 只 不 过 将 一 些 信 息 放 入 了 一 个 结 构 中 。 int recvmsg(int sockfd,struct msghdr *msg,int flags) int sendmsg(int sockfd,struct msghdr *msg,int flags) struct msghdr void *msg_name; int msg_namelen; struct iovec *msg_iov; int msg_iovlen; void *msg_control; int msg_controllen; int msg_flags; struct iovec void *iov_base; /* 缓 冲 区 开 始 的 地 址 */ size_t iov_len; /* 缓 冲 区 的 长 度 */ msg_name 和 msg_namelen 当 套 接 字 是 非 面 向 连 接 时 (UDP),它 们 存 储 接 收 和 发 送 方 的 地 址 信 息 。 msg_name 实 际 上 是 一 个 指 向 struct sockaddr 的 指 针 , msg_name 是 结 构 的 长 度 。 当 套 接 字 是 面 向 连 接 时 , 这 两 个 值 应 设 为 NULL. msg_iov 和 msg_iovlen 指 出 接 受 和 发 送 的 缓 冲 区 内 容 。 msg_iov 是 一 个 结 构 指 针 , msg_iovlen 指 出 这 个 结 构 数 组 的 大 小 。 msg_control 和 msg_controllen 这 两 个 变 量 是 用 来 接 收 和 发 送 控 制 数 据 时 的 msg_flags 指 定 接 受 和 发 送 的 操 作 选 项 , 和 recv,send 的 选 项 一 样 。 h 关 闭 套 接 字 closesocket() 与 Shutdown() closesocket()关 闭 套 接 字 s, 并 释 放 分 配 给 该 套 接 字 的 资 源 ; 如 果 s 涉 及 一 个 打 开 的 TCP 连 接 , 则 该 连 接 被 释 放 。 closesocket()的 调 用 格 式 如 下 : BOOL PASCAL FAR closesocket(SOCKET s); 参 数 s: 待 关 闭 的 套 接 字 描 述 符 。 如 果 没 有 错 误 发 生 , closesocket()返 回 0。 否 则 返 回 值 SOCKET_ERROR。 int shutdown(int sockfd,int howto) TCP 连 接 是 双 向 的 (是 可 读 写 的 ), 当 我 们 使 用 close 时 , 会 把 读 写 通 道 都 关 闭 , 有 时 侯 我 们 希 望 只 关 闭 一 个 方 向 , 这 个 时 候 我 们 可 以 使 用 shutdown。 针 对 不 同 的 howto, 系 统 回 采 取 不 同 的 关 闭 方 式 . howto=0 这 个 时 候 系 统 会 关 闭 读 通 道 , 但 是 可 以 继 续 写 。 howto=1 关 闭 写 通 道 , 但 是 可 以 继 续 读 。 howto=2 关 闭 读 写 通 道 。 i 输 入 /输 出 多 路 复 用 select() select()调 用 用 来 检 测 一 个 或 多 个 套 接 字 的 状 态 。 对 每 一 个 套 接 字 来 说 , 这 个 调 用 可 以 请 求 读 、 写 或 错 误 状 态 方 面 的 信 息 。 请 求 给 定 状 态 的 套 接 字 集 合 由 一 个 fd_set 结 构 指 示 。 在 返 回 时 , 此 结 构 被 更 新 , 以 反 映 那 些 满 足 特 定 条 件 的 套 接 字 的 子 集 , 同 时 , select()调 用 返 回 满 足 条 件 的 套 接 字 的 数 目 , 其 调 用 格 式 如 下 : int PASCAL FAR select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout); 参 数 nfds: 指 明 被 检 查 的 套 接 字 描 述 符 的 值 域 , 此 变 量 一 般 被 忽 略 。 参 数 readfds: 指 向 要 做 读 检 测 的 套 接 字 描 述 符 集 合 的 指 针 , 调 用 者 希 望 从 中 读 取 数 据 。 参 数 writefds: 指 向 要 做 写 检 测 的 套 接 字 描 述 符 集 合 的 指 针 。 Exceptfds: 指 向 要 检 测 是 否 出 错 的 套 接 字 描 述 符 集 合 的 指 针 。 Timeout: 指 向 select()函 数 等 待 的 最 大 时 间 , 如 果 设 为 NULL 则 为 阻 塞 操 作 。 select()返 回 包 含 在 fd_set 结 构 中 已 准 备 好 的 套 接 字 描 述 符 的 总 数 目 , 或 者 是 发 生 错 误 则 返 回 SOCKET_ERROR。 4、 数 据 转 换 和 网 络 信 息 函 数 a、 字 节 顺 序 转 换 函 数 在 网 络 上 面 有 着 许 多 类 型 的 机 器 ,这 些 机 器 在 表 示 数 据 的 字 节 顺 序 是 不 同 的 , 比 如 i386 芯 片 是 低 字 节 在 内 存 地 址 的 低 端 ,高 字 节 在 高 端 ,而 alpha 芯 片 却 相 反 。 为 了 统 一 起 来 , 有 专 门 的 字 节 顺 序 转 换 函 数 。 unsigned long int htonl(unsigned long int hostlong) unsigned short int htons(unisgned short int hostshort) unsigned long int ntohl(unsigned long int netlong) unsigned short int ntohs(unsigned short int netshort) 在 这 四 个 转 换 函 数 中 , h 代 表 host, n 代 表 network。 s 代 表 short, l 代 表 long, 第 一 个 函 数 的 意 义 是 将 本 机 器 上 的 long 数 据 转 化 为 网 络 上 的 long, 其 它 几 个 函 数 的 意 义 类 似 。 b、 IP 和 域 名 的 转 换 在 网 络 上 标 志 一 台 机 器 可 以 用 IP 或 者 是 用 域 名 , 那 么 怎 么 进 行 转 换 呢 ? struct hostent *gethostbyname(const char *hostname) struct hostent *gethostbyaddr(const char *addr,int len,int type) 在 中 有 struct hostent 的 定 义 struct hostent char *h_name; /* 主 机 的 正 式 名 称 */ char *h_aliases; /* 主 机 的 别 名 */ int h_addrtype;/* 主 机 的 地 址 类 型 AF_INET*/ int h_length; /* 主 机 的 地 址 长 度 对 于 IP4 是 4 字 节 32 位 */ char *h_addr_list; /* 主 机 的 IP 地 址 列 表 */ #define h_addr h_addr_list0 /* 主 机 的 第 一 个 IP 地 址 */ gethostbyname 可 以 将 机 器 名 (如 )转 换 为 一 个 结 构 指 针 .在 这 个 结 构 里 面 储 存 了 域 名 的 信 息 gethostbyaddr 可 以 将 一 个 32 位 的 IP 地 址 (C0A80001)转 换 为 结 构 指 针 . 这 两 个 函 数 失 败 时 返 回 NULL 且 设 置 h_errno 错 误 变 量 ,调 用 h_strerror()可 以 得 到 详 细 的 出 错 信 息 c、 字 符 串 的 IP 和 32 位 的 IP 转 换 . 在 网 络 上 面 IP 地 址 都 用 点 分 十 进 制 数 字 表 示 (如 : ), 而 在 struct in_addr 结 构 中 用 的 是 32 位 的 IP, 为 了 转 换 我 们 可 以 使 用 下 面 两 个 函 数 : int inet_aton(const char *cp,struct in_addr *inp) char *inet_ntoa(struct in_addr in) 函 数 里 面 a 代 表 ascii, n 代 表 network。 第 一 个 函 数 表 示 将 a.b.c.d 的 IP 转 换 为 32 位 的 IP, ,存 储 在 inp 指 针 里 面 。 第 二 个 是 将 32 位 IP 转 换 为 a.b.c.d 的 格 式 。 d、 服 务 信 息 函 数 在 网 络 程 序 里 面 我 们 有 时 候 需 要 知 道 端 口 、 IP 和 服 务 信 息 , 这 个 时 候 可 以 使 用 以 下 几 个 函 数 int getsockname(int sockfd,struct sockaddr *localaddr,int *addrlen) int getpeername(int sockfd,struct sockaddr *peeraddr, int *addrlen) struct servent *getservbyname(const char *servname,const char *protoname) struct servent *getservbyport(int port,const char *protoname) struct servent char *s_name; /* 正 式 服 务 名 */ char *s_aliases; /* 别 名 列 表 */ int s_port; /* 端 口 号 */ char *s_proto; /* 使 用 的 协 议 */ 5、 典 型 调 用 时 序 图 a. 面 向 连 接 的 套 接 字 的 系 统 调 用 时 序 图 a. 无 连 接 协 议 的 套 接 字 调 用 时 序 图 6、 面 向 连 接 示 例 程 序 a VC+ Socket 编 程 简 单 的 Tcp/ip 服 务 器 #include #include #include #define NO_FLAGS_SET 0 #define PORT (u_short) 44965 #define MAXBUFLEN 256 INT main(VOID) WSADATA Data; SOCKADDR_IN serverSockAddr; SOCKADDR_IN clientSockAddr; SOCKET serverSocket; SOCKET clientSocket; int addrLen=sizeof(SOCKADDR_IN); int status; int numrcv; char bufferMAXBUFLEN; /* initialize the Windows Socket DLL */ status=WSAStartup(MAKEWORD(1, 1), /*初 始 化 Winsock DLL if (status != 0) cerr #include #include #define NO_FLAGS_SET 0 #define PORT (u_short) 44965 #define DEST_IP_ADDR “58“ /Server address INT main(VOID) WSADATA Data; SOCKADDR_IN destSockAddr; SOCKET destSocket; unsigned long destAddr; int status; int numsnt; char *toSendtxt=“Test String“; /* initialize the Windows Socket DLL */ status=WSAStartup(MAKEWORD(1, 1), if (status != 0) cerr “ERROR: WSAStartup unsuccessful“ endl; /* convert IP address into in_addr form */ destAddr=inet_addr(DEST_IP_ADDR); /* copy destAdd

温馨提示

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

评论

0/150

提交评论