TCP/IPでは通信相手となるエンドポイントをIPとポートで表す
ほとんどのソケットAPIはネームサービスにアクセスできるようになっている
ネームサーバが利用する情報源はさまざまだが、主なものにDNS(分散データベース)とローカル設定データベースの2つがある
TCP、UDPがデータベースから情報を取得する手順はDNSプロトコルとして定義されている。
### 名前とIPの対応付け
struct hostent *gethostbyname(const char *hostName)
gethostbynameはhostent構造体を返却する
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
}
ResolveName.c
#include <stdio.h> #include <netdb.h> unsigned long ResolveName(char name[]){ struct hostent *host; if((host =gethostbyname(name)) ~~ NULL) { fprintf(stderr, "fethostbyname() failed"); exit(1); } return *((unsigned long *) host->h_addr_list[0]); }
こちらを使用するには次のように書く
echoServAddr.sin_addr.s_addr = ResolveName(servIP);
ip addressからhost nameを取得するには、gethostbyaddr()で取得できる
struct hostent *gethostbyaddr(const char *address, int addressLength, int addressFamily)
### 名前によるサービス情報の検索
struct servent *getservbyname(const char *serviceName, const char *protocol)
servent構造体
struct servent {
char *s_name;
char **s_aliases;
int s_sport;
char *s_proto;
}
#include <stdio.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> unsigned short ResolveService(char service[], char protocol[]){ struct servent *serv; unsigned short port; if((port=atoi(service)) == 0){ if((serv = getservbyname(service, protocol)) == NULL) { fprintf(stderr, "getservbyname() failed"); exit(1); } else { port = htons(port); } return port; } }