nslookup sample C version
Shammerismの内容をベースに
C 言語版の簡易 nslookup を書いてみた。
#include <arpa/inet.h> #include <err.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc, char *args[]){ if( argc == 2 ){ // Local values struct addrinfo hints, *res, *res0; int error; char addrstr[100]; void *ptr; // 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("Hostname %s 's IP address is :", args[1]); switch(res->ai_family){ case AF_INET: ptr = &(((struct sockaddr_in *)res->ai_addr)->sin_addr); inet_ntop(res->ai_family, ptr, addrstr, sizeof(addrstr)); printf("%s. (IPv4)\n", addrstr); break; case AF_INET6: ptr = &(((struct sockaddr_in6 *)res->ai_addr)->sin6_addr); inet_ntop(res->ai_family, ptr, addrstr, sizeof(addrstr)); printf("%s. (IPv6)\n", addrstr); break; } i++; } freeaddrinfo(res0); } else { printf("Usage: %s $HOST_NAME(not IP address)\n", args[0]); } return 0; }
基本的に動作するのは確認できたが、DNS 登録されていない自身のホスト名とかを
指定しても loopback しか取得できなかった。でも名前解決できるホストなら
IP を取得できた。この実装はHTTP Client ver 0.1 - Shammerismに組み込むためのものだが、
その用途としては十分だろう。