В этом утверждении i
никогда не изменяется в теле l oop, и, поскольку оно не инициализировано, оно никогда даже не входит в l oop:
for(i=res; i!=0; res=res->ai_next)
{
printf("%s\n", res->ai_addr->sa_data);
}
Кроме того, вы пропустить несколько других частей. Следующие шаги являются частью полного примера, связанного ниже:
Создайте следующие экземпляры struct addrinfo
:
struct addrinfo *result = NULL;
struct addrinfo *ptr = NULL;
struct addrinfo hints;
Затем инициализируйте Winsock
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
Настройте hints address info
структура
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
Звоните getaddrinfo
dwRetval = getaddrinfo(argv[1], argv[2], &hints, &result);
if ( dwRetval != 0 ){//handle error}
Теперь, например, исходя из вышеизложенного, ваш l oop будет выглядеть так:
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {//
Ввод "www.google.com" 0 в командной строке для полного примера (ссылка ниже) будет выглядеть примерно так:
![enter image description here](https://i.stack.imgur.com/bPTXc.jpg)
Это полное Windows пример здесь . Примечание : ошибка в коде, то есть ptr-> ai_cannonname может быть нулевой с "www.google.com", поэтому перед вызовом измените эту строку для проверки:
if(ptr->ai_canonname) printf("\tCanonical name: %s\n", ptr->ai_canonname);
Полный Linux пример здесь .