11001 returned on all calls to getaddrinfo()

14,467

Solution 1

That's the error code for host not found. Look in WinSock2.h. Search for WSABASEERR+1001 or WSAHOST_NOT_FOUND

Microsoft tells you here what error codes getaddrinfo returns.

Solution 2

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.

Share:
14,467
Shocklanced
Author by

Shocklanced

Updated on July 23, 2022

Comments

  • Shocklanced
    Shocklanced almost 2 years

    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.

  • Keith
    Keith over 13 years
    Systems programming 101: Read the documentation and take a minute to explicitly handle and report all the allowed return codes.
  • JimR
    JimR over 13 years
    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...
  • Shocklanced
    Shocklanced about 13 years
    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
    Shocklanced about 13 years
    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?
  • JimR
    JimR about 13 years
    What's in <Windows>\System32\Drivers\etc\hosts?
  • Remy Lebeau
    Remy Lebeau over 5 years
    @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.