`
eggbucket
  • 浏览: 187457 次
  • 性别: 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/

分享到:
评论

相关推荐

    RecvFile.rar_UM_RECVFILE winsock

    在`RecvFile`源码中,`RecvFileDlg.h`和`.cpp`文件可能包含了用户界面的定义和实现,如对话框类,用于显示接收进度和控制接收操作。`resource.h`可能包含了对话框和控件的ID,而`.opt`文件则可能包含了编译选项。 ...

    winsock window套接字 TCP/IP

    总的来说,"winsock window套接字 TCP/IP"是一个关于使用Windows套接字API进行TCP/IP通信的编程主题。通过VS2008工程,我们可以学习如何在Windows环境下构建可靠的网络应用,无论是客户端还是服务器端,都是基于...

    常用api常数头文件.rar

    1. **windef.h**:这个头文件包含了Windows编程中的基础定义,比如数据类型(如`DWORD`, `LPARAM`, `LPARAM`等)和窗口位置与尺寸的结构体(如`POINT`, `RECT`)。此外,还定义了一些常用的宏,如`MAX_PATH`(最大...

    Network Programming for Microsoft Windows 2nd.doc

    2. **Winsock头文件和库**:在Winsock编程中,主要使用`winsock2.h`和`ws2_32.lib`(或`ws2_32.dll`)进行编译和链接。这些文件包含了定义网络通信所需的数据结构、函数原型和常量。 3. **初始化Winsock**:在编写...

    Windows Sockets 2.pdf

    **Mstcpip.h** 文件定义了一系列与网络通信相关的结构体和枚举类型,它们为开发人员提供了更高级别的抽象来管理网络资源。其中包含的关键数据结构和枚举类型包括: - **ASSOCIATE_NAMERES_CONTEXT_INPUT structure*...

    UDP传输.rar_EZI_UDP socket_VC6.0 UDP_vc6 udp_vc6.0 UDP socket

    1. **配置Winsock**:在项目中包含Winsock头文件`winsock2.h`和`ws2tcpip.h`,并链接`ws2_32.lib`库。初始化Winsock时,调用`WSAStartup`函数,并在程序结束时使用`WSACleanup`关闭。 ```cpp #include &lt;winsock2.h&gt;...

    (原创)windows下编译安装DarwinStreamingServer6.0.3源码

    - **winsock2重定义**:在`OSHeaders.h`中,添加`#define WIN32_LEAN_AND_MEAN`到`#include &lt;windows.h&gt;`前。 - **timeGetTime函数未定义**:引入`&lt;Mmsystem.h&gt;`头文件,并在工程设置中链接Winmm.lib库。 - **grp...

    用VC实现PING技术

    2. **添加头文件和库**:为了使用ICMP协议,我们需要包含`winsock2.h`和`ws2tcpip.h`头文件,并链接`ws2_32.lib`库。在`stdafx.h`或`main.cpp`文件中添加: ```cpp #include &lt;winsock2.h&gt; #include &lt;ws2tcpip.h&gt; ...

    TCP.zip_site:www.pudn.com

    在C++中,可以使用`&lt;winsock2.h&gt;`或`&lt;sys/socket.h&gt;`头文件来操作套接字。 TcpSrv可能包含以下功能: 1. 初始化套接字并绑定到一个特定的IP地址和端口号。 2. 开启监听,等待客户端的连接请求。 3. 当客户端连接时...

    Visual C++ 2005从入门到精通(普及版)ch13

    1. **WinSock初始化**:首先,你需要引入必要的头文件,如`winsock2.h`和`ws2tcpip.h`,然后调用`WSAStartup`函数初始化WinSock库。这一步是所有WinSock编程的基础,确保系统能够支持网络通信。 2. **套接字创建**...

    套接字断开重连

    在文件0907中,可能包含了具体的VC项目代码示例,包括定义套接字对象、初始化Winsock、连接服务器、数据传输以及断开重连的相关函数。通过分析这些代码,可以更直观地理解如何在实际项目中实现套接字断开重连功能。 ...

    socket图片文件传输示例.doc

    2. 定义了套接字相关的变量,如`SOCKADDR_IN`结构体`seraddr`和`cliaddr`,用于存储服务器和客户端的地址信息。服务器端的套接字`listensocket`被创建为TCP类型的,监听8889端口。`inet_addr("127.0.0.1")`表示...

    TCP/IP文件传输(c++)

    以下是关于这个主题的详细知识点: 1. **TCP/IP协议栈**: - TCP/IP模型由四层组成:应用层、传输层、网络层和数据链路层。文件传输涉及应用层和传输层。 - 应用层:定义了如FTP(文件传输协议)、HTTP(超文本...

    MFC中socket调用示例程序

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库中的socket API来创建一个简单的客户端-服务器通信程序。MFC是Microsoft为Windows应用程序开发提供的一种C++类库,它封装了许多Windows API,...

    VC实现UDP通讯(源码)

    首先,我们需要包含必要的头文件,`winsock2.h`和`ws2tcpip.h`,并链接`ws2_32.lib`库: ```cpp #include &lt;winsock2.h&gt; #include &lt;ws2tcpip.h&gt; #pragma comment(lib, "ws2_32.lib") ``` 初始化Winsock: ```cpp ...

    WINCE_Socket.rar_CE_Windows CE_ce socket_socket windows CE_wince

    在Windows CE中,Socket编程与标准的Windows Socket API(也称为Winsock)类似,但有一些关键的区别。例如,WinCE可能不支持所有的套接字选项或地址族,开发者需要特别注意API的兼容性问题。封装类如CESocket通过...

    VC++winsocket端口扫描器

    在VC++项目中,你需要包含相应的头文件`winsock2.h`和`ws2tcpip.h`,并链接`ws2_32.lib`库。确保在程序开始时调用`WSAStartup`函数初始化Winsock,并在结束时调用`WSACleanup`进行清理。 2. **创建套接字** 使用`...

    Socket UDP 实现聊天程序

    首先,我们需要包含必要的头文件,如`winsock2.h`和`ws2tcpip.h`,并链接`ws2_32.lib`库。在初始化时,我们需要调用`WSAStartup`函数来设置Winsock环境。之后,创建一个`SOCKET`类型的变量,用于存储套接字句柄。...

    vc++ udp客服端

    1. **引入Winsock库**:首先,我们需要包含Winsock2头文件`winsock2.h`,并链接`ws2_32.lib`库。在程序开始时调用`WSAStartup`函数初始化Winsock,结束时调用`WSACleanup`关闭。 2. **创建套接字**:使用`socket`...

    tftp 客户端源码

    源码中包含了必要的头文件引入,如`stdio.h`、`winsock.h`、`conio.h`等,以及一系列宏定义用于适配不同编译器的特定需求。 #### 三、关键数据结构与常量定义 1. **操作码定义**: - `TFTP_RRQ`: 读取请求(Read ...

Global site tag (gtag.js) - Google Analytics