当我包含WinSock2.h时,为什么会出现大量编译器错误?

3

我正在尝试使用c++中的WinSock2.h制作UDP Flood,但是我只在WinSock2.h上收到超过70个错误和17个警告,所有错误都是重新定义、ws2def.h语法错误以及"不同的链接"。我是否做错了什么或者这是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;

6
很可能是您的代码出了问题,但除非我们看到它,否则不幸的是我们无法帮助你。 - πάντα ῥεῖ
1
至少请展示您的代码(请提供最小完整示例)。 - Jesper Juhl
抱歉,我忘记发布代码了。 - Logan
1个回答

5
我猜你可能在引入顺序方面遇到了问题。你可能会收到很多类似以下的错误:
1>c:\program files (x86)\windows kits\8.1\include\um\winsock2.h(2373): error C2375: 'WSAStartup': redefinition; different linkage
1>  c:\program files (x86)\windows kits\8.1\include\um\winsock.h(867): note: see declaration of 'WSAStartup'

那是因为<windows.h>默认包含<winsock.h>,而<winsock.h>提供了许多与<winsock2.h>中重叠的声明,这会在<windows.h>之后包含<winsock2.h>时导致错误。
因此,您可能希望先包含<winsock2.h>,再包含<windows.h>
#include <winsock2.h>
#include <windows.h>

或者,作为另一种选择,你可以尝试定义_WINSOCKAPI_来防止在这个预处理器#undef-#define-#include"dance"中包含<winsock.h><windows.h>中:

#undef _WINSOCKAPI_
#define _WINSOCKAPI_  /* prevents <winsock.h> inclusion by <windows.h> */
#include <windows.h>
#include <winsock2.h>

我必须说,将_WINSOCKAPI_宏的定义插入普通头文件包含保护机制以防止<windows.h>包含<winsock.h>听起来像是一个基于实现细节的脆弱“hack”,所以我可能更喜欢第一种选择。
但总的来说,这种包含顺序的错误对我来说听起来像是Win32头文件中的一个bug,因此最好的方法是让微软修复它。
编辑
如评论中建议的,另一种选择可能是在包含<windows.h>之前#define WIN32_LEAN_AND_MEAN。然而,请注意,这也会阻止包含其他Windows头文件。
附言
如果您正在使用预编译头文件(在您的问题中新显示的代码中的"stdafx.h"),您可能还需要注意其中包含的顺序。

你能否解释一下为什么在windows之前加入“that”会有所不同呢? - Logan
<windows.h>默认包含<winsock.h>,而<winsock.h>提供了许多<winsock2.h>的声明,这会导致在<windows.h>之后包含<winsock2.h>时出现错误。 - Mr.C64
1
现在我只是看到你在问题中粘贴了一些源代码,并且你正在使用预编译头文件(#include "stdafx.h")。由于 "stdafx.h" 是在其他头文件之前包含的,请确保在 stdafx.h 中没有这种包含冲突。 - Mr.C64
好的,那肯定有所帮助,现在我只剩下四个错误了,都在我的main.cpp文件中,“Initialization of buffer is skipped by case label”(缓冲区的初始化被case标签跳过),我想我明白了。谢谢! - Logan
我相信你只需在包含 Windows.h 之前定义 WIN32_LEAN_AND_MEAN 即可。这将避免它拖入 WinSock,使你能够在包含 Windows.h 后像往常一样包含 WinSock2.h。 - Cody Gray
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接