日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC网络通信API概览

發(fā)布時間:2024/4/11 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC网络通信API概览 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.WinSock API

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

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

1.1 Windows Sockets API

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

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

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

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

2.CAsyncSocket/CSocket

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

CAsyncSocket對象表示一個Windows Socket--一個網(wǎng)絡通信的端點。CAsyncSocket類封裝了Windows套接字API,對想使用與MFC連接的Windows套接字的程序員提供了一個面向對象的抽象化概念。它是基于暗窗口的WSAAsyncSelcet異步I/O模型。所謂“暗窗口”是指委托處理網(wǎng)絡事件消息的窗口,即"Socket Notification Sink"。由于暗窗口只是用來在后臺做消息處理,故其風格、尺寸都為零,隱而不顯。

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

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

CAsyncSocket & CSocket

2.2 CAsyncsocket

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

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

使用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中,調用WSAAsyncSelect(m_hSocket,?pState->m_hSocketWindow,?WM_SOCKET_NOTIFY,?lEvent)。

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

暗窗口CSocketWnd接收WM_SOCKET_NOTIFY消息,消息處理函數(shù)OnSocketNotify被調用—ON_MESSAGE(WM_SOCKET_NOTIFY,?OnSocketNotify)。

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

OnSocketNotify函數(shù)回調CAsyncSocket::DoCallBackDoCallBack調用事件處理函數(shù),如OnRead、OnWrite等。OnRead、OnWrite在CAsyncSocket中為空,用戶一般需要重載虛函數(shù)OnRead、OnWrite,調用Receive、Send進行接發(fā)處理。Receive、Send只是對recv和send的簡單調用,它們都是可重載的虛函數(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消息,則刷新相應窗口。這樣異步的CAsyncSocket,到了派生類CSocket,就變成同步的了。

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

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

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

最后,別忘了使用MFC WinSock類CAsyncSocket/CSocket的線程需要調用AfxSocketInit初始化WinSock庫。一般在MFC程序的CWinApp::InitInstance()中調用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模型中的應用層客戶端程序。

WinInet(「Windows Internet」)API是一個高階函數(shù)集,幫助程序寫作者使用三個常見的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é)議就像使用本地磁盤驅動器上的文件一樣容易。

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

MSDN關鍵字: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類在文檔/視圖結構的應用程序中提供WebBrowser控件的功能。WebBrowser控件是客戶可瀏覽網(wǎng)址以及本地文件和網(wǎng)絡文件的窗口。WebBrowser控件支持超級鏈接、統(tǒng)一資源定位符(URL)導航器并維護一張歷史列表,核心接口是IWebBrowser2,它是Internet Explorer的核心。

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

?

4.ISAPI

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

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

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

ISAPI出現(xiàn)在CGI之后,是一種優(yōu)于CGI的動態(tài)網(wǎng)頁開發(fā)技術,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)內存管理)

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類的設計和實現(xiàn)》

《Visual C++ 6.0網(wǎng)絡編程技術》雷斌等

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

第三部分《Visual C++與Internet》

《ISAPI實用技術指南》K.Clements

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

?

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

網(wǎng)絡編程學習小結

IIS的ISAPI接口簡介》

C語言寫的ISAPI上傳文件》

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的VC网络通信API概览的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。