【问题标题】:Why do I get a flood of compiler errors when I include WinSock2.h? [duplicate]当我包含 WinSock2.h 时,为什么会出现大量编译器错误? [复制]
【发布时间】:2016-07-01 16:29:21
【问题描述】:

我正在尝试在 c++ 中使用 WinSock2.h 进行 UDP 泛洪,但仅在 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;

【问题讨论】:

  • 您的代码很可能有问题,但除非我们看到,否则我们无法帮助您。
  • 至少,向我们展示您的代码(请提供最少的完整示例)。
  • 对不起,我忘了贴代码

标签: c++ windows winapi winsock2


【解决方案1】:

我猜你的包含顺序可能有问题。

您可能会遇到很多错误:

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'

这是因为&lt;windows.h&gt; 默认包含&lt;winsock.h&gt;,而&lt;winsock.h&gt; 提供了许多与&lt;winsock2.h&gt; 中的声明重叠的声明,这会在包含&lt;winsock2.h&gt; 时导致错误 @987654327 @。

因此,您可能希望&lt;windows.h&gt;之前包含&lt;winsock2.h&gt;

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

或者,作为替代方案,您可以尝试定义 _WINSOCKAPI_ 以防止使用此预处理器 #undef-#define-#include 将 &lt;winsock.h&gt; 包含在 &lt;windows.h&gt; “舞蹈”

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

我不得不说 _WINSOCKAPI_ 宏的定义会干扰普通的标头包含保护机制以防止 &lt;windows.h&gt; 包含 &lt;winsock.h&gt; 听起来像是基于实现细节的脆弱“黑客”,所以我会可能更喜欢第一个选项。

但在我看来,所有这些包含顺序的错误听起来像是 Win32 标头中的错误,所以最好的办法是让 Microsoft 修复它。

编辑
正如 cmets 中所建议的,另一个替代方案可能是 #define WIN32_LEAN_AND_MEAN before,包括 &lt;windows.h&gt;。但是,请注意,这也会阻止包含其他 Windows 标头。

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

【讨论】:

  • 您能否解释一下为什么在 windows 有所作为之前包含它?
  • &lt;windows.h&gt; 默认包含&lt;winsock.h&gt;,而&lt;winsock.h&gt; 提供了许多&lt;winsock2.h&gt; 的声明,当&lt;winsock2.h&gt; 包含在&lt;windows.h&gt; 之后会导致错误。
  • 现在我看到您在问题中粘贴了一些源代码,并且您使用的是预编译的标头 (#include "stdafx.h")。由于"stdafx.h" 包含在 其他标头之前,请确保您在stdafx.h 中也没有这种包含冲突。
  • 好吧,这肯定有帮助,现在我的 main.cpp 中出现了四个错误“缓冲区的初始化被大小写标签跳过”我想我现在明白了。谢谢!
  • 不客气。很高兴为您服务。我知道这是一个微妙的错误,在我最初的 Win32 编程经验中我被它击中了 :)
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2013-08-14
相关资源
最近更新 更多