p; // 句 柄( 这 里 是 邮 槽)
LPVOID lpBuffer, // 接 收 数 据 的 缓 冲 区 指 针
DWORD nNumberOfBytesToRead, // 要 读 取 的 字 节 数
LPDWORD lpNumberOfBytesRead,
// 指 向 存 放 已 读 取 字 节 数 的 变 量 的 指 针
LPOVERLAPPED lpOverlapped
// 指 向 OVERLAPPD( 重 叠I/O) 结 构 的 指 针
);
---- 写 入 消 息 到 邮 槽 遵 循 一 般 文 件 的 建 立、 写 入 和 关 闭 三 个 步 骤:
建 立:HANDLE CreateFile(
LPCTSTR lpFileName,
// 文 件 名, 通 常 是 对 方 计 算 机 的 邮 槽 名,
如:// “\\B\\MailSlot\\WinPopup"
DWORD dwDesiredAccess,
// 存 取 模 式, 一 般 是:GENERIC_WRITE
DWORD dwShareMode,
// 共 享 模 式, 一 般 是:FILE_SHARE_READ
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// Windows 95/98 的 安 全 属 性 应 设 置 为 NULL
DWORD dwCreationDisposition,
// 如 何 建 立, 一 般 是:OPEN_EXISTING
DWORD dwFlagsAndAttributes,
// 文 件 属 性, 一 般 是:FILE_ATTRIBUTE_NORMAL
HANDLE hTemplateFile // 设 置 为 NULL 即 可
);
写 入:BOOL WriteFile(
HANDLE hFile, // 文 件 句 柄
LPCVOID lpBuffer, // 要 写 的 数 据 缓 冲 区 指 针
DWORD nNumberOfBytesToWrite, // 要 写 入 的 字 节 数
LPDWORD lpNumberOfBytesWritten,
// 指 向 存 放 已 写 入 字 节 数 的 变 量 的 指 针
LPOVERLAPPED lpOverlapped
// 指 向 OVERLAPPD( 重 叠I/O) 结 构 的 指 针
);
关 闭:BOOL CloseHandle(
HANDLE hObject // 文 件 句 柄
);
二、 消 息 数 据 包 格 式
----消 息 正 文 的 数 据 包 格 式 为:
{
UINT m_uMID; // 唯 一 表 示 本 消 息 的 ID
char m_cNeedAnswer; // 是 否 需 要 应 答
char m_cEntirNet; // 是 否 广 播 到“ 整 个 网 络"
LPCTSTR m_lpcsTo;
// 接 收 人 显 示 姓 名( 转 换“ 整 个 网 络" 为“ *")
LPCTSTR m_lpcsMessage; // 消 息 正 文
}
应 答 消 息 包 的 格 式 为:
{
UINT m_uMID; // 表 示 要 应 答 的 消 息 的 ID (UINT)
LPCTSTR m_lpcsTo; // 应 答 接 收 人(LPCTSTR)
}
---- 请 注 意 上 面 的 两 个 数 据 包 格 式 中 都 包 含 一 个 ID 值, 原 因 比 较 有 趣: 就 像 我 们 前 面 说 过 的 那 样, 邮 槽 是 工 作 在 会 话 层, 与 下 一 层( 传 输 层) 采 用 何 种 协 议 无 关。 但 是, 下 层 的 每 种 协 议 都 是 单 独 与 邮 槽 机 制 绑 定 在 一 起 的, 其 结 果 就 是 当 您 通 过 邮 槽 发 送 数 据 时, 对 方 计 算 机 不 只 收 到 一 条 消 息, 而 是 若 干 条 一 样 的 消 息, 数 量 是 两 台 计 算 机 安 装 的 通 信 协 议 数 量 的 最 小 值, 比 如 说 计 算 机 A 安 装 有 TCP/IP、IPX/SPX 和 NetBEUI 三 种 协 议, 计 算 机 B 安 装 有 TCP/IP 和 NetBEUI 两