-->

socket errors can't get functions in WinSock2.

2020-08-10 08:12发布

问题:

I have created a socket wrapper class but I have too many errors that I cannot figure out how to solve. I tried Winsock tutorial error and Can't include Winsock2.h in MSVC 2010, but no use

Here is the 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 
{


}; 

Here are the errors:

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:

You need to re-order the includes of the Windows headers like so:

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

In other words, the WinSock headers must be included before Windows.h.

Or define WIN32_LEAN_AND_MEAN which you have commented out for some reason.

I think you will also need to change the Accept method to return SOCKET rather than Socket.

And the #pragma should be:

#pragma comment(lib,"ws2_32")


回答2:

You can't include Windows.h before you include WinSock2, as this will lead the windows header to include an older version of winsock. Remove the Windows.h include altogether.

See, for instance, this MSDN link: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx The Note part under the first code block explains this.



回答3:

I made sure that an #include "Winsock2.h" is before any #include "windows.h" and "#include "Winsock.h" and this solved the case.

Just a matter of patience, look at includes one by one and establish this order, first #include "Winsock2.h" then #include "windows.h"

I checked the recursive includes, I spotted the header files which include (recursively) some #include "windows.h" and "#include "Winsock.h"and write a#include "Winsock2.h". in this files, i added#include "Winsock2.h"` as the first include.