Я использую getaddrinfo в своей примерной программе, чтобы перевести имя хоста на адрес. Но он не работает с этой ошибкой "Запрашиваемое имя действительно, но никаких данных запрашиваемого типа не найдено".
Образец кода:
struct addrinfo hints, *save_res= 0, *res= 0;
int gai_rc;
char host[] = "localhost";
char port[] = "3333";
/* set hints for getaddrinfo */
ZeroMemory( &hints, sizeof(hints) );
hints.ai_protocol= IPPROTO_TCP; /* TCP connections only */
hints.ai_family= AF_UNSPEC; /* includes: IPv4, IPv6 or hostname */
hints.ai_socktype= SOCK_STREAM;
/* Get the address information for the server using getaddrinfo() */
gai_rc= getaddrinfo(host, port, &hints, &res);
if (gai_rc != 0)
{
printf("getaddrinfo failed with error: %d - %s\n", gai_rc, gai_strerrorA(gai_rc));
return false;
}
printf("success");
Из документации MSDN: WSANO_DATA 11004 Допустимое имя, нет данных о запрошенном типе. Запрошенное имя является допустимым и было найдено в базе данных, но для него не установлены соответствующие связанные данные. Обычный пример для этого - попытка перевода имени узла в адрес (с использованием gethostbyname или WSAAsyncGetHostByName), которая использует DNS (Domain Name Server). Запись MX возвращается, но нет записи A, указывающей, что сам хост существует, но недоступен непосредственно.
Может кто-нибудь, пожалуйста, предположите, почему он дает эту ошибку для locahost. Я не могу понять, в чем проблема.
У меня была такая же проблема, попробуйте удалить:
hints.ai_protocol= IPPROTO_TCP;
это не повлияет на желаемые результаты, поскольку:
hints.ai_socktype= SOCK_STREAM;
говорит ему выбирать только tcp-соединения. Возможно, вы также можете использовать только первый, но я не проверял его.