web-dev-qa-db-fra.com

les erreurs de socket ne peuvent pas obtenir de fonctions dans WinSock2.h

J'ai créé une classe de wrapper de socket, mais j'ai trop d'erreurs que je ne sais pas comment résoudre. J'ai essayé Erreur du didacticiel Winsock et Impossible d'inclure Winsock2.h dans MSVC 2010 , mais aucune utilisation 

Voici le code:

//#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 
{


}; 

Voici les erreurs:

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
12
user474901

Vous devez ré-ordonner les includes des en-têtes Windows comme ceci:

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

En d'autres termes, les en-têtes WinSock doivent être inclus avant Windows.h

Ou définissez WIN32_LEAN_AND_MEAN que vous avez commenté pour une raison quelconque. 

Je pense que vous devrez également changer la méthode Accept pour renvoyer SOCKET au lieu de Socket.

Et le #pragma devrait être:

#pragma comment(lib,"ws2_32")
26
David Heffernan

Je me suis assuré que #include "Winsock2.h" était avant tout #include "windows.h" et "#include" Winsock.h "et que l'affaire était résolue.

Juste une question de patience, regardez un par un et établissez cet ordre, d'abord #include "Winsock2.h" puis #include "windows.h"

J'ai vérifié les inclusions récursives, j'ai repéré les fichiers d'en-tête qui incluent (récursivement) des #include "windows.h" et "#include" Winsock.h et écris un # include "Winsock2.h". J'ai ajouté dans ce fichier #include "Winsock2.h" `en tant que première inclusion.

1
octoback

Vous ne pouvez pas inclure Windows.h avant d'inclure WinSock2, car cela entraînerait l'en-tête de Windows pour inclure une version plus ancienne de winsock. Supprimez le Windows.h inclure tout à fait.

Voir, par exemple, ce lien MSDN: http://msdn.Microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx La note la partie sous le premier bloc de code explique cela.

1
MicroVirus