9

Having an issue connecting to a device on my network. Whenever I call getaddrinfo() it returns 11001. I have checked this with numerous different IP's in the IP_ADDRESS string (Global Var). I've checked all the non-working numbers with nslookup, and most exist there.

getaddrinfo-returns-always-11001-host-not-found seems to be asking a similar question, but there's no answer there.

At the moment, my code is not even trying to connect to the remote device, just trying to resolve an IP. Once that works I can move on to bigger and messier problems.

Implementation:

int connectToDevice(char *sendbuf, char *recvbuf, SOCKET ConnectSocket)
{
WSADATA wsaData;
    struct addrinfo *result = NULL,
                *ptr = NULL,
                hints;
struct timeval tval;

fd_set rset, wset;


int iResult;
u_long mode = -1;

//Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) 
{
    printf("WSAStartup failed with error: %d\n", iResult);
    return 1;
}

ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

//Resolve the server address and port
iResult = getaddrinfo(IP_ADDRESS, DEFAULT_PORT, &hints, &result);
if ( iResult != 0 ) 
{
    printf("getaddrinfo failed with error: %d\n", iResult);
    WSACleanup();
    return 1;
}



// Attempt to connect to an address until one succeeds
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) 
{

    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
    if (ConnectSocket == INVALID_SOCKET) 
    {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    //set socket to non-blocking
    iResult = ioctlsocket(ConnectSocket, FIONBIO, &mode); //if mode is set to non-zero, socket set to non-blocking.
    if(iResult != NO_ERROR)
    {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }


    // Connect to server.
    iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR  ) //if an error and not WSAEWOULDBLOCK, then close socket and try next address
    {
        if(WSAEWOULDBLOCK != WSAGetLastError())
        {
            closesocket(ConnectSocket);
            ConnectSocket = INVALID_SOCKET;
            continue;                           //this returns control to the For loop. I.e. if a socket error, try next address
        }
        else    //otherwise if the error was WSAEWOULDBLOCK, then use select to check for connections.
        {
            FD_ZERO(&rset); //initialise fd_sets for reading and writing; both the same.
            FD_SET(ConnectSocket, &rset);
            wset = rset;

            //set tval to timeout value
            tval.tv_sec = TIMEOUT;
            tval.tv_usec= 0;

            //select statement
            //select ignores first parameter
            //select takes 3xfd_sets, read set, write set, and exception set.
            //select's last parameter is timeout in the form of a timeval struct
            //if return == 0, timeout occured.
            //if return == SOCKET_ERROR, error occured, use WSAGetLastError to check for details.

            iResult = select(ConnectSocket, &rset, &wset, NULL, &tval);
            if (iResult ==0)
            {
                closesocket(ConnectSocket);
                printf("Timeout reached, closing socket");
                WSACleanup();
                return 1;
            }
            else if(iResult == SOCKET_ERROR)
            {
                printf("socket failed with error: %ld\n", WSAGetLastError());
                WSACleanup();
                return 1;
            }

        }

    }

    break;  //Breaks out of the for loop. Will only occur if continue not executed
}

freeaddrinfo(result);

if (ConnectSocket == INVALID_SOCKET)
{
    printf("Unable to connect to server!\n");
    WSACleanup();
    return 1;
}

return 0;}

Most of this code has been taken lock and stock from the msdn website, but it all seems to look ok.

Community
  • 1
  • 1
Shocklanced
  • 153
  • 1
  • 1
  • 8

4 Answers4

3

That's the error code for "host not found".

Look in WinSock2.h and search for WSABASEERR+1001 or WSAHOST_NOT_FOUND.

Microsoft's docs tells you which error codes getaddrinfo returns.

TankorSmash
  • 12,186
  • 6
  • 68
  • 106
JimR
  • 15,513
  • 2
  • 20
  • 26
  • Systems programming 101: Read the documentation and take a minute to explicitly handle and report all the allowed return codes. – Keith Jan 24 '11 at 04:33
  • MS's junk is missing a thread-safe gai_strerror. Better to use WSAGetLastError and FormatMessage. Or roll your own which I've done a few times since there are, in the endless pit that is Winsock[2] some cases where what FormatMessage provides doesn't make sense in the context. If I think of an example of this soon, I'll update... – JimR Jan 24 '11 at 16:02
  • Hi Guys, my code is handling the error being received, and I know what the error means, but its cropping up in circumstances where the address is known,and resolves via nslookup, or a numerical string containing the IP address is passed in, and that address exists on the network. *Edit* I'll try that WSAGetLastError wrapper and let you know how it goes! – Shocklanced Jan 27 '11 at 08:02
  • Hi All, I've tried using WSAGetLastError() to see if there's an undetected error in making the getaddrinfo call, but it just returns 0. As far as I can tell the getaddrinfo call is unable to resolve the address regardless of the format. Any ideas on why this would happen? – Shocklanced Jan 28 '11 at 00:11
  • 1
    What's in \System32\Drivers\etc\hosts? – JimR Jan 29 '11 at 05:53
  • @Shocklanced `getaddrinfo()` does not use `WSAGetLastError()` to report errors, it returns the actual error code directly. That is why `WSAGetLastError()` can return 0 when `getaddrinfo()` returns non-zero. – Remy Lebeau Aug 22 '18 at 19:45
1

I just ran into this problem as well ... getaddrinfo and gethostbyname are both failing with a 11001 error, but ping/nslookup are working for the same host names.

Turns out I had used the symbol server earlier, and I had symbols downloaded for all the Win32 DLL's in the same directory as my executable. Removing all the .pdb directories fixed my problem.

My guess is that gethostbyname or getaddrinfo fail if you have symbols and are debugging the application.

Simon Dugré
  • 17,980
  • 11
  • 57
  • 73
Richard Lyle
  • 325
  • 3
  • 10
0

gethostbyname() will always return WSAHOST_NOT_FOUND (0x11001) if your environment block is empty, or missing SystemRoot.

(At a guess, it is WSAStartup() that actually requires it, but fails silently.)

Nathan Kidd
  • 2,919
  • 21
  • 22
0

libhttp I use getaddrinfo it refer to this link.below ,diff you is hints.ai_family = af;

  int  XX_httplib_inet_pton(int af, const char *src, void *dst, size_t dstlen)
{
    struct addrinfo hints;
    struct addrinfo *res;
    struct addrinfo *ressave;
    int func_ret;
    int gai_ret;

    func_ret = 0;

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = af;

    gai_ret = getaddrinfo(src, NULL, &hints, &res);

    if (gai_ret != 0) {

    /*
    * gai_strerror could be used to convert gai_ret to a string
    * POSIX return values: see
    * http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html
    *
    * Windows return values: see
    * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx
    */
     odprintf("af[%d] getaddrinfo ret[%d] [%d]\n",af,gai_ret,WSAGetLastError());
    return 0;
    }

    ressave = res;

    while (res) {

    if (dstlen >= res->ai_addrlen) {

        memcpy(dst, res->ai_addr, res->ai_addrlen);
        func_ret = 1;
    }
    res = res->ai_next;
    }

    freeaddrinfo(ressave);
    return func_rett;
}  /* XX_httplib_inet_pton */

in my project ,program use success in this way,you could learn more from libhttp.in my program call ,use it ok except proxy or not suppot ipv6 .example call func such as : XX_httplib_inet_pton(AF_INET, "127.0.0.1", &sa->sin, sizeof(sa->sin))

XX_httplib_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))

XX_httplib_inet_pton(AF_INET6, "fe80::f816:3eff:fe49:50c6%6", &sa->sin6, sizeof(sa->sin6))

XX_httplib_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))

XX_httplib_inet_pton(AF_INET6, "::1", &sa->sin6, sizeof(sa->sin6))

XX_httplib_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))

when sock err happend i use

   int eno=  WSAGetLastError();
 char erbuf[40]; 
  FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY,
  NULL,eno,0,erbuf,sizeof(erbuf),NULL);OutputDebugStringA(erbuf);

i use it ok in linux and win10

datrilla
  • 1
  • 1