Системный вызов Linux: getaddrinfo return -2 - PullRequest
2 голосов
/ 09 декабря 2010

Я использую системный вызов getaddrinfo, и он возвращает -2.Я пытаюсь узнать, что это за ошибка, и понимаю, что это «имя или служба не известна».имя - это мое имя хоста, и я уверен, что оно известно.но служба - это число, которое меняется от запуска к запуску.как узнать, что я ввожу правильный параметр?

мой код:

int GetSockPeerIPs(int sock, AddressList &addresses, int &error,
                  int family, bool zeroport)
{
    struct sockaddr_storage ss;
    socklen_t salen = sizeof(ss);
    struct sockaddr *sa;
    struct addrinfo hints, *paddr, *paddrp;

    sa = (struct sockaddr *)&ss;

    if (getpeername(sock, sa, &salen) != 0) {
        error = errno;
        return -1;
    }

    char hbuf[NI_MAXHOST];
    char pbuf[NI_MAXSERV];
    if (0 != (error = getnameinfo(sa, salen,
                      hbuf, sizeof(hbuf),
                      pbuf, sizeof(pbuf),
                      0))) {
        return -1;
    }

    memset(&hints, 0, sizeof(hints));
    if (ATNetworkTool::AF_XINETX == family) {
        hints.ai_family = PF_UNSPEC;
    } else {
        hints.ai_family = family;
    }
    hints.ai_socktype = SOCK_STREAM;
    if (0 != (error = getaddrinfo(hbuf, pbuf, &hints, &paddrp))) {
        return -1;
    }
    addresses.clear();
    for (paddr = paddrp; paddr; paddr = paddr->ai_next) {
        if (ATNetworkTool::AF_XINETX == family) {
            if (!ATAddress::saIsInet(paddr->ai_addr)) {
                continue;
            }
        }
        if (zeroport) {
            addresses.insert(ATAddress(paddr->ai_addr, 0));
        } else {
            addresses.insert(paddr->ai_addr);
        }
    }
    freeaddrinfo(paddrp);
    return 0;
}

спасибо!Gln

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

У вас есть код ошибки. Думали ли вы узнать, что это значит? По этому случаю я сделал это для вас. Но вот что я сделал, чтобы в следующий раз вы могли сами это проверить.

Просматривая справочную страницу для getaddrinfo () Я обнаружил, что она может вернуть несколько кодов ошибок, например, EAI_AGAIN. Числовые значения будут определены где-то в заголовочном файле, поэтому я сделал

cd /usr/include
find . -name "*.h" -exec grep -l EAI_AGAIN {} \;

Это идентифицированный netdb.h. Итак, я открыл это в vi, и вот что он сказал:

# define EAI_BADFLAGS     -1    /* Invalid value for `ai_flags' field.  */
# define EAI_NONAME       -2    /* NAME or SERVICE is unknown.  */
# define EAI_AGAIN        -3    /* Temporary failure in name resolution.  */
# define EAI_FAIL         -4    /* Non-recoverable failure in name res.  */
# define EAI_FAMILY       -6    /* `ai_family' not supported.  */
# define EAI_SOCKTYPE     -7    /* `ai_socktype' not supported.  */
# define EAI_SERVICE      -8    /* SERVICE not supported for `ai_socktype'.  */
# define EAI_MEMORY       -10   /* Memory allocation failure.  */
# define EAI_SYSTEM       -11   /* System error returned in `errno'.  */
# define EAI_OVERFLOW     -12   /* Argument buffer overflow.  */

Так что, по сути, имя или служба, которую вы передаете, неизвестна для getaddrinfo. Я бы проверил, являются ли первые два параметра разумными, если бы я был вами.

0 голосов
/ 01 ноября 2011

getaddrinfo требователен к формату данных, при разборе файлов конфигурации убедитесь, что у вас нет лишних пробелов, обычно заканчивающихся пробелами в параметре имени хоста, или вы получите эту ошибку, в этом случае ошибка верна, просто не очень информативно.

...