Что значит «servname не поддерживается для ai_socktype»? (getaddrinfo (C/C++))

Модератор: Модераторы разделов

Аватара пользователя
gluk47
Сообщения: 297
Статус: Любитель гвоздей и микроскопов
ОС: Kubuntu 17.10

Что значит «servname не поддерживается для ai_socktype»?

Сообщение gluk47 »

Добрый день присутствующим.

Я пишу клиентскую программу, связывающуюся через TCP/IP–сеть с сервером.
Время от времени я получаю означенную в заголовке ошибку EAI_SERVICE. Почему так происходит?

Вызов функции выглядит, например, так:

Код: Выделить всё

addrinfo _sock_args;
memset (&_sock_args, 0, sizeof(_sock_args));
_sock_args.ai_family = AF_UNSPEC;
_sock.addr.ai_socktype = SOCK_STREAM;
addrinfo* _sock_addrs;
getaddrinfo("localhost", "7777", &_sock_args, &_sock_adrrs);


В качестве имени передаётся имя из /etc/hosts, имя DNS или имя netbios. Обычно функция успешно возвращает список адресов или EAI_NONAME, если адрес не найден; но иногда появляется именно ошибка EAI_SERVICE. На одной из машин эта ошибка появляется постоянно, и невозможно работать, на соседних машинах из того же сегмента сети эта ошибка появляется исчезающе редко, и достаточно вызвать getaddrinfo ещё один раз (в цикле while, не меняя ни единого параметра), чтобы получить правильный ответ.
На всех компьютерах установлена Ubuntu 10.10 из одного и того же локального зеркала. По задаваемому имени сервера целевую машину можно успешно попинговать со всех компьютеров–клиентов.

С чем может быть связано такое появление ошибки?
[gluk47@gluk47-desktop ~]$ ензу куищще
куищще is aliased to `reboot'
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Что значит «servname не поддерживается для ai_socktype»?

Сообщение /dev/random »

gluk47 писал(а):
31.05.2011 13:41
Вызов функции выглядит, например, так:

Код: Выделить всё

addrinfo _sock_args;
memset (&_sock_args, 0, sizeof(_sock_args));
_sock_args.ai_family = AF_UNSPEC;
_sock.addr.ai_socktype = SOCK_STREAM;
addrinfo* _sock_;addrs
getaddrinfo("localhost", "7777", &_sock_args, &_sock_adrrs);

"например" или точно?

gluk47 писал(а):
31.05.2011 13:41
С чем может быть связано такое появление ошибки?

Эта ошибка означает, что в аргументе "service" либо мусор, либо что-то недоступное для указанного в "hints.ai_socktype" типа сокета. В редких случаях она может быть связана с мусором в структуре "hints".
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Что значит «servname не поддерживается для ai_socktype»?

Сообщение sash-kan »

информация к размышлению: http://www.ducea.com/2006/09/11/error-serv...or-ai_socktype/
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
gluk47
Сообщения: 297
Статус: Любитель гвоздей и микроскопов
ОС: Kubuntu 17.10

Re: Что значит «servname не поддерживается для ai_socktype»?

Сообщение gluk47 »

«Например» значило, что это один из вариантов её вызова, — они логгируются с параметрами в случае сообщения об ошибке.

Дословно это, разумеется, выглядит как-то позапутаннее:

Код: Выделить всё

int r = getaddrinfo(Address.c_str(),
                   helpers::lexical_cast(Port).c_str(),
                   &server_info,
                   &server_address_list[i]);
if (r != 0) {
  cerr << "Произошла ошибка при вызове "
         << "getaddrinfo("
             << Address.c_str() << ", "
             << helpers::lexical_cast(Port).c_str() << ", " << std::hex
             << &server_info <<" ,"
             << &server_address_list[i]) << std::dec
         << "):\n"
         << gai_strerror(r) << "\n";
}


sash-kan писал(а):
31.05.2011 14:00
информация к размышлению: http://www.ducea.com/2006/09/11/error-serv...or-ai_socktype/


Да-да-да, я это уже читал и проверил наличие файлов «/etc/protocols» и «/etc/services».

Но зачем они мне, когда я явно задаю порт числом (переведённым в C-string)?
[gluk47@gluk47-desktop ~]$ ензу куищще
куищще is aliased to `reboot'
Спасибо сказали: