Shammer's Philosophy

My private adversaria

getnameinfo-sample

getnameinfo-sample_beta - Shammerismの実装では、サービスが 0 になってしまうと思っていたが、単純なミスだった。getaddrinfo の第二引数を NULL にしていたことが原因。この点を修正してうまくいった。最終バージョンは以下。

#include <arpa/inet.h>
#include <err.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* args[]){
    if( argc == 3 ){
	// man getnameinfo sample
	// struct sockaddr *sa;    /* input */
	// char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
	//
	// if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
	//     errx(1, "could not get numeric hostname");
	// }
	// printf("host=%s, serv=%s\n", hbuf, sbuf);
	struct addrinfo hints, *res, *res0;
	int error;
	char addrstring[100];
	void *ptr;
	char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = PF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;

	error = getaddrinfo(args[1], args[2], &hints, &res0);
	if( error ) {
	    errx(1, "%s\n", gai_strerror(error));
	}
	for( res = res0 ; res != NULL ; res = res->ai_next) {
	    getnameinfo((struct sockaddr *)res->ai_addr,
			res->ai_addrlen,
			hbuf,
			sizeof(hbuf),
			sbuf,
			sizeof(sbuf),
			NI_NUMERICHOST | NI_NUMERICSERV);
	    printf("host=%s, serv=%s\n", hbuf, sbuf);
	}
	if( res != NULL ){
	    freeaddrinfo(res);
	}
    }
    else {
	printf("Usage: %s $IP_ADDRESS $PORT\n", args[0]);
    }
    return 0;
}

実行結果は以下。

$ ./a.out 127.0.0.1 80
host=127.0.0.1, serv=80
$ ./a.out 127.0.0.1 123
host=127.0.0.1, serv=123
$

getnameinfo の引数、NI_NUMERICHOST | NI_NUMERICSERV の部分をいろいろ変更することでも動作は変わってくるようだ。