在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也可以同時使用。
HttpSendRequest不支持異步模式,雖然API文檔說可以,但是在其它官方文章中已證實不可以;要用異步方式完成任務,需要通過使用線程來自己封裝。
HttpSendRequest使用的INTERNETHANLE要每次通過HttpOpenRequest獲取,不能重用,否則可能會出現無法讀取返回數據或數據重復等錯誤;雖然API文檔說只要每次把上次的數據取完就可以,但這是經歷了無數痛苦的unit test后換來的經驗。
發送httpSendRequest后,需要使用InternetReadFile來讀取,重復多次讀,直到返回數據為0byte為止。
錯誤代碼在http://support.microsoft.com/kb/193625,API文檔中找不到。
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.