转载 winsock、ws2_32、WinInet、WinHttp 对比
https://www.cnblogs.com/liuning8023/archive/2013/04/08/3008765.html
在 Windows 平台开发网络程序, 可以使用不同的库, 但是最常用的还是微软自己开发的库。具体说来:
Winsock
Winsock 是工作于网络层和传输层的库,对于编写 TCP,UDP,以及原始 IP 通信程序非常合适。函数原形也基本符合 Unix socket 标准。
Windows 平台上大多数程序,如 QQ,讯雷等都基于其开发。
ws2_32
ws2_32 是 Winsock 升级版,在兼容的基础上增加了不符合 Unix socket 标准,但更适合 Windows 平台的库函数,一般以 WSA* 开头。
现代的大多数 Windows 平台程序也都开始依赖于此库。
WinInet
WinInet 是 Windows Internet 扩展库,工作于应用协议层,提供了 http,ftp,gopher 协议的实现,为基于以上三种协议的程序开发提供基础平台。
需要说明的是,尽管 WinInet 工作于应用层,但其本身 wininet.dll 实现并不依赖于 winsock.dll 或 ws2_32.dll,而是独立存在的。至少目前的版本是这样。基于 WinInet 的应用程序最著名的例子就是IE了。
WinHttp
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 也可以同时使用。