为什么在服务器和客户端与服务器通信要包含winsock2.h文件

为什么用winsock2.h会出现这个编译问题_百度知道博客访问: 2094922
博文数量: 402
博客积分: 10458
博客等级: 上将
技术积分: 4108
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
问题描述:在 VC 6.0中使用socket相关的函数时没有什么问题,可是到了.net下就有以下类似的错误,
[C++ Error] winsock2.h(109): E2238 Multiple declaration for 'fd_set'[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'[C++ Error] winsock2.h(112): E2146 Need an identifier to declare[C++ Warning] winsock2.h(144): W8017 Redefinition of 'FD_SET' is not identical[C++ Error] winsock2.h(153): E2238 Multiple declaration for 'timeval'[C++ Error] winsock.h(97): E2344 Earlier declaration of 'timeval'[C++ Error] winsock2.h(209): E2238 Multiple declaration for 'hostent'[C++ Error] winsock.h(153): E2344 Earlier declaration of 'hostent'[C++ Error] winsock2.h(222): E2238 Multiple declaration for 'netent'[C++ Error] winsock.h(166): E2344 Earlier declaration of 'netent'[C++ Error] winsock2.h(229): E2238 Multiple declaration for 'servent'[C++ Error] winsock.h(173): E2344 Earlier declaration of 'servent'[C++ Error] winsock2.h(241): E2238 Multiple declaration for 'protoent'[C++ Error] winsock.h(185): E2344 Earlier declaration of 'protoent'[C++ Error] winsock2.h(327): E2238 Multiple declaration for 'in_addr'[C++ Error] winsock.h(269): E2344 Earlier declaration of 'in_addr'[C++ Error] winsock2.h(385): E2238 Multiple declaration for 'sockaddr_in'[C++ Error] winsock.h(319): E2344 Earlier declaration of 'sockaddr_in'[C++ Error] winsock2.h(395): E2238 Multiple declaration for 'WSAData'[C++ Error] winsock.h(329): E2344 Earlier declaration of 'WSAData'[C++ Error] winsock2.h(411): E2146 Need an identifier to declare[C++ Warning] winsock2.h(455): W8017 Redefinition of 'SO_DONTLINGER' is not identical[C++ Warning] winsock2.h(512): W8017 Redefinition of 'AF_IPX' is not identical[C++ Warning] winsock2.h(540): W8017 Redefinition of 'AF_MAX' is not identical[C++ Error] winsock2.h(546): E2238 Multiple declaration for 'sockaddr'[C++ Error] winsock.h(492): E2344 Earlier declaration of 'sockaddr'[C++ Error] winsock2.h(586): E2238 Multiple declaration for 'sockproto'[C++ Error] winsock.h(501): E2344 Earlier declaration of 'sockproto'[C++ Error] winsock2.h(625): E2238 Multiple declaration for 'linger'[C++ Error] winsock2.h(625): E2228 Too many error or warning messages
Solution:
This problem arises because windows.h (at least, that version of it) includes not winsock2.h but winsock.h; sadly when Microsoft wrote winsock2.h they chose neither to change windows.h to include winsock2.h, which replaces winsock.h, nor to include windows.h from winsock2.h and then add the definitions for the new Winsock 2 API methods & structures (this might seem reasonable since Winsock 2 does, strictly speaking, replace Winsock 1, but since the API must be fully backwards-compatible the distinction is somewhat meaningless and there's no real benefit to making winsock2.h standalone).
The fix is thankfully simple: always "#include " before windows.h.
However, you must remember that if windows.h has been included by (for example) a higher-level header file that is subsequently including your header file, it's too late - so you must make sure that the higher-level header files respect this convention also.
It is however rarely necessary to modify the header files of libraries or other code modules you are using just because you include their header files, and their header files include windows.h - you can just include winsock2.h before you include the library's header files.
在包含jrtplib有时候我也遇到这个问题,解决方法与之相同。一句话,在#include之前 #include
问题就可以解决。
问题描述]&& 在包含了以及的工程中,编译有时会出现如下错误:&&&& error C2011: 'fd_set' : 'struct' type redefinition&&&& error C2011: 'timeval' : 'struct' type redefinition&&&&&&&&&&&&&&&&&&&& ....&&&& error C2375: 'accept' : different linkage[原因分析]&& 主要原因是因为中包含了头文件,由于其版本的不同,导致出现上述的错误。中相关代码如下:&&&&&&&&&&&&&& #ifndef WIN32_LEAN_AND_MEAN&&&&&&&&&&&&&& #include &&&&&&&&&&&&&& #include &&&&&&&&&&&&&& #include &&&&&&&&&&&&&& ........&&&&&&&&&&&&&&& #ifndef _MAC&&&&&&&&&&&&&& #include &&&&&&&&&&&&&& #include &&&&&&&&&&&&&& #endif&&&&&&&&&&&&&&& .......&&&&&&&&&&&&&& #include &&&&&&&&&&&&&& #endif&&&&&&&&&&&&&& #endif[解决方案]&&& 由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN宏的大前提下windows.h有可能包含winsock.h 头文件,因此我们得出一个很简单的解决方法就是在包含之前定义WIN32_LEAN_AND_MEAN宏,如下所示:#define WIN32_LEAN_AND_MEAN#include
阅读(13296) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。云南大学软件学院计算机网络原理实验三(new)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
云南大学软件学院计算机网络原理实验三(new)
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢为什么用winsock2.h会出现这个编译问题_百度知道云大计算机网络原理实验三_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
云大计算机网络原理实验三
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 tcp客户端和服务器端 的文章

 

随机推荐