C S ocket
CSocket 类 是 从 CAsyncsocket 派 生 而 来 的 , 它 继 承 了 CAsyncsocket 对 W indows Sockets API 的 封 装 。 与 CAsyncsocket 对 象 相 比 , CSocket 对 象 代 表 了 W indows Sockets API 的 更 高 一 级 的 抽 象 化 。 CSocket 与 类 CSocketFile 和 CArchive 一 起来 管 理 对 数 据 的 发 送 和 接 收 。
- 个 CSocket 对 象 也 支 持 阻 塞 , 这 对 于 CArchive 的 同 步 操 作
来 说 是 必 要 的 。 块
操 作 函 数 , 比 如 Receive , Send , ReceiveFrom , SendTo , 和 Accept ( 都 是 从CAsyncsocket 继 承 来 的 ) , 都 不 返 回 一 个 CSocket 对 象 中 的WSAEWOULDBLOCK 错 误 。 取 而 代 之 , 这 些 函 数 等 待 , 直 到 操 作 完 成 。 另 外 , 当 这 些 函 数 中 的 某 一 个 是 阻 塞 的 时 , 如 果 调 用 了 CancelBlockingCall, 则 原 来 的调 用 将 因 为 WSAEINTR 错 误 而 终 止 。
要 使 用 一 个 CSocket 对 象 , 调 用 构 造 函 数 , 然 后 调 用 Create 来 创 建 基 础 插槽句 柄 ( 插 槽 类 型 ) 。 Create 的 缺 省 参 数 创 建 一 个 插 槽 , 但 是 如 果 你 不 是 用 一 个CArchive 对 象 来 使 用 这 个 插 槽 , 则 你 可 以 指 定 一 个 参 数 来 创 建 一 个 数 据 包 插槽 来 代 替 , 或 者 是 结 合 一 个 指 定 的 端 口 来 创 建 一 个 服 务 器 插 槽 。 在 客 户 方 使 用Connect , 则 服 务 器 方 使 用 Accept 来 与 一 个 客 户 插 槽 连 接 。 然 后 再 创 建 一 个CSocketFile 对 象 , 并 在 CSocketFile 的 构 造 函 数 中 将 它 连 接 到 CSocket 对 象 上 。再 接 着 ,创 建 一 个 CArchive 对 象 用 来 发 送 数 据 ,一 个 用 来 接 收 数 据( 如 果 需 要 ),
然 后 在 CArchive 构 造 函 数 中 将 它 们 与 CSocketFile 对 象 连 接 。 当 通 讯 完 成 后 , 销 毁 CArchive , CSocketFile , CSocket 对 象 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的“ W indows 插 槽 2 概述”和“ W indows
插 槽 设 计 思 考 ” 。
#include <afxsock.h>
请 参 阅 CAsyncsocket, CSocketFile
CSocket 类 成 员
Construction
Csocket 构 造 一 个 CSocket 对 象
Create 创 建 一 个 插 槽
Attribute s IsBlocking 确 定 一 个 阻 塞 调 用 是 否 在 进 行 中
FromHandle 返 回 一 个 指 向 CSocket 对 象 的 指 针 , 给 出 一 个 插 槽
句 柄
Attach 将 一 个 插 槽 句 柄 与 一 个 CSocket 对 象 连 接
Operations
CancelBlockingCall 取 消 一 个 当 前 在 进 行 中 的 阻 塞 调 用
Overridable s OnMessagePending 当 等 待 完 成 一 个 阻 塞 调 用 时 调 用 此 函 数 来 处 理 悬
而 未 决 的 消 息
成 员 函 数
CSocket::Attach
BOOL Attach( SOCKET h socket );
返 回 值
如 果 函 数 成 功 则 返 回 非 零 值 。
参 数
h socket
包 含 一 个 插 槽 句 柄 。
说 明
此 成 员 函 数 用 来 将 一 个 h socket 句 柄 与 一 个 CSocket 对 象 连 接 。 这 个 插 槽 句 柄被 保 存 在 对 象 的 m_socket 数 据 成 员 中 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CAsyncsocket::Attach
CSocket::CancelBlockingCall
void CancelBlockingCall( );
说 明
此 成 员 函 数 用 来 取 消 一 个 当 前 在 进 行 中 的 阻 塞 调 用 。 这 个 函 数 取 消 该 插 槽 的 任何 未 完 的 阻 塞 操 作 。 原 来 的 阻 塞 调 用 一 有 可 能 就 终 止 , 并 给 出 WSAEINTR 错误 。
在 一 次 阻 塞 的 Connect 操 作 中 , W indows 插 槽 实 现 一 有 可 能 就 终 止 这 个 阻 塞 的调 用 , 但 是 这 对 于 释 放 socket 资 源 来 说 是 不 可 能 的 , 要 直 到 连 接 完 成 ( 然 后 被重 置 ) 或 时 间 到 时 , 资 源 才 被 释 放 。 只 有 在 应 用 程 序 立 即 尝 试 打 开 一 个 新 的 插槽 ( 如 果 没 有 插 槽 可 利 用 ) , 或 连 接 到 相 同 的 同 级 者 时 , 这 一 点 才 是 需 要 注 意的 。
除 了 Accept , 取 消 任 何 操 作 都 会 使 该 插 槽 处 于 一 种 不 确 定 的 状 态 。 如 果 一 个 应用 程 序 取 消 了 在 一 个 插 槽 上 的 阻 塞 操 作 , 则 应 用 程 序 要 能 够 在 该 插 槽 上 显 示 , 唯 一 能 依 赖 的 操 作 就 是 调 用 Close t, 虽 然 其 它 的 操 作 可 能 会 对 某 些 W indows 插槽 起 作 用 。 如 果 你 希 望 你 的 应 用 程 序 具 有 最 大 的 可 移 植 性 , 则 你 必 须 小 心 不 要在 一 次 取 消 后 依 赖 于 执 行 某 些 操 作 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CAsyncsocket::Accept, CAsyncsocket::Close, CAsyncsocket::Connect, CSocket ::IsBlocking, :: WSASetBlockingHook
CSocket::Create
BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpsz Socket Address = NULL );
如 果 函 数 成 功 则 返 回 非 零 值 ; 否 则 返 回 0 , 并 通 过 调 用 GetLastError 可 以 获 得特 定 的 错 误 代 码 。
参 数
nSocketPort
一 个 要 被 此 插 槽 使 用 的 特 别 的 端 口 , 如 果 你 希 望 MFC 来 选 择 一 个 端 口 , 则 这 个 值 是 0 。
nSocketType
是 SOCK_STREAM 或 SOCK_DGRAM 。
lpsz Socket Address
一 个 指 向 字 符 串 的 指 针 , 该 字 符 串 包 含 了 被 连 接 插 槽 的 网 络 地 址 。 一 个带 点 的 数 字 , 如 “ 128.56.22.8 ” 。
在 构 造 一 个 插 槽 对 象 之 后 , 调 用 Create 成 员 函 数 来 创 建 W indows 插 槽 并 连 接它 。 然 后 Create 调 用 Bind 来 将 此 插 槽 与 指 定 的 地 址 结 合 。 下 面 就 是 所 支 持 的插 槽 类 型 :
-
SOCK_STREAM 提 供 连 续 的 , 可 靠 的 , 两 种 方 法 ( two-way )
的 , 基 于连 接 的 字 节 流 。 使用 Internet 地 址 家 族 的 传 输 控 制 协 议 ( TC P ) 。
-
SOCK_DGRAM 支 持 无 连 接 的 数 据 包 , 它 有 具 有 固 定 ( 通 常
较 小 ) 最 大长 度 的 不 可 靠 的 缓 冲 。 使 用 Internet 地 址 家 族 的 User Datagram Protocol
( UDP ) 。 要 使 用 这 个 选 项 , 你 必 须 不 用 一 个 CArchive 对 象 来 使 用 插 槽 。
注意 Accept 成 员 函 数 将 一 个 新 的 , 空 的 CSocket 对 象 的 引 用 作 为 它 的 参数 。 你 必 须 在 调 用 Accept 之 前 构 造 这 个 对 象 。 记 住 , 如 果 这 个 插 槽 对 象 超
出 了 范 围 , 则 连 接 关 闭 。 不 要 对 这 个 新 的 sock 对 象 调 用 Create 函 数 。
有 关 流 和 数 据 包 插 槽 的 更 多 信 息 ,参 见 W in32 SDK 文 档 中 的“ W indows S ockets
设 计 思 考 ” 。
请 参 阅 CAsyncsocket::Create, CAsyncsocket::Bind
CSocket::CSocket
CSocket( );
说 明
此 成 员 函 数 用 来 构 造 一 个 CSocket 对 象 。 在 构 造 之 后 , 你 必 须 调 用 Create 成员函 数 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CAsync S ocket::Create
CSocket::FromHandle
static CSocket* PASCAL FromHandle( SOCKET hS ocket );
返 回 值
返 回 一 个 指 向 CSocket 对 象 的 指 针 。 如 果 没 有 与 hS ocket 连 接 的 CSocket 对 象 , 则 返 回 NULL 。
参 数
hS ocket
包 含 一 个 插 槽 句 柄 。
此 成 员 函 数 返 回 一 个 指 向 CSocket 对 象 的 指 针 。 当 给 予 一 个 插 槽 句 柄 , 如 果 没有 一 个 CSocket 对 象 连 接 到 这 个 句 柄 , 则 此 成 员 函 数 返 回 NULL , 并 且 不 会 创建 一 个 临 时 对 象 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CAsyncsocket::FromHandle
CSocket::IsBlocking BOOL IsBlocking( ); 返 回 值
如 果 该 插 槽 是 阻 塞 的 , 则 返 回 非 零 值 。 否 则 返 回 0 。
此 成 员 函 数 用 来 确 定 一 个 阻 塞 的 调 用 是 否 正 在 进 行 中 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CSocket::CancelBlockingCall
CSocket::OnMessagePending virtual BOOL OnMessagePending( ); 返 回 值
如 果 消 息 被 处 理 了 则 返 回 非 零 值 ; 否 则 返 回 0 。
重 载 这 个 函 数 来 查 找 来 自 W indows 的 特 别 消 息 , 并 在 你 的 插 槽 中 对 它 们 作 出 响应 。 这 是 一 个 高 级 的 可 重 载 函 数 。
当 插 槽 在 转 发 W indows 消 息 时 , 框 架 调 用 OnMessagePending 来 给 你 一 个 机 会去 处 理 你 的 应 用 程 序 感 兴 趣 的 消 息 。
更 多 的 信 息 , 参 见 W in32 SDK 文 档 中 的 “ W indows Sockets 设 计 思 考 ” 。
请 参 阅 CSocket::CancelBlockingCall, CSocket::IsBlocking