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 の部分をいろいろ変更することでも動作は変わってくるようだ。