WinInet, WinHttp, Winsock, ws2_32的區別和聯系

在Windows平臺進行網絡程序開發, 可以使用不同的庫, 但是最常用的還是微軟自己開發的庫。具體說來,有:

(1)Winsock,工作于網絡層和傳輸層的開發庫,對于編寫TCP,UDP,以及原始IP通信程序非常合適。函數原形也基本符合Unix socket標準。Windows平臺上的大多數程序,如QQ,訊雷等都基于其開發。

(2)ws2_32,是Winsock的升級版本,在兼容的基礎上增加了不符合Unix socket標準,但更適合Windows平臺的庫函數,一般以WSA*開頭。

現代的大多數Windows平臺程序也都開始依賴于此庫。

(3)WinInet,Windows Internet擴展庫,工作于應用協議層,提供了http,ftp,gopher協議的實現,為基于以上三種協議的程序開發提供基礎平臺,需要說明的是,盡管WinInet工作于應用層,但其本身wininet.dll的實現并不依賴于winsock.dll或ws2_32.dll,而是獨立存在的。至少目前的版本是這樣。基于WinInet的應用程序最著名的例子就是IE了。

(4)WinHttp,也是工作于應用協議層,提供了http協議的實現。看起來與WinInet有重復的部分,沒錯,WinHttp就是為了替換WinInet中的http部分的,它更加健壯穩定,而且還為http服務器端開發提供了庫函數。如果進行現代http的開發,建議使用WinHTTP而不是WinInet。使用WinHTTP進行開發的著名例子就是Google的瀏覽器Chrome,但是Chrome2.0以后版本google放棄了winhttp而是使用了自己開發的http庫,這也是為了使chrome實現跨平臺的重要舉措。另外,WinHttp.dll也不依賴于winsock或ws2_32,也是獨立運行的。

如果基于socket編程的話,Winows平臺與其它平臺函數基本相同,實現跨平臺比較容易。

如果基于http進行編程的話,不同平臺庫差別很大,如果不考慮跨平臺使用WinHttp,如果考慮跨平臺可以考慮使用libwww。

另外,wsock和wininet或winhttp也可以同時使用。

WinInet HttpSendRequest使用的事項

HttpSendRequest不支持異步模式,雖然API文檔說可以,但是在其它官方文章中已證實不可以;要用異步方式完成任務,需要通過使用線程來自己封裝。

HttpSendRequest使用的INTERNETHANLE要每次通過HttpOpenRequest獲取,不能重用,否則可能會出現無法讀取返回數據或數據重復等錯誤;雖然API文檔說只要每次把上次的數據取完就可以,但這是經歷了無數痛苦的unit test后換來的經驗。

發送httpSendRequest后,需要使用InternetReadFile來讀取,重復多次讀,直到返回數據為0byte為止。

錯誤代碼在http://support.microsoft.com/kb/193625,API文檔中找不到。

什么是WinHTTP?

WinHTTP的全稱是Microsoft Windows HTTP Services, 它提供給開發者一個HTTP客戶端應用程序接口(API), 通過這種API借助HTTP協議給其他的HTTP服務器發送請求.

WinHTTP支持桌面應用程序, Windows系統服務, 和Windows服務器端應用程序.

對于基于Microsoft .NET Framework的應用程序, 不推薦使用WinHTTP服務, 因為.NET Framework應用程序應該使用在System.Net命名空間下的網絡基礎設施類型.

WinHTTP提供了兩種編程方式, 一種是CC++的API, 另一種是COM組件.

WinHTTP與WinINet的區別

================

WinHTTP被設計為主要應用在服務器端應用程序的場景下, 讓服務器端應用程序訪問HTTP服務器.

WinINet是一種更老的技術, 它被設計為一個HTTP客戶端平臺, 用于交互式桌面應用程序, 比如說IE, Office等.

服務器端應用程序要求HTTP客戶端服務使用WinHTTP而不是WinINet.

WinHTTP和WinINet在微軟是由不同的團隊來提供支持的.

WinHTTP與Proxy

================

如果HTTP Proxy需要認證(authentication), 那么HTTP Application會收到407(proxy requires authentication). 除了這個狀態碼, 代理服務器還會發送一個或更多的authenticate headers: “Proxy-Authenticate”. 這些信息足夠我們在network monitor trace中鑒定HTTP無法訪問是否是由于proxy需要認證引起的了.

WinHTTP的proxy配置是存儲在注冊表鍵

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet SettingsConnectionsWinHttpSettings

當中的, 修改和查看需要使用一個命令行工具proxycfg.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • feisky云計算、虛擬化與Linux技術筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,908評論 0 5
  • 黃色的森林里分出兩條路 而我選擇了人跡罕至的一條 從此決定了我一生的道路 ——《未選擇的...
    修文002齊瑤閱讀 445評論 1 8
  • 春風浩蕩,春風當然浩蕩 在這三月里,除了春風 還有什么,值得一提 所謂的花紅柳綠,都不如 股票市場的紅更加養眼,和...
    阿鋇釘閱讀 238評論 1 6
  • 我有花田一畝,欲邀君來同住,你澆水,我松土,待到花香四溢時,我們舉杯暢飲,攜手共舞!
    Charlotte不煩惱閱讀 250評論 0 1
  • 2008-12-20 21:41 [一] 有狼在月中穿梭 夜于此時 滿是野性  [二]  以最圓的姿態迎接...
    高天潔雨18閱讀 262評論 0 0