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;
}
}