CSocke tF ile
一 个 CSocketFile 对 象 是 一 个 用 来 通 过 W indows Sockets 在 网 络 中 发 送 和 接 收 数据 的 CFile 对 象 。 为 了 这 个 目 的 , 你 可 以 将 CSocketFile 对 象 与 一 个 CSocket 对象 连 接 。你也可以 – – – 并 且 通 常 是 这 样 做 – – – 将 CSocketFile 对 象 与 一 个 CA rchive 对 象 连 接 , 以 使 用 M FC 系 列 来 简 化 发 送 和 接 收 数 据 。
对 于 连 续( 发 送 )的 数 据 ,你 可 以 把 它 们 插 入 到 档 案 中 ,该 档 案 调 用 CSocketFile 成 员 函 数 来 把 数 据 写 到 CSocket 对 象 中 。 对 于 不 连 续 ( 接 收 ) 的 数 据 , 你 从 档案 中 提 取 它 们 。 这 导 致 该 档 案 调 用 CSocketFile 成 员 函 数 来 从 CSocke t 对 象 中 读取 数 据 。
提 示 除 了 象 这 儿 所 描 述 的 一 样 使 用 CSocketFile , 你 也 可 以 将 它 作 为一 个 标 准 文 件 对 象 , 就 象 你 使 用 它 的 基 类 CFile 一 样 。 你 可 以 将CSocketFile 与 其 它 任 何 基 于 档 案 的 MFC 系 列 函 数 一 起 使 用 。 因 为CSocketFile 并 不 支 持 CFile 的 所 有 性 能 , 某 些 缺 省 的 MFC 串 行 化 函 数与 CSocketFile 是 不 兼 容 的 。 这 一 点 对 于 CEditView 类 来 说 完 全 正 确 。你 不 要 尝 试 使 用 CEditView::SerializeRaw 并 通 过 一 个 与 CSocketFile 对 象 连 接 的 CArchive 对 象 来 串 行 化 CEditView 数 据 ; 而 应 当 使 用CEditView::Serialize 。 SerializeRaw 函 数 希 望 文 件 对 象 具 有 一 些
CSocketFile 所 不 拥 有 的 函 数 , 比 如 说 Seek 。
更 多 的 信 息 ,参 见 W in32 SDK 文 档 中 的“ W indows Sockets 2 概 述 ”和“ W indows Sockets 设 计 思 考 ” 。
#include <afxsock.h>
请 参 阅 CAsyncsocket, CSocket
CSocketFile 类 成 员
Construction
C socketFile 构 造 一 个 CSocketFile 对 象
成 员 函 数
CSocketFile:: CSocketFile
CSocketFile( CSocket* pSocke t, BOOL bArchiveCompatible = TRUE );
参 数
pSocket
连 接 到 CSocketFile 对 象 的 插 槽 。
bArchiveCompatible
指 示 该 文 件 对 象 是 否 与 一 个 CArchive 对 象 一 起 使 用 。 只 有 当 你 希 望 在 单机 方 式 下 来 使 用 这 个 CSocketFile 对 象 时 , 才 传 递 FALSE 。 这 种 方 式 就象 单 机 的 CFile 对 象 , 具 有 一 定 的 限 制 。 这 个 标 志 将 改 变 与 CSocketFile 对 象 连 接 的 CArchive 对 象 管 理 读 缓 冲 区 的 方 式 。
说 明
此 成 员 函 数 用 来 构 造 一 个 CSocketFile 对 象 。 当 此 对 象 超 出 范 围 或 被 删 除 时 , 它 的 析 构 函 数 将 使 它 自 己 从 插 槽 对 象 上 分 离 。
注 意 一 个 CSocketFile 对 象 也 可 以 在 没 有 CArchive 对 象 的 情 况 下 作 为一 个 ( 受 限 制 ) 的 文 件 来 使 用 。 缺 省 的 , CSocketFile 构 造 函 数 的bArchiveCompatible 参 数 是 TRUE 。 这 表 明 此 文 件 对 象 是 与 一 个 档 案 一 起使 用 的 。 要 在 没 有 档 案 的 情 况 下 使 用 这 个 文 件 对 象 , 给bArchiveCompatible 参 数 传 递 FALSE 。
在 “ 档 案 兼 容 ” 模 式 下 , 一 个 CSocketFile 对 象 可 以 提 供 更 好 的 表 现 , 并 减 少出 现 “ 死 锁 ” 的 危 险 。 当 两 个 发 送 和 接 收 插 槽 相 互 等 待 时 , 或 是 同 时 等 待 一 个公 用 的 资 源 时 , 就 会 发 生 死 锁 。 如 果 与 CSocketFile 对 象 一 起 工 作 的 CArchive
对 象 按 它 与 CFile 对 象 一 起 工 作 的 方 式 来 工 作 时 ,这 种 情 况 就 会 发 生 。在 与 CFile 一 起 工 作 时 , 档 案 可 以 假 定 如 果 它 接 收 到 的 字 节 少 于 它 所 请 求 的 , 则 文 件 已 经到 达 文 件 结 尾 了 。
但 是 , 在 使 用 CSocketFile 工 作 时 , 数 据 是 基 于 消 息 的 ; 缓 冲 区 可 以 保 存 多 条消 息 , 因 此 收 到 比 所 请 求 的 要 少 的 字 节 数 并 不 表 示 到 达 了 文 件 结 尾 。 在 这 种 情况 下 , 应 用 程 序 不 会 象 使 用 CFile 时 那 样 阻 塞 , 它 可 以 继 续 从 缓 冲 区 中 读 取 数据 , 直 到 缓 冲 区 为 空 。 在 这 种 情 况 下 , CArchive::IsBufferEmpty 用 于 监 视 档 案的 缓 冲 区 的 状 态 是 很 有 用 的 。
请 参 阅 CFile::CFile, CFile::Read