当我包含 WinSock2.h 时,为什么会出现大量编译器错误?
Why do I get a flood of compiler errors when I include WinSock2.h?
我正在尝试在 C++ 中使用 WinSock2.h 进行 UDP 泛洪攻击,但我在 WinSock2.h 上收到超过 70 个错误和 17 个警告,所有错误都是重定义,语法错误来自ws2def.h,和 "different linkages"。我做错了什么或者这是 WinSock2 的问题吗?如果有用我用的是64位 Windows 10, Visual Studio 2015
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include <fstream>
#include <time.h>
#include "wtypes.h"
#include "Functions.h"
#pragma comment(lib, "ws2_32.lib")
//Get IP
cin.getline(TargetIP, 17);
//Get IP
cout << "Enter the Port: ";
cin >> nPort;
cout << endl;
//Initialize WinSock 2.2
WSAStartup(MAKEWORD(2, 2), &wsaData);
//Create our UDP Socket
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//Setup the target address
targetAddr.sin_family = AF_INET;
targetAddr.sin_port = htons(nPort);
targetAddr.sin_addr.s_addr = inet_addr(TargetIP);
//Get input from user
cout << "Please specify the buffer size:";
cin >> bufferSize;
//Create our buffer
char * buffer = new char[bufferSize];
while(true){
//send the buffer to target
sendto(s, buffer, strlen(buffer), NULL, (sockaddr *)&targetAddr, sizeof(targetAddr));
}
//Close Socket
closesocket(s);
//Cleanup WSA
WSACleanup();
//Cleanup our buffer (prevent memory leak)
delete[]buffer;
我猜你的包含顺序可能有问题。
您可能会遇到很多错误:
1>c:\program files (x86)\windows kits.1\include\um\winsock2.h(2373): error C2375: 'WSAStartup': redefinition; different linkage
1> c:\program files (x86)\windows kits.1\include\um\winsock.h(867): note: see declaration of 'WSAStartup'
这是因为<windows.h>
默认包含<winsock.h>
,而<winsock.h>
提供了很多与<winsock2.h>
重叠的声明,导致<winsock2.h>
时出错after <windows.h>
.
因此,您可能需要 在 <windows.h>
:
之前包含 <winsock2.h>
#include <winsock2.h>
#include <windows.h>
或者,作为替代方案,您可以尝试定义 _WINSOCKAPI_
以防止使用此预处理器将 <winsock.h>
包含在 <windows.h>
中#undef-#define-#include "dance":
#undef _WINSOCKAPI_
#define _WINSOCKAPI_ /* prevents <winsock.h> inclusion by <windows.h> */
#include <windows.h>
#include <winsock2.h>
我不得不说 _WINSOCKAPI_
宏的定义会干扰普通的 header 包含保护机制以防止 <windows.h>
包含 <winsock.h>
听起来像 implementation-details-based 脆弱 "hack",所以我可能更喜欢第一个选项。
但总的来说,这个包含顺序错误对我来说就像是 Win32 header 中的错误,所以最好的办法是让微软修复它。
编辑
正如评论中所建议的,另一种选择可能是 #define WIN32_LEAN_AND_MEAN
before including <windows.h>
。但是,请注意,这也会阻止包含其他 Windows header。
P.S.
如果您使用的是 precompiled headers ("stdafx.h"
在您的问题中新显示的代码中),您可能需要注意其中包含的顺序嗯。
我正在尝试在 C++ 中使用 WinSock2.h 进行 UDP 泛洪攻击,但我在 WinSock2.h 上收到超过 70 个错误和 17 个警告,所有错误都是重定义,语法错误来自ws2def.h,和 "different linkages"。我做错了什么或者这是 WinSock2 的问题吗?如果有用我用的是64位 Windows 10, Visual Studio 2015
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include <fstream>
#include <time.h>
#include "wtypes.h"
#include "Functions.h"
#pragma comment(lib, "ws2_32.lib")
//Get IP
cin.getline(TargetIP, 17);
//Get IP
cout << "Enter the Port: ";
cin >> nPort;
cout << endl;
//Initialize WinSock 2.2
WSAStartup(MAKEWORD(2, 2), &wsaData);
//Create our UDP Socket
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//Setup the target address
targetAddr.sin_family = AF_INET;
targetAddr.sin_port = htons(nPort);
targetAddr.sin_addr.s_addr = inet_addr(TargetIP);
//Get input from user
cout << "Please specify the buffer size:";
cin >> bufferSize;
//Create our buffer
char * buffer = new char[bufferSize];
while(true){
//send the buffer to target
sendto(s, buffer, strlen(buffer), NULL, (sockaddr *)&targetAddr, sizeof(targetAddr));
}
//Close Socket
closesocket(s);
//Cleanup WSA
WSACleanup();
//Cleanup our buffer (prevent memory leak)
delete[]buffer;
我猜你的包含顺序可能有问题。
您可能会遇到很多错误:
1>c:\program files (x86)\windows kits.1\include\um\winsock2.h(2373): error C2375: 'WSAStartup': redefinition; different linkage
1> c:\program files (x86)\windows kits.1\include\um\winsock.h(867): note: see declaration of 'WSAStartup'
这是因为<windows.h>
默认包含<winsock.h>
,而<winsock.h>
提供了很多与<winsock2.h>
重叠的声明,导致<winsock2.h>
时出错after <windows.h>
.
因此,您可能需要 在 <windows.h>
:
<winsock2.h>
#include <winsock2.h>
#include <windows.h>
或者,作为替代方案,您可以尝试定义 _WINSOCKAPI_
以防止使用此预处理器将 <winsock.h>
包含在 <windows.h>
中#undef-#define-#include "dance":
#undef _WINSOCKAPI_
#define _WINSOCKAPI_ /* prevents <winsock.h> inclusion by <windows.h> */
#include <windows.h>
#include <winsock2.h>
我不得不说 _WINSOCKAPI_
宏的定义会干扰普通的 header 包含保护机制以防止 <windows.h>
包含 <winsock.h>
听起来像 implementation-details-based 脆弱 "hack",所以我可能更喜欢第一个选项。
但总的来说,这个包含顺序错误对我来说就像是 Win32 header 中的错误,所以最好的办法是让微软修复它。
编辑
正如评论中所建议的,另一种选择可能是 #define WIN32_LEAN_AND_MEAN
before including <windows.h>
。但是,请注意,这也会阻止包含其他 Windows header。
P.S.
如果您使用的是 precompiled headers ("stdafx.h"
在您的问题中新显示的代码中),您可能需要注意其中包含的顺序嗯。