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