winsock编译错误

时间:2010-06-17 05:38:59

标签: c winsock winsock2

以下错误来自仅包含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命令将其输入到注册表中。不知道从哪里去,欣赏任何建议。 。 。

3 个答案:

答案 0 :(得分:2)

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

#define _WINSOCKAPI_ 
#include "windows.h"
#include "winsock2.h"

答案 1 :(得分: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&gt;属性&gt;链接器&gt;其他包括(或类似的东西,目前不在Visual Studio的计算机上......)这也在上面的链接中描述。

答案 2 :(得分:1)

#pragma comment(lib, "wininet.lib")
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

使用此避免编译错误