`
eggbucket
  • 浏览: 184541 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于WINSOCK.H与winsock2.h中的重定义解决办法分析

    博客分类:
  • C++
 
阅读更多

问题描述:在 VC 6.0中使用socket相关的函数时没有什么问题,可是到了.net下就有以下类似的错误,

 

 

c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(112) : error C2011: “fd_set”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(54) : 参见“fd_set”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(147) : warning C4005: “FD_SET”:宏重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(88) : 参见“FD_SET”的前一个定义
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(156) : error C2011: “tim”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(97) : 参见“tim”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(212) : error C2011: “hostent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(153) : 参见“hostent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(225) : error C2011: “netent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(166) : 参见“netent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(232) : error C2011: “servent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(173) : 参见“servent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(244) : error C2011: “protoent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(185) : 参见“protoent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(400) : error C2011:“sockaddr_in”: “struct”类型重定义

 

 

解决方法:

根据网上搜索得到的资料, 以及检查 WinSock2.h , WinSock.h , windows.h 三个文件,
可以得知 这个错误是你的文件中即包含了 WinSock.h 又包含了WinSock2.h 文件。
如果你在文件中 写
-------------
#include <WinSock.h>
#include <WinSock2.h>
---------------------------
这样就会出错,但
-------------
#include <WinSock2.h>
#include <WinSock.h>
---------------------------
这样写就不会出错,因为WinSock2.h 中已经通过定义#define _WINSOCKAPI_ 来避免在包含WinSock.h了。

但这个错误跟多的出现实因为 windows.h 和WinSock2.h同时使用的情况,因为 windows.h 默认会包含WinSock.h ,所以如果你在文件中写
-------------
#include <Windows.h>
#include <WinSock2.h>
---------------------------
就会出现这个错误。
但写成
-----------------------------
#define WIN32_LEAN_AND_MEAN   // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <WinSock2.h>
--------------------------------
就也不会出错,因为WIN32_LEAN_AND_MEAN 宏没有定义的情况下windows.h才会包含 WinSock.h 头文件的。具体可以看windows.h文件。stdafx.h头文件就是先定义了一个WIN32_LEAN_AND_MEAN的。


但我的错误却都是这样写,而是因为写成
-----------------------
#include <objbase.h>
#include <xxxxxx.h>
---------------------
原因是objbase.h 又先去包含了windows.h 头文件,而xxxxxx.h 文件中包含了 WinSock2.h 文件。


出现这类问题只能自己去检查头文件的引用和顺序等关系了。当文件引用关系比较复杂的情况下,找起来还是很麻烦的。

 

 

第二种[解决方案]

问题描述]
   在包含了<windows.h>以及<winsock2.h>的工程中,编译有时会出现如
下错误:

     error C2011: 'fd_set' : 'struct' type redefinition
     error C2011: 'timeval' : 'struct' type redefinition
                     ....
     error C2375: 'accept' : redefinition; different linkage
[原因分析]
   主要原因是因为<windows.h>中包含了<winsock.h>头文件,由于其版
本的不同,导致出
现上述的错误。<windows.h>中相关代码如下:
               #ifndef WIN32_LEAN_AND_MEAN
               #include <cderr.h>
               #include <dde.h>
               #include <ddeml.h>
               ........
                #ifndef _MAC
               #include <winperf.h>
               #include <winsock.h>
               #endif
                .......

               #include <commdlg.h>
               #endif
               #endif

[解决方案]

由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN宏 的大前
提下windows.h有可能包含winsock.h 头文件,因此我们得出一个很简单
的解决方
法就是在包含<windows.h>之前定义WIN32_LEAN_AND_MEAN宏,如
下所示:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

 

 

转载:

http://blog.chinaunix.net/space.php?uid=20680966&do=blog&cuid=689402

http://xia-siyu.blog.163.com/blog/static/2748304120106984151155/

分享到:
评论

相关推荐

    注册表winsock.reg和winsock2.reg

    误删注册表winsock没有备份,导致无法上网时,导入这两个文件马上就可以解决。 正常上网的win10家庭版中导出的。 下载后可直接使用

    C语言头文件 WINSOCK2

    C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK2C语言头文件 WINSOCK...

    VB.net使用Winsock.ocx

    虽然拓展性和功能性更强,但是对于简单的普通使用的确更麻烦了,全部面向对象的操作实在不比Winsock.OCX事件驱动程序模式来的“傻瓜” 怀念Winsock.OCX,故特地移植到VB.NET上。完美兼容,回归简单。 注意:记得...

    WinSock

    WinSock

    PB中winsock.PBL-demo

    PowerBuilder9.0中使用winsock.pbl和PSLIB21.DLL进行网络通信(聊天、信息推送等)

    winsock2-API.rar_WINSOCK2 API_winsock2 c++_winsock2.文件_winsock2a

    WINSOCKAPI2设计简单的WINSOCKAPI2文件包括服务器界面

    winsock.pbl编程实例

    用winsock.pbl写的一个powerbuilder下的socket实例,对初学者很有帮助。

    WinSock.pbl进行通讯

    WinSock.pbl进行通讯,请参观,下载

    winsock.pbl开发的详细代码

    使用winsock.pbl开发socket通信的详细程序。包含客户端源程序和服务器端源程序。PB6测试通过。功能全面。

    winsock.ocx多客户端服务端

    采用WINSOCK.ocx控件进行多客户端连接的服务端。

    使用WinSock.pbl进行通讯

    使用WinSock.pbl进行通讯,网上的一个winsock通讯例子

    winsock.pbl

    winsock.pbl pb6通信调用aaaaaaaaaaaa

    winsock 函数详解

    编写与Winsock1兼容的程序你需要引用头文件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件,它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H...

    Winsock.2网络编程实用教程)源码

    Winsock.2网络编程实用教程)源码

    socket linux2

    // 定义套接字地址中的域 address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_addr.s_addr = inet_addr(IP_ADDR); // 定义套接字地址 address.sin_port = htons(PORT); // 定义套接字端口 char buf...

    C#使用WinsockAPI编程教学

    Windpows Sockets 是广泛应用的、开放的、支持多种协议的网络编程接口,主要由winsock.h 头文件和动态链接库winsock.dll组成。

    win10 winsock.zip

    文件为Windows10系统的winsock文件,可以在误删除winsock和QQ启动报initialization failure:0×0000000c错误及软件无法正常打开时使用

    winsock和winsocket2注册表.zip

    客户端卸载后上不网的解决方法,winsock和winsock2注册表,用于重新修复10的注册表

    WinSock2.pas

    Delphi的WinSock2.pas文件,供网络编程使用 使用方法:WinSock2.pas安装步骤,Componet--&gt; install component..--&gt; 选择WinSock2.pas文件--&gt; install;

    winsock编程.chm

    winsock编程chm格式 Winsocket编程之TCP/IP体系结构 [文章导读] TCP/IP协议实际上就是在物理网上的一组完整的网络协议......

Global site tag (gtag.js) - Google Analytics