getaddrinfo sample_Debug
getaddrinfo sample_alpha - Shammerismの実行結果を見ていて、ai_addr が 0.0.0.0 になっているのは af_family が 30 の場合のようだ。ai_family を意識してネット検索して、getaddrinfo.cというサンプルを見つけた。自分のサンプルとの大きな違いは、
- ai_family で条件分岐している
- inet_ntoaでなくinet_ntopを使用している
という点だ。とりあえず、自分のサンプルも同様にしてみる。
#include <arpa/inet.h> // for inet_ntoa #include <err.h> // for errx #include <netdb.h> // for addrinfo, getaddrinfo, freeaddrinfo #include <stdio.h> #include <string.h> // for memset #include <unistd.h> // for close int main(int argc, char *args[]){ if( argc == 2 ){ // Local values struct addrinfo hints, *res, *res0; struct sockaddr_in *res_addr_v4; struct sockaddr_in6 *res_addr_v6; int error; // Reset hint memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; // Get addrinfor and error check error = getaddrinfo(args[1], NULL, &hints, &res0); if (error) { errx(1, "%s", gai_strerror(error)); } // Display addrinfo contents int i = 0; for (res = res0 ; res ; res = res->ai_next) { printf("========== addrinfo[%d] ==========\n", i); printf("ai_flags:%d\n", res->ai_flags); printf("ai_family:%d\n", res->ai_family); printf("ai_socktype:%d\n", res->ai_socktype); printf("ai_protocol:%d\n", res->ai_protocol); printf("ai_addrlen:%d\n", res->ai_addrlen); switch(res->ai_family){ case AF_INET: res_addr_v4 = (struct sockaddr_in *)res->ai_addr; printf("ai_addr:%s\n", inet_ntop(res_addr_v4->sin_addr)); break; case AF_INET6: res_addr_v6 = ((struct sockaddr_in6 *)res->ai_addr); printf("ai_addr:%s\n", inet_ntop(res_addr_v6->sin6_addr)); break; } printf("==================================\n"); i++; } freeaddrinfo(res0); } else { printf("Usage: %s $HOST_NAME(not IP address)\n", args[0]); } return 0; }
コンパイルエラーを解消しつつ、上記実装までこぎつけたものの、未だに以下のエラーが出る。
$ gcc getaddrinfo-sample.c getaddrinfo-sample.c:47:57: error: too few arguments to function call, expected 4, have 1 printf("ai_addr:%s\n", inet_ntop(res_addr_v4->sin_addr)); ~~~~~~~~~
どうやら、引数は4つらしい。inet_ntop について先に調べてみるか。