2016-07-01 2 views
3

Я пытаюсь сделать поток UDP с помощью WinSock2.h в C++, но я получаю более 70 ошибок и 17 предупреждений только на WinSock2.h, и все ошибки - это переопределения, синтаксические ошибки из ws2def.h и «разные связи». Я что-то делаю неправильно или это проблема с WinSock2? Если какой-либо использования, я использую 64 бит для Windows 10, Visual Studio 2015Почему я получаю поток ошибок компилятора, когда включаю WinSock2.h?

#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

По крайней мере, покажите нам свой код (минимальный, полный пример, пожалуйста). –

+0

Извините, что я забыл написать код – Logan

ответ

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- # включить "танец":

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

Я должен сказать, что определение _WINSOCKAPI_ макро вмешиваться в обычном включении заголовка сторожевой механики, чтобы предотвратить <windows.h> включить <winsock.h> звучит как реализация-деталь на основе хрупкого «взломать», так что я бы, наверное, предпочел первый вариант ,

Но в целом этот порядок ошибок включения звучит для меня как ошибка в заголовках Win32, поэтому лучше всего для Microsoft это исправить.

EDIT
Как указывается в комментариях, еще Альтернативой может быть #define WIN32_LEAN_AND_MEAN перед тем включая <windows.h>. Однако учтите, что это предотвратит включение других заголовков Windows.

P.S.
Если вы используете предварительно скомпилированные заголовки ("stdafx.h" в только что прочитанном коде на ваш вопрос), вы можете также обратить внимание на порядок включений.

+0

, не могли бы вы объяснить, почему в том числе, что до того, как окна имеют значение? – Logan

+0

'' включает '' по умолчанию, а '' предоставляет множество объявлений '', что вызывает ошибки, когда '' включен после ''. –

+1

Теперь я просто вижу, что вы вставили некоторый исходный код в свой вопрос, и вы используете предварительно скомпилированные заголовки ('#include" stdafx.h "). Поскольку '' stdafx.h'' включен в другие заголовки, пожалуйста, убедитесь, что у вас нет этого конфликта включения в 'stdafx.h'. –

Смежные вопросы