對MFC 封 裝Windows 通 訊API 的 研 究

來源:互聯網
上載者:User
一、 引 言

---- 近 年 來, 利 用Internet 進 行 網 際 間 通 訊, 在WWW 瀏 覽、FTP、Gopher 這 些 常 規 服 務, 以 及 在 網 絡 電 話、 多 媒 體 會 議 等 這 些 對 實 時 性 要 求 嚴 格 的 應 用 中 成 為 研 究 的 熱 點, 而 且 已 經 是 必 需 的 了。Windows 環 境 下 進 行 通 訊 程 序 設 計 的 最 基 本 方 法 是 應 用Windows Sockets 實 現 進 程 間 的 通 訊, 為 此 微 軟 提 供 了 大 量 基 於Windows Sockets 的 通 訊API, 如WinSock API、WinInet API 和ISAPI, 並 一 直 致 力 於 開 發 更 快、 更 容 易 的 通 訊API, 將 其 和MFC 集 成 在 一 起 以 使 通 訊 編 程 越 來 越 容 易。

---- MFC 是VC 編 程 環 境 最 重 要 的 組 成 部 分, 它 為 用 戶 提 供 了 一 大 批 預 先 定 義 的 類 和 成 員 函 數, 封 裝 了 大 量 的Windows API。 同 時VC 環 境 提 供 了 與MFC 對 象 和 代 碼 一 起 工 作 的 專 用 工 具:AppStudio 源 程 序 編 輯 器、AppWizard 和Class Wizard。 應 用MFC, 可 以 使Windows 程 序 員 用 較 少 的 時 間 和 精 力 開 發 出 複 雜 的 通 訊 應 用 程 序。

---- 本 文 根 據 筆 者 自 己 在 開 發 實 時 網 絡 音 頻 工 具FreeTalk 過 程 中 的 一 些 經 驗, 介 紹Windows 環 境 下 的 常 用API 和 封 裝 它 們 的MFC 類, 重 點 介 紹 使 用MFC 的CAsyncsocket 和CSocket 類 編 寫 網 絡 通 訊 程 序 的 方 法, 這 兩 個 類 封 裝 了WinSock API, 並 使 他 們 更 容 易 使 用 和 更 適 應 於MFC 編 程 環 境。

二、Windows 環 境 下 的 通 訊API 和 相 應 的MFC 類

---- 1. Windows Sockets(WinSock)API

---- Windows Sockets 定 義 了Windows 的 網 絡 編 程 接 口, 它 基 於 加 利 福 尼 亞 大 學 伯 克 利 分 校 的 伯 克 利Unix Sockets。Windows Sockets 既 包 括BSD 風 格 的 例 程, 還 加 入 了Windows 的 擴 展 部 分, 例 如 用 於 消 息 驅 動 的 擴 展 函 數。Windows Sockets 可 以 運 行 在 許 多 網 絡 協 議 之 上, 包 括TCP/IP、XNS、DECNet、IPX/SPX 等。 在Win32 環 境 下,Windows Sockets 提 供 線 程 安 全。 通 過 微 軟 與 標 准 組 織 的 努 力, 為WinSock 定 義 了 應 用 程 序 設 計 接 口(WinSock API), 可 以 非 常 方 便 地 利 用 下 層 的 網 絡 協 議( 如TCP/IP) 進 行 網 絡 通 訊。

---- 通 過 提 供 兩 個 類CAsyncSocket 和CSocket,MFC 支 持 使 用WinSock API 通 訊 程 序 設 計。MFC 把 複 雜 的WinSock API 封 裝 到 類 裡, 這 使 得 編 寫 應 用 程 序 更 容 易。CAsyncSocket 類 逐 個 封 裝 了WinSock API, 為 高 級 網 絡 程 序 員 提 供 了 更 加 有 力 而 靈 活 的 方 法。 這 個 類 基 於 程 序 員 了 解 網 絡 通 訊 的 假 設, 目 的 是 為 了 在MFC 中 使 用WinSock, 程 序 員 有 責 任 處 理 諸 如 阻 塞、 字 節 順 序 和 在Unicode 與MBCS 間 轉 換 字 符 的 任 務。 為 了 給 程 序 員 提 供 更 方 便 的 接 口 以 自 動 處 理 這 些 任 務,MFC 給 出 了CSocket 類, 這 個 類 是 由CAsyncSocket 類 繼 承 下 來 的, 它 提 供 了 比CAsyncSocket 更 高 層 的WinSock API 接 口。Csocket 類 和CsocketFile 類 與Carchive 類 一 起 合 作 來 管 理 發 送 和 接 收 的 數 據, 這 使 管 理 數 據 收 發 更 加 便 利。CSocket 對 象 提 供 阻 塞 模 式, 這 對 於Carchive 的 同 步 操 作 是 至 關 重 要 的。 阻 塞 函 數[ 比 如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept()] 直 到 操 作 完 成 後 才 返 回 控 制 權, 因 此 如 果 需 要 低 層 控 制 和 高 效 率, 就 使 用CasyncSock 類; 如 果 需 要 方 便, 則 可 使 用Csocket 類。 2.Win32 Internet(WinInet)API

---- 微 軟 公 布 了 一 些 使Internet 應 用 程 序 的 設 計 比 以 前 更 快、 更 容 易 的API:WinInet API, 它 提 供 了 中 高 層 通 信 函 數, 這 使 訪 問 主 要 的Internet 協 議 變 得 相 當 容 易。 這 些 函 數 在 程 序 員 和WinSock 驅 動 之 間 提 供 了 隔 離 層。 有4 類WinInet API 函 數: 通 用WinInet 函 數、WinInet 文 件 傳 輸 協 議(FTP) 函 數、WinInet Gopher 函 數、WinInet 超 文 本 傳 輸 協 議(HTTP) 函 數。

---- 事 實 上,MFC 把WinInet API 和ActiveX 技 術 封 裝 進 類, 使Internet 編 程 更 加 容 易, 這 些 類 包 括CInternetSession、CInternetConnection、CInternetFile、CHttpConnection、CHttpFile、CGopherFile、CFtpConnection、CGopherConnection、CFileFind、CFtpFileFind、CGopherFileFind、CGopherLocator 和CInternetException。

---- 3.Internet 服 務 器API(ISAPI)

---- 微 軟 的IIS 是 惟 一 與Windows NT Server 操 作 系 統 緊 密 集 成 的WWW 服 務 器, 它 作 為Internet/Intranet 服 務 器 應 用 範 圍 很 廣。IIS 允 許 擴 展 功 能, 這 是 通 過ISAPI 來 實 現 的,ISAPI 描 述 了 與Internet 服 務 器 之 間 的 接 口。 用ISAPI 提 供 的 工 具, 可 建 立 高 性 能、 高 效 率、 滿 足 商 業 安 全 及 符 合 新 的IIS 標 准 的Internet 服 務 器。 同 樣,ISAPI 在MFC 中 由 典 型 的 類 所 封 裝, 包 括CHttpFilter、CHttpFilterContext、CHttpServer、CHttpServerContext、Related Classes 和CHtmlStream。

三、WinSock API 的MFC 封 裝 類

---- 一 些 網 絡 應 用 程 序( 如 網 絡 電 話、 多 媒 體 會 議 工 具) 實 時 性 要 求 非 常 強, 要 求 能 夠 直 接 應 用WinSock 發 送 和 接 收 數 據。 這 時 設 計 者 應 該 選 擇 直 接 應 用WinSock API 或 者 由MFC 封 裝 的WinSock API。 新 開 發 的 應 用 程 序 中, 為 了 充 分 利 用MFC 的 優 勢, 首 選 方 案 應 當 是MFC 中 的CAsyncSocket 類 和CSocket 類, 這 兩 個 類 完 全 封 裝 了WinSock API, 並 提 供 更 多 的 便 利。 本 文 介 紹 應 用 這 兩 個 類 的 編 程 模 型, 並 引 出 相 關 的 成 員 函 數 與 一 些 概 念 的 解 釋。

---- 1.CAsyncSocket 類 和CSocket 類 簡 述

附 圖 CAsyncSocket 類 和CSocket 類 的 繼 承 關 系

---- CAsyncSocket 類 和CSocket 類 的 繼 承 關 系 由 附 圖 給 出。CSocket 類 是 由CAsyncSocket 繼 承 而 來 的, 事 實 上, 在MFC 中CAsyncSocket 逐 個 封 裝 了WinSock API, 每 個CAsyncSocket 對 象 代 表 一 個Windows Socket, 使 用CAsyncSocket 類 要 求 程 序 員 對 網 絡 編 程 較 為 熟 悉。 相 比 起 來,CSocket 類 是CAsyncSocket 的 派 生 類, 繼 承 了 它 封 裝 的WinSock API。 一 個CSocket 對 象 代 表 了 一 個 比CAsyncSocket 對 象 更 高 層 次 的Windows Socket 抽 象,CSocket 類 與CSocketFile 類 和CArchive 類 一 起 工 作 來 發 送 和 接 收 數 據, 因 此 使 用 它 更 加 容 易。CSocket 對 象 提 供 阻 塞 模 式, 因 為 阻 塞 功 能 對 於CArchive 的 同 步 操 作 是 至 關 重 要 的。 在 這 裡 有 必 要 對 阻 塞 的 概 念 作 一 解 釋: 一 個socket 可 以 處 於“ 阻 塞 模 式” 或“ 非 阻 塞 模 式”, 當 一 個 套 接 字 處 於 阻 塞 模 式( 即 同 步 操 作) 時, 它 的 阻 塞 函 數 直 到 操 作 完 成 才 會 返 回 控 制 權, 之 所 以 稱 為 阻 塞 是 因 為 此 套 接 字 的 阻 塞 函 數 在 完 成 操 作 返 回 之 前 什 麼 也 不 能 做。 如 果 一 個socket 處 於 非 阻 塞 模 式( 即 異 步 操 作), 則 會 被 調 用 函 數 立 即 返 回。 在CAsyncSocket 類 中 可 以 用GetLastError 成 員 函 數 查 詢 最 後 的 錯 誤, 如 果 錯 誤 是WSAEWOULDBLOCK 則 說 明 有 阻 塞, 而CSocket 絕 不 會 返 回WSAEWOULDBLOCK, 因 為 它 自 己 管 理 阻 塞。 微 軟 建 議 盡 量 使 用 非 阻 塞 模 式, 通 過 網 絡 事 件 的 發 生 而 通 知 應 用 程 序 進 行 相 應 的 處 理。 但 在CSocket 類 中, 為 了 利 用CArchive 處 理 通 訊 中 的 許 多 問 題 和 簡 化 編 程, 它 的 一 些 成 員 函 數 總 是 具 有 阻 塞 性 質 的, 這 是 因 為CArchive 類 需 要 同 步 的 操 作。 在Win32 環 境 下, 如 果 要 使 用 具 有 阻 塞 性 質 的 套 接 字, 應 該 放 在 獨 立 的 工 人 線 程 中 處 理, 利 用 多 線 程 的 方 法 使 阻 塞 不 至 於 幹 擾 其 他 線 程, 也 不 會 把CPU 時 間 浪 費 在 阻 塞 上。 多 線 程 的 方 法 既 可 以 使 程 序 員 享 受CSocket 帶 來 的 簡 化 編 程 的 便 利, 也 不 會 影 響 用 戶 界 面 對 用 戶 的 反 應。

---- 2.CAsyncsocket 類 編 程 模 型

---- 在 一 個MFC 應 用 程 序 中, 要 想 輕 松 處 理 多 個 網 絡 協 議, 而 又 不 犧 牲 靈 活 性 時, 可 以 考 慮 使 用CAsyncSocket 類, 它 的 效 率 比CSocket 類 要 高。CAsyncSocket 類 針 對 字 節 流 型 套 接 字 的 編 程 模 型 簡 述 如 下:

---- (1) 構 造 一 個CAsyncSocket 對 象, 並 用 這 個 對 象 的Create 成 員 函 數 產 生 一 個Socket 句 柄。 可 以 按 如 下 兩 種 方 法 構 造:

CAsyncSocket sock;Sock.Create(); // 使 用 默 認 參 數 產 生 一 個 字 節 流 套 接 字 或CAsyncSocket*pSocket=new CAsyncSocket;int nPort=27;pSocket->Create(nPort, SOCK-DGRAM);// 指 定 端 口 號 產 生 一 個 數 據 報 套 接 字

---- 第 一 種 方 法 在 棧 上 產 生 一 個CAsyncSocket 對 象, 而 第 二 種 方 法 在 堆 上 產 生CAsyncSocket 對 象。 第 一 種Create 成 員 函 數 用 缺 省 參 數 產 生 一 個 字 節 流 套 接 字, 第 二 種Create 成 員 函 數 用 指 定 的 端 口 和 地 址 產 生 一 個 數 字 報 套 接 字。Create 的 參 數 有:

---- ① 端 口,UINT 類 型。 注 意: 如 果 是 服 務 方, 則 使 用 一 個 眾 所 周 知 的 端 口 供 服 務 方 連 接; 如 果 是 客 戶 方, 典 型 做 法 是 接 受 默 認 參 數, 使 套 接 字 可 以 自 主 選 擇 一 個 可 用 端 口;

---- ②socket 類 型。SOCK-STREAM( 默 認 值) 或SOCK-DGRAM;

---- ③socket 地 址。 例 如“ftp.gliet.edu.cn” 或“202.193.64.33”。

---- (2) 如 是 客 戶 方 程 序, 用CAsyncSocket ∷Connect 成 員 函 數 連 接 到 服 務 方; 如 是 服 務 方 程 序, 用CAsyncSocket ∷Listen 成 員 函 數 開 始 監 聽, 一 旦 收 到 連 接 請 求, 則 調 用CAsyncSocket ∷Accept 成 員 函 數 開 始 接 收。 注 意:CAsyncSocket ∷Accept 成 員 函 數 要 用 一 個 新 的 並 且 是 空 的CSocket 對 象 作 為 它 的 參 數, 這 裡 所 說 的“ 空 的” 指 的 是 這 個 新 對 象 還 沒 有 調 用Create 成 員 函 數。

---- (3) 調 用 其 他 的CAsyncSocket 類 成 員 函 數 進 行 通 訊 管 理。

---- (4) 通 訊 結 束 後, 銷 毀CAsyncSocket 對 象。 如 果 是 在 棧 上 產 生 的CAsyncSocket 對 象, 則 對 象 超 出 定 義 的 範 圍 時 自 動 被 析 構; 如 果 是 在 堆 上 產 生, 也 就 是 用 了new 這 個 操 作 符, 則 必 須 使 用delete 操 作 符 銷 毀CAsyncSocket 對 象。

---- 3.CSocket 類 編 程 模 型

---- 使 用CSocket 對 象 涉 及CArchive 和CSocketFile 類 對 象。 以 下 介 紹 的 針 對 字 節 流 型 套 接 字 的 操 作 步 驟 中, 只 有 第3 步 對 於 客 戶 方 和 服 務 方 操 作 是 不 同 的, 其 他 步 驟 都 相 同。

---- (1) 構 造 一 個CSocket 對 象。

---- (2) 使 用 這 個 對 象 的Create 成 員 函 數 產 生 一 個socket 句 柄。 在 客 戶 方 程 序 中, 除 非 需 要 數 據 報 套 接 字,Create 一 般 情 況 下 應 該 使 用 默 認 參 數。 而 對 於 服 務 方 程 序, 必 須 在 調 用Create 時 指 定 一 個 端 口。 注 意:CArchive 不 能 與 數 據 報(UDP) 套 接 字 一 起 工 作, 因 此 對 於 數 據 報 套 接 字,CAsyncSocket 和CSocket 的 使 用 方 法 是 一 樣 的。

---- (3) 如 果 是 客 戶 方 套 接 字, 則 調 用CAsyncSocket ∷Connect 與 服 務 方 套 接 字 連 接; 如 果 是 服 務 方 套 接 字, 則 調 用CAsyncSocket ∷Listen 開 始 監 聽 來 自 客 戶 方 的 連 接 請 求, 收 到 連 接 請 求 後, 調 用CAsyncSocket ∷Accept 接 受 請 求, 建 立 連 接。 注 意:Accept 成 員 函 數 需 要 一 個 新 的 並 且 為 空 的CSocket 對 象 作 為 它 的 參 數, 解 釋 同 上。

---- (4) 產 生 一 個CSocketFile 對 象, 並 把 它 與CSocket 對 象 關 聯 起 來。

---- (5) 為 接 收 和 發 送 數 據 各 產 生 一 個CArchive 對 象, 把 它 們 與CSocketFile 對 象 關 聯 起 來。 切 記CArchive 是 不 能 和 數 據 報 套 接 字 一 起 工 作 的。

---- (6) 使 用CArchive 對 象 在 客 戶 與 服 務 方 傳 送 數 據。 (7) 通 訊 完 畢 後, 銷 毀CArchive、CSocketFile 和CSocket 對 象。

---- ( 作 者 地 址: 桂 林 電 子 工 業 學 院97 研,541004; 收 稿 日 期:1999 年7 月)

-

-

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.