データベースAPIを使って初めてのソケットAPIをつかったプログラムを作ります。
ここでは、IPv4/IPv6両方で使えるAPIを使用します 参考文書:RFC3493 Basic Socket Interface Extensions for IPv6
(*)ネットワークプログラムに関する情報はRFC(Request For Comments )で 世界中で共有されています。 https://datatracker.ietf.org/ で調べることができます。 RFC3493を入力して、検索するとここで使用するAPIをはじめとする 情報が記述されている文書が表示されます。
このプログラムで使用するAPIは次のものです
(*)gethostbynameなどのIPv4でしか使えないAPIは使用しません。
int gethostname(char *name, size_t len); 現在のプロセッサのホスト名の取得
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); インターネットのホスト(node)とサービス(service)を渡すと、一つ以上の addrinfo 構造体(リストになっています)を返します。 それぞれの addrinfo 構造体には、 bind や connect を呼び出す際に 指定できるインターネットアドレスが格納されています
【addrinfo 構造体】 struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST,… int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM,… int ai_protocol; // 0 or IPPROTO_xxx socklen_t ai_addrlen; // ai_addrの長さ struct sockaddr *ai_addr; // アドレス(バイナリ)へのポインター char *ai_canonname; // ホストの公式な名前 struct addrinfo *ai_next; // 次の情報へのポインタ };
void freeaddrinfo(struct addrinfo *res); getaddrinfoで動的に割り当てられたリスト res メモリーを解放します int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags); プロトコルに依存しないかたちで ソケットアドレスから対応するホスト名と サービスを取得します