socket errors can't get functions in WinSock2.h

23,575

Solution 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")

Solution 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.

Solution 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.

Share:
23,575
Admin
Author by

Admin

Updated on August 26, 2020

Comments

  • Admin
    Admin over 3 years

    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
    
  • Remy Lebeau
    Remy Lebeau about 10 years
    You can include windows.h before winsock2.h if you define _WINSOCKAPI_ beforehand. That will disable winsock.h, which windows.h includes by default.
  • MicroVirus
    MicroVirus about 10 years
    @RemyLebeau: Do you know if that define is 'portable' (i.e. the same in all versions of the SDK)?. That MSDN page says you can define WIN32_LEAN_AND_MEAN, but that's not always an option. Anyhow, I think it's best to just let Winsock2 include the windows headers.
  • Remy Lebeau
    Remy Lebeau about 10 years
    Yes, that define is the same in all SDK versions. It is the header guard that protects the content of winsock.h from multiple inclusions. winsock2.h defines _WINSOCKAPI_ to disable winsock.h if winock2.h is included before winsock.h is included, to avoid multiple declaration errors. winsock2.h does not include the windows headers.
  • Shivaraj Bhat
    Shivaraj Bhat over 9 years
    In my case, I am just including WS2tcpip.h everywhere (other 2 files are not included, because they are internally included in this one).But still I am getting redefinition error for many functions. Most of these functions are declared under #if INCL_WINSOCK_API_PROTOTYPES block which is defined to 1. Can you suggest something on this? Thanks for the help!
  • Shivaraj Bhat
    Shivaraj Bhat over 9 years
    In my case, I am just including WS2tcpip.h everywhere (other 2 files are not included, because they are internally included in this one).But still I am getting redefinition error for many functions. Most of these functions are declared under #if INCL_WINSOCK_API_PROTOTYPES block which is defined to 1. Can you suggest something on this? Thanks for the help!
  • Shivaraj Bhat
    Shivaraj Bhat over 9 years
    In my case, I am just including WS2tcpip.h everywhere (other 2 files are not included, because they are internally included in this one).But still I am getting redefinition error for many functions. Most of these functions are declared under #if INCL_WINSOCK_API_PROTOTYPES block which is defined to 1. Can you suggest something on this? Thanks for the help!
  • Mario Klebsch
    Mario Klebsch over 7 years
    An empty C++ file having only two lines #include <WinSock2.h> and #include <WS2tcpip.h> gives lots of errors for me (VS2005). The first error message is Error 1 error C2146: syntax error : missing ';' before identifier 'Byte' C:\Program Files\Microsoft SDKs\Windows\v6.0\Include\in6addr.h 24
  • Mario Klebsch
    Mario Klebsch over 7 years
    having #include <Windows.h> in between #include <Winsock2.h> and #include <Ws2tcpip.h> fixed the problem.