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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,465评论 0 5
  • 黄色的森林里分出两条路 而我选择了人迹罕至的一条 从此决定了我一生的道路 ——《未选择的...
    修文002齐瑶阅读 3,362评论 1 8
  • 春风浩荡,春风当然浩荡 在这三月里,除了春风 还有什么,值得一提 所谓的花红柳绿,都不如 股票市场的红更加养眼,和...
    未然地平线阅读 1,684评论 1 6
  • 我有花田一亩,欲邀君来同住,你浇水,我松土,待到花香四溢时,我们举杯畅饮,携手共舞!
    Charlotte不烦恼阅读 1,715评论 0 1
  • 2008-12-20 21:41 [一] 有狼在月中穿梭 夜于此时 满是野性  [二]  以最圆的姿态迎接...
    高天洁雨18阅读 1,801评论 0 0

友情链接更多精彩内容