11001 возвращается на все вызовы getaddrinfo () - PullRequest
6 голосов
/ 24 января 2011

Возникла проблема с подключением к устройству в моей сети.Всякий раз, когда я вызываю getaddrinfo (), он возвращает 11001. Я проверял это с многочисленными разными IP-адресами в строке IP_ADDRESS (Global Var).Я проверил все нерабочие номера с помощью nslookup, и большинство из них существует там.

getaddrinfo-Return-Always-11001-Host-Not-Found , кажется, задает аналогичный вопрос, но ответа там нет.

В данный момент мой код даже не пытается подключиться к удаленному устройству, просто пытается определить IP.Как только это сработает, я могу перейти к более сложным и сложным задачам.

Реализация:

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;}

Большая часть этого кода была взята с сайта MSDN, но похоже, что всевыглядит хорошо.

Ответы [ 3 ]

2 голосов
/ 24 января 2011

Это код ошибки для хоста не найден.Посмотри в WinSock2.h.Ищите WSABASEERR+1001 или WSAHOST_NOT_FOUND

Microsoft сообщает вам здесь какие коды ошибок getaddrinfo возвращает.

1 голос
/ 07 мая 2012

Я только что столкнулся с этой проблемой ... getaddrinfo и gethostbyname оба с ошибкой 11001, но ping / nslookup работают для тех же имен хоста.

Оказывается, я раньше использовал сервер символов, и у меня были загружены символы для всех библиотек DLL Win32 в том же каталоге, что и мой исполняемый файл. Удаление всех каталогов .pdb устранило мою проблему.

Я предполагаю, что gethostbyname или getaddrinfo не удастся, если у вас есть символы и вы отлаживаете приложение.

0 голосов
/ 22 августа 2018

gethostbyname() всегда будет возвращать WSAHOST_NOT_FOUND (0x11001), если ваш блок среды пуст или отсутствует SystemRoot.

(По-видимому, WSAStartup() действительно требует этого, но молча терпит неудачу.)

...