<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.h
。 winsock2.h
用于 Winsock 2。
您可以在Wikipedia Winsock page 上阅读更多相关信息。
【讨论】:
【参考方案3】:Winsock2 完全向后兼容原始的 Winsock,因此您想要使用原始 Winsock 的唯一原因是您的目标平台不支持 Winsock2(所有比 Windows 3.11 更新的版本都支持 winsock2 I相信)。
【讨论】:
以上是关于<winsock.h> 和 <winsock2.h> 之间有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章