Shammer's Philosophy

My private adversaria

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 について先に調べてみるか。