3

以下错误来自仅包含 windows 和 winsock2 的文件。

C:\Users\ioil\Desktop\dm\bin>dmc sockit.c
typedef struct fd_set {
                      ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(85) : Error: 'fd_set' is already defined
} fd_set;
^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(88) : Error: identifier or '( declarator )' expected
struct timeval {
               ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(129) : Error: 'timeval' is already defined
};
^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(132) : Error: identifier or '( declarator )' expected
struct  hostent {
                ^
C:\Users\ioil\Desktop\dm\bin\..\include\win32\WINSOCK2.H(185) : Error: 'hostent' is already defined
Fatal error: too many errors
--- errorlevel 1

C:\Users\ioil\Desktop\dm\bin>

已经尝试过的方法:将winsock.dll文件放在与编译器和要编译的程序相同的目录下,放在system32目录下,用regsrv32命令进入注册表。真的不知道从哪里开始,感谢任何建议。. .

4

3 回答 3

2

您应该按照 Iulian Şerbănoiu 的建议将 winsock2.h 放在 windows.h 之前

#include <winsock2.h>
#include <windows.h>

您还可以使用精益和平均宏:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>

原因在 msdn 上有描述:Creating a Basic Winsock Application

还要确保将程序链接到 WS2_32.lib 文件(这取决于您使用的 IDE,例如 Visual Studio?)
在 Visual Studio 中,您转到 Project > Properties > Linker > Additional includes(或类似的东西,目前不在带有视觉工作室的计算机上..)上面的链接中也对此进行了描述。

于 2010-06-17T09:24:54.467 回答
2

windows.h 包含 winsock.h,它与 winsock2.h 包含文件发生冲突。通过在包含 windows.h 之前定义WINSOCKAPI来防止第一次包含 :

#define _WINSOCKAPI_ 
#include "windows.h"
#include "winsock2.h"
于 2010-06-17T05:46:02.303 回答
1
#pragma comment(lib, "wininet.lib")
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

使用这个避免编译错误

于 2011-02-22T06:24:16.987 回答