Ошибки сокета не могут получить функции в WinSock2.h

Я создал класс оболочки сокета, но у меня слишком много ошибок, и я не могу понять, как их решить. Я пробовал Ошибка Winsock tutorial и Не могу включить Winsock2.h в MSVC 2010, но не использовать

Вот код:

//#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <string>
#include <Windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma  comment(lib,"ws2_32_lib")
using namespace std;
#define WM_SOCKET 0x10000

class Socket 
{


}; 

Вот ошибки:

Error   107 error C3861: 'WSAStartup': identifier not found \85 1   Project2_SocketLib
Error   89  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   696 1   Project2_SocketLib
Error   90  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   703 1   Project2_SocketLib
Error   91  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   742 1   Project2_SocketLib
Error   92  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   749 1   Project2_SocketLib
Error   93  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   793 1   Project2_SocketLib
Error   94  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   800 1   Project2_SocketLib
Error   95  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   841 1   Project2_SocketLib
Error   96  error C3861: 'WSASetLastError': identifier not found    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WS2tcpip.h   848 1   Project2_SocketLib
Error   109 error C3861: 'WSAGetLastError': identifier not found    \87 1   Project2_SocketLib
Error   112 error C3861: 'WSAGetLastError': identifier not found    \93 1   Project2_SocketLib
Error   105 error C3861: 'WSACleanup': identifier not found \63 1   Project2_SocketLib
Error   103 error C3861: 'shutdown': identifier not found   \57 1   Project2_SocketLib
Error   100 error C3861: 'send': identifier not found   \37 1   Project2_SocketLib
Error   101 error C3861: 'send': identifier not found   \43 1   Project2_SocketLib
Error   98  error C3861: 'recv': identifier not found   \31 1   Project2_SocketLib
Error   99  error C3861: 'recv': identifier not found   \34 1   Project2_SocketLib
Error   116 error C3861: 'inet_ntoa': identifier not found  \115    1   Project2_SocketLib
Error   119 error C3861: 'htons': identifier not found  \137    1   Project2_SocketLib
Error   126 error C3861: 'htonl': identifier not found  \139    1   Project2_SocketLib
Error   104 error C3861: 'closesocket': identifier not found    \58 1   Project2_SocketLib
Error   102 error C3861: 'accept': identifier not found \50 1   Project2_SocketLib
Error   6   error C3805: 'constant': unexpected token, expected either '}' or a ',' C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2def.h 414 1   Project2_SocketLib
Error   108 error C2568: '+' : unable to resolve function overload  \87 1   Project2_SocketLib
Error   111 error C2568: '+' : unable to resolve function overload  \93 1   Project2_SocketLib
Error   124 error C2568: ':' : unable to resolve function overload  \139    1   Project2_SocketLib
Error   125 error C2446: ':' : no conversion from 'unsigned long (__stdcall *)(const char *)' to 'u_long (__stdcall *)(u_long)' \139    1   Project2_SocketLib
Error   106 error C2440: '=' : cannot convert from 'WSADATA' to 'int'   \75 1   Project2_SocketLib
Error   110 error C2440: '=' : cannot convert from 'SOCKET (__stdcall *)(int,int,int)' to 'SOCKET'  \90 1   Project2_SocketLib
Error   115 error C2440: '=' : cannot convert from 'char *(__stdcall *)(in_addr)' to 'std::string'  \115    1   Project2_SocketLib
Error   66  error C2375: 'WSAUnhookBlockingHook' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2383    1   Project2_SocketLib
Error   61  error C2375: 'WSAStartup' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2296    1   Project2_SocketLib
Error   63  error C2375: 'WSASetLastError' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2332    1   Project2_SocketLib
Error   67  error C2375: 'WSASetBlockingHook' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2400    1   Project2_SocketLib
Error   65  error C2375: 'WSAIsBlocking' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2366    1   Project2_SocketLib
Error   64  error C2375: 'WSAGetLastError' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2349    1   Project2_SocketLib
Error   62  error C2375: 'WSACleanup' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2315    1   Project2_SocketLib
Error   68  error C2375: 'WSACancelBlockingCall' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2417    1   Project2_SocketLib
Error   75  error C2375: 'WSACancelAsyncRequest' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2592    1   Project2_SocketLib
Error   76  error C2375: 'WSAAsyncSelect' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2612    1   Project2_SocketLib
Error   70  error C2375: 'WSAAsyncGetServByPort' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2466    1   Project2_SocketLib
Error   69  error C2375: 'WSAAsyncGetServByName' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2439    1   Project2_SocketLib
Error   72  error C2375: 'WSAAsyncGetProtoByNumber' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2517    1   Project2_SocketLib
Error   71  error C2375: 'WSAAsyncGetProtoByName' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2492    1   Project2_SocketLib
Error   73  error C2375: 'WSAAsyncGetHostByName' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2542    1   Project2_SocketLib
Error   74  error C2375: 'WSAAsyncGetHostByAddr' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2569    1   Project2_SocketLib
Error   53  error C2375: 'socket' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2120    1   Project2_SocketLib
Error   52  error C2375: 'shutdown' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2099    1   Project2_SocketLib
Error   51  error C2375: 'setsockopt' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2077    1   Project2_SocketLib
Error   50  error C2375: 'sendto' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2051    1   Project2_SocketLib
Error   49  error C2375: 'send' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2026    1   Project2_SocketLib
Error   48  error C2375: 'select' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2002    1   Project2_SocketLib
Error   47  error C2375: 'recvfrom' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1976    1   Project2_SocketLib
Error   46  error C2375: 'recv' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1951    1   Project2_SocketLib
Error   45  error C2375: 'ntohs' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1931    1   Project2_SocketLib
Error   44  error C2375: 'ntohl' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1914    1   Project2_SocketLib
Error   43  error C2375: 'listen' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1896    1   Project2_SocketLib
Error   35  error C2375: 'ioctlsocket' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1658    1   Project2_SocketLib
Error   42  error C2375: 'inet_ntoa' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1795    1   Project2_SocketLib
Error   41  error C2375: 'inet_addr' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1778    1   Project2_SocketLib
Error   40  error C2375: 'htons' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1761    1   Project2_SocketLib
Error   39  error C2375: 'htonl' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1744    1   Project2_SocketLib
Error   38  error C2375: 'getsockopt' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1723    1   Project2_SocketLib
Error   37  error C2375: 'getsockname' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1700    1   Project2_SocketLib
Error   57  error C2375: 'getservbyport' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2221    1   Project2_SocketLib
Error   58  error C2375: 'getservbyname' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2240    1   Project2_SocketLib
Error   59  error C2375: 'getprotobynumber' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2258    1   Project2_SocketLib
Error   60  error C2375: 'getprotobyname' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2275    1   Project2_SocketLib
Error   36  error C2375: 'getpeername' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1679    1   Project2_SocketLib
Error   56  error C2375: 'gethostname' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2181    1   Project2_SocketLib
Error   55  error C2375: 'gethostbyname' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2163    1   Project2_SocketLib
Error   54  error C2375: 'gethostbyaddr' : redefinition; different linkage  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   2144    1   Project2_SocketLib
Error   34  error C2375: 'connect' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1637    1   Project2_SocketLib
Error   33  error C2375: 'closesocket' : redefinition; different linkage    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1618    1   Project2_SocketLib
Error   32  error C2375: 'bind' : redefinition; different linkage   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1599    1   Project2_SocketLib
Error   31  error C2375: 'accept' : redefinition; different linkage C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   1577    1   Project2_SocketLib
Error   118 error C2228: left of '.sin_port' must have class/struct/union   \137    1   Project2_SocketLib
Error   120 error C2228: left of '.sin_family' must have class/struct/union \138    1   Project2_SocketLib
Error   121 error C2228: left of '.sin_addr' must have class/struct/union   \139    1   Project2_SocketLib
Error   122 error C2228: left of '.S_un' must have class/struct/union   \139    1   Project2_SocketLib
Error   123 error C2228: left of '.S_addr' must have class/struct/union \139    1   Project2_SocketLib
Error   114 error C2227: left of '->sin_addr' must point to class/struct/union/generic type \115    1   Project2_SocketLib
Error   97  error C2079: 'Socket::wsaData' uses undefined struct 'WSAData'  \18 1   Project2_SocketLib
Error   117 error C2079: 'sockAddrIn' uses undefined struct 'sockaddr_in'   \135    1   Project2_SocketLib
Error   78  error C2079: 'sockaddr_gen::AddressIn' uses undefined struct 'sockaddr_in'  C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2ipdef.h   81  1   Project2_SocketLib
Error   77  error C2079: 'sockaddr_gen::Address' uses undefined struct 'sockaddr'   C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2ipdef.h   80  1   Project2_SocketLib
Error   87  error C2079: '_SOCKADDR_INET::Ipv4' uses undefined struct 'sockaddr_in' C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2ipdef.h   202 1   Project2_SocketLib
Error   5   error C2059: syntax error : 'constant'  C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2def.h 414 1   Project2_SocketLib
Error   113 error C2027: use of undefined type 'sockaddr_in'    \115    1   Project2_SocketLib
Error   21  error C2011: 'WSAData' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   353 1   Project2_SocketLib
Error   16  error C2011: 'timeval' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   169 1   Project2_SocketLib
Error   22  error C2011: 'sockproto' : 'struct' type redefinition   C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   451 1   Project2_SocketLib
Error   12  error C2011: 'sockaddr_in' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2def.h 608 1   Project2_SocketLib
Error   4   error C2011: 'sockaddr' : 'struct' type redefinition    C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2def.h 217 1   Project2_SocketLib
Error   19  error C2011: 'servent' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   245 1   Project2_SocketLib
Error   20  error C2011: 'protoent' : 'struct' type redefinition    C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   257 1   Project2_SocketLib
Error   18  error C2011: 'netent' : 'struct' type redefinition  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   238 1   Project2_SocketLib
Error   23  error C2011: 'linger' : 'struct' type redefinition  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   493 1   Project2_SocketLib
Error   88  error C2011: 'ip_mreq' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2ipdef.h   715 1   Project2_SocketLib
Error   17  error C2011: 'hostent' : 'struct' type redefinition C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   225 1   Project2_SocketLib
Error   13  error C2011: 'fd_set' : 'struct' type redefinition  C:\Program Files (x86)\Windows Kits\8.0\Include\um\WinSock2.h   125 1   Project2_SocketLib
Error   127 error C1003: error count exceeds 100; stopping compilation  \139    1   Project2_SocketLib

Ответ 1

Вам нужно повторно заказать входящие заголовки Windows следующим образом:

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>

Другими словами, заголовки WinSock должны быть включены до Windows.h.

Или определите WIN32_LEAN_AND_MEAN, который вы прокомментировали по какой-либо причине.

Думаю, вам также понадобится изменить метод Accept, чтобы вернуть SOCKET, а не SOCKET.

И #pragma должен быть:

#pragma comment(lib,"ws2_32")

Ответ 2

Вы не можете включить Windows.h перед включением WinSock2, так как это приведет к тому, что заголовок окна будет содержать более старую версию winsock. Удалить Windows.h можно в целом.

См., например, эту ссылку MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx Эта часть примечания в первом блоке кода объясняет это.

Ответ 3

Я убедился, что #include "Winsock2.h" перед любыми #include "windows.h" и "#include" Winsock.h ", и это разрешило дело.

Просто терпение, посмотрите, включите один за другим и установите этот порядок, сначала #include "Winsock2.h", затем #include "windows.h"

Я проверил, что рекурсивный включает, я заметил файлы заголовков, которые включают (рекурсивно) некоторые #include "windows.h" и "#include" Winsock.h "и записывают # include" Winsock2.h "в этих файлах, я добавил # включить "Winsock2.h" `в качестве первого включить.