亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

VC網(wǎng)絡(luò)通信API概覽

系統(tǒng) 2009 0

1 WinSock API

Windows Sockets 是在 Windows 環(huán)境下使用的一套網(wǎng)絡(luò)編程規(guī)范,常常簡稱為 Winsock

WinSock 主要是基于 socket 來開發(fā)基于 TCP/IP 模型中各層的服務(wù)器端與客戶端程序。可使用 RAW SOCKET API (原始套接字)開發(fā)低層協(xié)議的程序,當(dāng)然這需要了解協(xié)議的報文格式。

1.1 Windows Sockets API

參考《 WinSock 編程基礎(chǔ) 》中的 Windows Sockets 規(guī)范。

1.2 Winsock API 函數(shù)的分類

Winsock 規(guī)范中把 Winsock API 函數(shù)集分為與 BSD Socket( 用在 Unix ) 相兼容的基本函數(shù)、網(wǎng)絡(luò)數(shù)據(jù)信息檢索函數(shù)和 Windows 專用擴展函數(shù)三類。

參考《 WinSock 編程基礎(chǔ) 》中的套接字 API 概覽。

2 CAsyncSocket/CSocket

2.1 MFC Winsock API 的封裝( Windows Sockets: Using Class CAsyncSocket

CAsyncSocket 對象表示一個 Windows Socket-- 一個網(wǎng)絡(luò)通信的端點。 CAsyncSocket 類封裝了 Windows 套接字 API ,對想使用與 MFC 連接的 Windows 套接字的程序員提供了一個面向?qū)ο蟮某橄蠡拍睢K腔诎荡翱诘? WSAAsyncSelcet 異步 I/O 模型。所謂 暗窗口 是指委托處理網(wǎng)絡(luò)事件消息的窗口,即 "Socket Notification Sink" 。由于暗窗口只是用來在后臺做消息處理,故其風(fēng)格、尺寸都為零,隱而不顯。

應(yīng)用此類,需處理塊、字節(jié)順序(大小端)以及 Unicode 和多字符集( MBCS )的問題。如果想要一個更方便的處理這些問題的接口,參閱 CSocket 類。

CAsyncsocket 對象相比, CSocket 對象代表了 Windows Sockets API 的更高一級的抽象化。 CSocket 與類 CSocketFile CArchive 一起來管理對數(shù)據(jù)的發(fā)送和接收。

CAsyncSocket & CSocket

2.2 CAsyncsocket

聲明一個 CAsyncSocket 對象后,需調(diào)用 Create 成員函數(shù)進行具體套接字的創(chuàng)建: CAsyncSocket :: Create à CAsyncSocket :: Socket à CAsyncSocket :: AttachHandle / CAsyncSocket :: AsyncSelect

CAsyncSocket :: AttachHandle 完成 MFC 對象 CAsyncSocket SOCKET 內(nèi)核對象(句柄)的附加委托。

使用 CAsyncSocket 的線程在創(chuàng)建第一個對象時, _AFX_SOCK_THREAD_STATE :: m_pmapSocketHandle -> IsEmpty () == TRUE, 將創(chuàng)建一個暗窗口( CSocketWnd 對象)并記錄在線程套接字狀態(tài)管理模塊的 m_hSocketWindow 字段中( _AFX_SOCK_THREAD_STATE :: m_hSocketWindow )。

CAsyncSocket :: AsyncSelect 中,調(diào)用 WSAAsyncSelect ( m_hSocket , pState -> m_hSocketWindow , WM_SOCKET_NOTIFY , lEvent )

以后該線程的所有 CAsyncSocket 對象的網(wǎng)絡(luò)事件均以消息 WM_SOCKET_NOTIFY 發(fā)送給 _AFX_SOCK_THREAD_STATE :: m_hSocketWindow

暗窗口 CSocketWnd 接收 WM_SOCKET_NOTIFY 消息,消息處理函數(shù) OnSocketNotify 被調(diào)用 ON_MESSAGE ( WM_SOCKET_NOTIFY , OnSocketNotify )

WM_SOCKET_NOTIFY 消息的 wParam 參數(shù)為對應(yīng)發(fā)生該事件的套接字句柄, lParam 參數(shù)的高字位 ( 一般用 WSAGETSELECTERROR 宏取得 HIWORD) 包含出錯碼, lParam 參數(shù)的低字位 ( 一般用 WSAGETSELECTEVENT 宏取得 LOWORD) 則標(biāo)識了網(wǎng)絡(luò)事件代碼 (FD_XXX) 。一般先檢查高位,再檢查低位進行網(wǎng)絡(luò)事件的處理。

OnSocketNotify 函數(shù)回調(diào) CAsyncSocket :: DoCallBack DoCallBack 調(diào)用事件處理函數(shù),如 OnRead OnWrite 等。 OnRead OnWrite CAsyncSocket 中為空,用戶一般需要重載虛函數(shù) OnRead OnWrite ,調(diào)用 Receive Send 進行接發(fā)處理。 Receive Send 只是對 recv send 的簡單調(diào)用,它們都是可重載的虛函數(shù)。

2.3 CSocket

CSocket 類是從 CAsyncsocket 派生的一個 同步阻塞 Socket 的封裝類, CSocket 類的諸如 Send() Receive() 在收到 WSAEWOULDBLOCK“ 錯誤 時,不是如 CAsyncSocket 那樣立即返回,而是 進入 PumpMessages() 消息循環(huán) PumpMessages() 直到有指定事件( uStopFlag == FD_* )發(fā)生才返回,在 2 秒( CSocket :: m_nTimeOut 期間,如果線程取到了任一窗口的 WM_PAINT 消息,則刷新相應(yīng)窗口。這樣異步的 CAsyncSocket ,到了派生類 CSocket ,就變成同步的了。

2.4 多線程環(huán)境下的 CAsyncSocket/CSocket

CAsyncSocket/CSocket 不是線程安全的,典型的在一個線程里調(diào)用了 CSocket 的成員函數(shù),之后啟動一個線程,在另一線程中對 CSocket 對象調(diào)用成員函數(shù)會失敗,提示 SOCKET 相關(guān)的窗口不存在。其原因在于消息循環(huán)是和窗口相關(guān)的,而窗口又是線程相關(guān)的。具體涉及到 SOCKET 狀態(tài) _AFX_SOCK_STATE SOCKET 線程模塊狀態(tài) _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE )。

CSocket 一般配合多線程使用,只要你想收發(fā)數(shù)據(jù),你就可以創(chuàng)建一個 CSocket 對象,并創(chuàng)建一個子線程來進行收發(fā)。同步 + 多線程 異步。但是大規(guī)模并發(fā)通信時,由于 Windows 消息泵本省的局限性, WAsyncSelect 異步模型可能遭遇瓶頸。

最后,別忘了使用 MFC WinSock CAsyncSocket/CSocket 的線程需要調(diào)用 AfxSocketInit 初始化 WinSock 庫。一般在 MFC 程序的 CWinApp :: InitInstance () 中調(diào)用 AfxSocketInit

源碼參考 <AFXSOCK.H> <AFXSOCK.INL> <SOCKCORE.CPP>

// AFXSOCK.H

#include <winsock.h>

#pragma comment(lib, "wsock32.lib")

/////////////////////////////////////////////////////////////////

// AFXSOCK - MFC support for Windows Sockets

// CSocketWnd -- internal use only Implementation for sockets notification callbacks.

class CSocketWnd : public CWnd

// Async Socket implementation and base class for Synchronous Socket

class CAsyncSocket : public CObject

// Synchronous Socket

class CSocket : public CAsyncSocket

// Used with CSocket and CArchive for streaming objects on sockets.

class CSocketFile : public CFile

3 WinInet API

WinInet API 主要是開發(fā)基于 TCP/IP 模型中的應(yīng)用層 客戶端 程序。

WinInet (「 Windows Internet 」) API 是一個高階函數(shù)集,幫助程序?qū)懽髡呤褂萌齻€常見的 Internet 協(xié)議:用于 World Wide Web 全球信息網(wǎng)的超文字傳輸協(xié)議( HTTP Hypertext Transfer Protocol )、文件傳輸協(xié)議( FTP File Transfer Protocol )和另一個稱為 Gopher 的文件傳輸協(xié)議。

WinInet API 由動態(tài)鏈接庫 wininet.dll 提供支持。

// Internet Extensions for Win32

#include <wininet.h>

#pragma comment (lib, "wininet.lib")

LoadLibrary ("C://WINDOWS//system32//wininet.dll");

WinInet 函數(shù)的語法與常用的 Windows 文件函數(shù)的語法類似,這使得使用這些協(xié)議就像使用本地磁盤驅(qū)動器上的文件一樣容易。

MFC WinInet API 的封裝( MFC Classes for Creating Internet Client Applications

MSDN 關(guān)鍵字 WinInet, programming/ WinInet, classes

MFC provides the following classes and global functions for writing Internet client applications . Indentation indicates a class is derived from the unindented class above it. CGopherFile and CHttpFile derive from CInternetFile , for example.

Classes:

CInternetSession

CInternetConnection

CFtpConnection

CGopherConnection

CHttpConnection

CInternetFile

CGopherFile

CHttpFile

CFileFind

CFtpFileFind

CGopherFileFind

CGopherLocator

CInternetException

Global functions:

AfxParseURL

AfxGetInternetHandleType

AfxThrowInternetException

源碼參考 <AFXINET.H> <AFXINET.INL> <INET.CPP>

// AFXINET.H

#include <wininet.h>

#pragma comment(lib, "wininet.lib")

// Global Functions

AfxParseURL ();

AfxParseURLEx ();

CHtmlView

class CHtmlView : public CFormView

CHtmlView 類在文檔 / 視圖結(jié)構(gòu)的應(yīng)用程序中提供 WebBrowser 控件的功能。 WebBrowser 控件是客戶可瀏覽網(wǎng)址以及本地文件和網(wǎng)絡(luò)文件的窗口。 WebBrowser 控件支持超級鏈接、統(tǒng)一資源定位符( URL )導(dǎo)航器并維護一張歷史列表,核心接口是 IWebBrowser2 ,它是 Internet Explorer 的核心。

源碼參考 <AFXHTML.H> <AFXHTML.INL> <VIEWHTML.CPP>

4.ISAPI

ISAPI Internet Server Application Program Interface 服務(wù)器 應(yīng)用程序接口)的簡寫,是微軟提供的一套面向 Internet 服務(wù)的 API 接口,它能實現(xiàn) CGI Common Gateway Interface ,公共網(wǎng)關(guān)接口)能提供的全部功能,并在此基礎(chǔ)上進行了擴展,如提供了過濾器應(yīng)用程序接口。 ISAPI 的工作原理和 CGI 大體上是相同的,都是通過交互式主頁取得用戶輸入信息,然后交服務(wù)器后臺處理。

ISAPI 應(yīng)用的 DLL 不僅可以象 CGI 程序一樣被用戶請求激活,還可以被系統(tǒng)預(yù)先激活來監(jiān)視用戶輸入;對于被用戶激活的 DLL ,在處理完一個用戶請求后不會馬上消失,而是繼續(xù)駐留在內(nèi)存中等待處理別的用戶輸入,直到過了一段時間后一直沒有用戶輸入。一個 ISAPI DLL ,可以在被用戶請求激活后長駐內(nèi)存,等待用戶的另一個請求,還可以在一個 DLL 里設(shè)置多個用戶請求處理函數(shù),此外, ISAPI DLL 應(yīng)用程序和 WWW 服務(wù)器處于同一個進程中,效率要顯著高于 CGI

每個使用 DLL 的請求都會賦給同一個處理器空間的線程, IIS 通常只是在初始化的時候為線程分好一個 線程池 后,在運轉(zhuǎn)周期里就一直使用這些線程。 線程池技術(shù) 減小了創(chuàng)建線程開銷。

ISAPI 出現(xiàn)在 CGI 之后,是一種優(yōu)于 CGI 的動態(tài)網(wǎng)頁開發(fā)技術(shù), ASP 是一個更好的 ISAPI ,而 ASP.NET 是更好的 ASP

ISAPI Classes

ISAPI describes an interface for Internet servers. An example of an ISAPI server is Windows NT Server running Microsoft Internet Information Server (IIS).

HTTP filters handle server requests. They can be used to handle the following types of applications:

1 Custom authentication schemes

2 Data compression

3 Encryption

4 Logging

Filter Classes

CHttpFilter

Filters selected HTTP requests sent to an ISAPI server.

CHttpFilterContext

Manages the context for an HTTP filter. This is a helper class to handle multiple, concurrent requests of a CHttpFilter object.

Server Classes

ISAPI server extensions process server requests. MFC ISAPI classes will not process requests from a Common Gateway Interface (CGI).

CHttpServer

Extends the functionality of an ISAPI server by processing client requests.

CHttpServerContext

Manages the context for an ISAPI server extension. This is a helper class to handle multiple, concurrent requests of a CHttpServer object.

Related Classes

CHtmlStream (流 IO 、動態(tài)內(nèi)存管理)

Handles caching HTML output. Functionally similar to CMemFile .

源碼參考: <AFXISAPI.H> <AFXISAPI.INL> <ISAPIMIX.CPP> <ISAPI.CPP>

// AFXISAPI.H

#include <VC98//Include// HTTPEXT.H >

#include <VC98//Include// HTTPFILT.H >

/////////////////////////////////////////////////////////////////

// AFXIASPI - MFC Internet Server API support

// CHtmlStream -- manages in-memory HTML

// Status codes for HTTP transactions

// Parse Map macros

參考:

MFC 深入淺出》李久進

第十四章《 SOCKET 類的設(shè)計和實現(xiàn)》

Visual C++ 6.0 網(wǎng)絡(luò)編程技術(shù)》 雷斌等

Visual C++ 6 From The Ground Up John Paul Mueller

第三部分《 Visual C++ Internet

ISAPI 實用技術(shù)指南》 K.Clements

《用 C++ 開發(fā) Web 商用程序》

幾種網(wǎng)絡(luò)編程方式的比較

網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)

IIS ISAPI 接口簡介

C 語言寫的 ISAPI 上傳文件

VC網(wǎng)絡(luò)通信API概覽


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色综合网亚洲精品久久 | 一区二区三区四区免费视频 | 精品国产精品久久一区免费式 | 四虎黄色网 | 色一情 | 99视频在线观看免费 | 久草视频精品在线 | 中文字幕国产视频 | 久久久久久在线 | 最近中文字幕无吗免费视频 | 青草91视频免费观看 | 国产精品香蕉在线观看首页 | 四虎影视成人永久在线播放 | 免费看国产精品久久久久 | 操日韩| 欧美xx毛片免费看 | 国产精品国产三级国产专区5o | 国产福利精品在线观看 | 国产成人高清一区二区私人 | 亚洲午夜在线观看 | 久操网在线 | www.伊人久久 | 亚洲一区二区三区国产精品 | 亚洲综合黄色 | 欧美大片a一级毛片视频 | 国产精品一区二区三区四区 | 激情伊人网 | 亚洲视频免费看 | 国产最新精品精品视频 | 色视频播放| 国产精品社区在线观看 | 精品久久久久久亚洲 | 国产日韩久久久久69影院 | 亚洲精品mm1313久久 | 精品一区二区三区18 | 免费观看欧美一级特黄 | 成人久久精品一区二区三区 | 久久精品av77777 | 国产资源精品一区二区免费 | 毛片18| 亚洲精品一区二区三区美女 |