<winsock.h> 和 <winsock2.h> 之间有区别吗?

Posted

技术标签:

【中文标题】<winsock.h> 和 <winsock2.h> 之间有区别吗?【英文标题】:Is there a difference between <winsock.h> and <winsock2.h>? 【发布时间】:2012-02-05 23:02:39 【问题描述】:

我包含 mysql C 库所需的内容。

VS2010 中的自动完成功能也显示 - 知道这是什么吗?

它们是否可以互换,一种比另一种有什么优势?

谢谢!

【问题讨论】:

【参考方案1】:

@cost 的回答 links 对一个讨论,除其他外,提出了这个从未回答过的问题:

我不能在winsock2.h之前包含windows.h有什么原因吗? 它给了我很多错误,但是一旦我改变了他们的顺序,一切 没关系……这是为什么呢?

windows.h 在为较新的 Windows 版本编译时包含 winsock2.h,但对于较旧的开发,它包含 winsock.h。不过,问题不仅限于windows.h。任何时候在winsock2.h 之前包含winsock.h,都会出现编译器错误。原因是这两个文件DO NOT 很好地共存。 winsock2.h 旨在替换 winsock.h,而不是扩展它。在winsock.h 中定义的所有内容也在winsock2.h 中定义。如果winsock2.h 包含在winsock.h 之前,则winsock2.h 定义_WINSOCKAPI_ 以防止编译器处理后续的winsock.h 包含,一切都很好。但是如果winsock.h 包含在winsock2.h 之前,winsock2.h 不会检测到它并尝试重新定义winsock.h 已经定义的所有内容,从而导致编译失败。

在同一个项目中混合使用winsock.h 的代码和使用winsock2.h 的代码时必须非常小心。例如,在编写自己的使用winsock2.h 的套接字代码时,以及使用仍然使用winsock.h 的第三方库时。

【讨论】:

【参考方案2】:

除非您想使用 Winsock 1.1,否则您应该使用 winsock2.hwinsock2.h 用于 Winsock 2。

您可以在Wikipedia Winsock page 上阅读更多相关信息。

【讨论】:

【参考方案3】:

Winsock2 完全向后兼容原始的 Winsock,因此您想要使用原始 Winsock 的唯一原因是您的目标平台不支持 Winsock2(所有比 Windows 3.11 更新的版本都支持 winsock2 I相信)。

【讨论】:

以上是关于<winsock.h> 和 <winsock2.h> 之间有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

winsock编程IOCP模型实现代码

winsock 简单的通信

C ++ Winsock发送文件[关闭]

winsock 客户端和服务器通信

winsock 实现HTTP GET/POST

TCP数据流