C    IPv4 および IPv6 のソケット・プログラムの例

この付録では,クライアント/サーバ・プログラムの例として,注釈付きのファイルを記載します。 クライアントはサーバに要求を送り,サーバからの応答を出力します。 サーバはクライアントからの要求をリッスンし,要求を出力して,応答をクライアントに送ります。

このプログラムは実際に使用されているアプリケーションではありませんが,各種のソケット呼び出しのシーケンスと使用方法を示すように構成されています。

情報は,次のように編成されています。

これらのプログラムと,これらのクライアント・プログラムのプロトコル非依存バージョンが,/usr/examples/ipv6/network_programming ディレクトリにあります。 この付録では,これらのプログラムの出力例も記載しています。

C.1    AF_INET ソケットを使用するプログラム

この節には,AF_INET ソケットを使用するクライアントおよびサーバ・プログラムを記載します。

C.1.1    AF_INET ソケットを使用するクライアント・プログラム

例 C-1 は,ユーザのシステムで作成,コンパイル,実行が可能なクライアント・プログラムの例を示しています。 このプログラムは,コマンド行で指定したシステムに要求を送信し,そこから応答を受信します。

例 C-1:  クライアント・スタブ・ルーチン

/*
 * *****************************************************************
 * *                                                               *
 * *    Copyright (c) Compaq Computer Corporation, 2000            *
 * *                                                               *
 * *   The software contained on this media  is  proprietary  to   *
 * *   and  embodies  the  confidential  technology  of  Compaq    *
 * *   Computer  Corporation.  Possession, use,  duplication  or   *
 * *   dissemination of the software and media is authorized only  *
 * *   pursuant to a valid written license from Compaq Computer    *
 * *   Corporation.                                                *
 * *                                                               *
 * *   RESTRICTED RIGHTS LEGEND   Use, duplication, or disclosure  *
 * *   by the U.S. Government is subject to restrictions  as  set  *
 * *   forth in Subparagraph (c)(1)(ii)  of  DFARS  252.227-7013,  *
 * *   or  in  FAR 52.227-19, as applicable.                       *
 * *                                                               *
 * *****************************************************************
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <arpa/inet.h>
 
#define SERVER_PORT	7639
#define CLIENT_PORT	7739
 
#define MAXBUFSIZE 4096
 
int main (
    int argc,
    char **argv )
{
    int             s;
    char            databuf[MAXBUFSIZE];
    int             dcount;
    struct sockaddr_in     serveraddr; [1]
    struct sockaddr_in     clientaddr;
    int             serveraddrlen;
    const char      *ap;
    const char      *request = "this is the client's request";
    struct hostent  *hp;
    char            *server;
 
    if (argc < 2) {
        printf("Usage: client <server>\n");
        exit(1);
    }
    server = argv[1];
 
    bzero((char *) &serveraddr, sizeof(struct sockaddr_in)); [2]
    serveraddr.sin_family = AF_INET;
    if ((hp = gethostbyname(server)) == NULL) {  [3]
        printf("unknown host: %s\n", server);
        exit(2);
    }
    serveraddr.sin_port = htons(SERVER_PORT);
 
    while (hp->h_addr_list[0] != NULL) {
        if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { [4]
            perror("socket");
            exit(3);
        }
        memcpy(&serveraddr.sin_addr.s_addr, hp->h_addr_list[0],
                         hp->h_length);
 
        if (connect(s, (struct sockaddr *)&serveraddr, 
                          sizeof(serveraddr)) < 0) { [5]
            perror("connect");
            close(s);
            hp->h_addr_list++;
            continue;
        }
        break;
    }
    if (send(s, request, strlen(request), 0) < 0) { [6]
        perror("send");
        exit(5);
    }
    dcount = recv(s, databuf, sizeof(databuf), 0); [7]
    if (dcount < 0) {
        perror("recv");
        exit(6);
    }
    databuf[dcount] = '\0';
 
    hp = gethostbyaddr((char *)&serveraddr.sin_addr.s_addr, [8]
        sizeof(serveraddr.sin_addr.s_addr), AF_INET);
    ap = inet_ntoa(serveraddr.sin_addr);  [9]
    printf("Response received from");
    if (hp != NULL)
        printf(" %s", hp->h_name);
    if (ap != NULL)
        printf(" (%s)", ap);
    printf(": %s\n", databuf);
 
    close(s);
}
 
 

  1. sockaddr_in 構造体を宣言する。 この型の構造体の使用は,ソケット (AF_INET) の通信ドメインにより指示され,これによって通信に IPv4 プロトコルが使用されます。 [例に戻る]

  2. サーバ・アドレスをクリアし,サーバ変数を設定する。 IPv4 通信のソケット・アドレスは,32 ビット・インターネット・アドレスと 16 ビットのポート番号からなります。 このアドレスは,サーバのインターネット・アドレスとサーバがリッスンするポート番号になります。 [例に戻る]

  3. サーバの IPv4 アドレスを取得する。 gethostbyname の呼び出しでは,IPv4 アドレスのみが返されます。 [例に戻る]

  4. socket 呼び出しで AF_INET ソケットを作成する。 TCP またはコネクション指向型通信用にソケット・タイプ SOCK_STREAM を指定しています。 [例に戻る]

  5. serveraddr という名前の sockaddr_in 構造体内のアドレスを使用して,サーバに接続する。 [例に戻る]

  6. サーバに要求を送信する。 [例に戻る]

  7. サーバから応答を受信する。 [例に戻る]

  8. serveraddr という名前の sockaddr_in 構造体内のアドレスを使用して,サーバ名を取り出す。 gethostbyaddr 呼び出しは,入力として IPv4 アドレスを期待しています。 [例に戻る]

  9. サーバの 32 ビット IPv4 アドレスを,ドット表記のインターネット・アドレス・テキスト文字列に変換する。 inet_ntoa 呼び出しは,入力として IPv4 アドレスを期待しています。 [例に戻る]

C.1.2    AF_INET ソケットを使用するサーバ・プログラム

例 C-2 は,ユーザのシステムで作成,コンパイル,実行が可能なサーバ・プログラムの例を示しています。 このプログラムは他のシステムで稼働しているクライアント・プログラムから要求を受信し,応答を送信します。

例 C-2:  サーバ・スタブ・ルーチン

/*
 * *****************************************************************
 * *                                                               *
 * *    Copyright (c) Compaq Computer  Corporation, 2000           *
 * *                                                               *
 * *   The software contained on this media  is  proprietary  to   *
 * *   and  embodies  the  confidential  technology  of  Compaq    *
 * *   Computer  Corporation.  Possession, use,  duplication  or   *
 * *   dissemination of the software and media is authorized only  *
 * *   pursuant to a valid written license from Compaq Computer    *
 * *   Corporation.                                                *
 * *                                                               *
 * *   RESTRICTED RIGHTS LEGEND   Use, duplication, or disclosure  *
 * *   by the U.S. Government is subject to restrictions  as  set  *
 * *   forth in Subparagraph (c)(1)(ii)  of  DFARS  252.227-7013,  *
 * *   or  in  FAR 52.227-19, as applicable.                       *
 * *                                                               *
 * *****************************************************************
 */
 
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <arpa/inet.h>
 
#define SERVER_PORT	7639
#define CLIENT_PORT	7739
 
#define MAXBUFSIZE 4096
 
int main (
    int argc,
    char **argv )
{
    int             s;
    char            databuf[MAXBUFSIZE];
    int             dcount;
    struct sockaddr_in    serveraddr; [1]
    struct sockaddr_in    clientaddr;
    int                   clientaddrlen;
    struct hostent        *hp;
    const char            *ap;
    const char            *response = "this is the server's response";
    u_short               port;
 
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { [2]
        perror("socket");
        exit(1);
    }
 
    bzero((char *) &serveraddr, sizeof(struct sockaddr_in)); [3]
    serveraddr.sin_family      = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); [4]
    serveraddr.sin_port        = htons(SERVER_PORT);
 
    if (bind(s, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { [5]
        perror("bind");
        exit(2);
    }
    if (listen(s, SOMAXCONN) < 0) { [6]
        perror("Listen");
        close(s);
        exit(3);
 
    while (1) {
        int new_s;
        clientaddrlen = sizeof(clientaddr);
        new_s = accept(s, (struct sockaddr *)&clientaddr, &clientaddrlen); [7]
 
        dcount = recv(new_s, databuf, sizeof(databuf), 0); [8]
        if (dcount <= 0) {
            perror("recv");
            close(new_s);
            continue;
        }
        databuf[dcount] = '\0';
        hp = gethostbyaddr((char *)&clientaddr.sin_addr.s_addr, [9]
            sizeof(clientaddr.sin_addr.s_addr), AF_INET);
        ap = inet_ntoa(clientaddr.sin_addr); [10]
        port = ntohs(clientaddr.sin_port);
        printf("Request received from");
        if (hp != NULL)
            printf(" %s", hp->h_name);
        if (ap != NULL)
            printf(" (%s)", ap);
        printf(" port %d \"%s\"\n", port, databuf);
 
        if (send(new_s, response, strlen(response), 0) < 0) { [11]
            perror("send");
            close(new_s);
            continue;
        }
        close(new_s);
    }
    close(s);
}
 
 

  1. sockaddr_in 構造体を宣言する。 この型の構造体の使用は,ソケット (AF_INET) の通信ドメインにより指示され,これによって通信に IPv4 プロトコルが使用されます。 [例に戻る]

  2. AF_INET ソケットを作成する。 TCP またはコネクション指向型通信用にソケット・タイプ SOCK_STREAM を指定しています。 [例に戻る]

  3. サーバ・アドレスをクリアし,サーバ変数を設定する。 IPv4 通信のソケット・アドレスは,32 ビット・インターネット・アドレスと 16 ビットのポート番号からなります。 このアドレスは,サーバのインターネット・アドレスとサーバがリッスンするポート番号になります。 [例に戻る]

  4. サーバ・アドレスに,IPv4 ワイルドカード・アドレス INADDR_ANY を設定する。 このアドレスは,システム上に実装されている任意のネットワーク・インタフェースを指定します。 [例に戻る]

  5. サーバのアドレスを,AF_INET ソケットにバインドする。 [例に戻る]

  6. ソケット上でコネクションをリッスンする。 サーバは,以前の accept 呼び出しの処理が終わるまで,最大 SOMAXCONN 個の保留コネクションをキューイングします。 ソケット・サブシステムのカーネル属性についての詳細は, sys_attrs_socket(5) を参照してください。 [例に戻る]

  7. このソケット上のコネクションを受け付ける。 accept 呼び出しはクライアントのアドレスを,clientaddr という名前の sockaddr_in 構造体に格納します。 [例に戻る]

  8. データをクライアントから受信する。 [例に戻る]

  9. clientaddr という名前の sockaddr_in 構造体内のアドレスを使用して,クライアント名を取り出す。 gethostbyaddr 呼び出しは,入力として IPv4 アドレスを期待しています。 [例に戻る]

  10. サーバの 32 ビットの IPv4 アドレスを,ドット表記のインターネット・アドレス・テキスト文字列に変換する。 inet_ntoa 呼び出しは,入力として IPv4 アドレスを期待しています。 [例に戻る]

  11. クライアントに応答を送信する。 [例に戻る]

C.2    AF_INET6 ソケットを使用するプログラム

この節には,AF_INET6 ソケットを使用するクライアントおよびサーバ・プログラムを記載します。

C.2.1    AF_INET6 ソケットを使用するクライアント・プログラム

例 C-3 は,ユーザのシステムで作成,コンパイル,実行が可能なクライアント・プログラムの例を示しています。 このプログラムは,コマンド行で指定したシステムに要求を送信し,そこから応答を受信します。 すべてのアドレスは,IPv6 アドレス・フォーマットです。

例 C-3:  クライアント・スタブ・ルーチン

/*
 * *****************************************************************
 * *                                                               *
 * *    Copyright (c) Compaq Computer Corporation, 2000            *
 * *                                                               *
 * *   The software contained on this media  is  proprietary  to   *
 * *   and  embodies  the  confidential  technology  of  Compaq    *
 * *   Computer Corporation.  Possession, use,  duplication  or    *
 * *   dissemination of the software and media is authorized only  *
 * *   pursuant to a valid written license from Compaq Computer    *
 * *   Corporation.                                                *
 * *                                                               *
 * *   RESTRICTED RIGHTS LEGEND   Use, duplication, or disclosure  *
 * *   by the U.S. Government is subject to restrictions  as  set  *
 * *   forth in Subparagraph (c)(1)(ii)  of  DFARS  252.227-7013,  *
 * *   or  in  FAR 52.227-19, as applicable.                       *
 * *                                                               *
 * *****************************************************************
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <arpa/inet.h>
 
#define SERVER_PORT	7639
#define CLIENT_PORT	7739
 
#define MAXBUFSIZE 4096
 
int main (
    int argc,
    char **argv )
{
    int             s;
    char            databuf[MAXBUFSIZE];
    int             dcount;
    struct addrinfo *server_info; [1]
    struct addrinfo *cur_info;
    struct addrinfo hints;
    struct sockaddr_in6    serveraddr; [2]
    char            addrbuf[INET6_ADDRSTRLEN];
    char            node[MAXDNAME];
    char            service[MAXDNAME];
    int             ni;
    int             err;
    int             serveraddrlen;
    const char      *request = "this is the client's request";
    char            *server;
 
    if (argc < 2) {
        printf("Usage: client <server>\n");
        exit(1);
    }
    server = argv[1];
    bzero((char *) &hints, sizeof(hints)); [3]
    hints.ai_family = AF_INET6;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED;
 
    sprintf(service, "%d", SERVER_PORT);
 
    err = getaddrinfo(server, service, &hints, &server_info);  [4]
    if (err != 0) {
        printf("%s\n", gai_strerror(err));
            if (err == EAI_SYSTEM)
                perror("getaddrinfo");
            exit(2);
    }
    cur_info = server_info;
 
    while (cur_info != NULL) {
        if ((s = socket(cur_info->ai_family, cur_info->ai_socktype, 0)) < 0) { [5]
            perror("socket");
            freeaddrinfo(server_info);
            exit(3);
        }
        if (connect(s, cur_info->ai_addr, cur_info->ai_addrlen) <0 {  [6]
            close(s);
            cur_info = cur_info->ai_next;
            continue;
        }
        break;
    }
    freeaddrinfo(server_info); [7]
 
    if (send(s, request, strlen(request), 0) < 0) { [8]
        perror("send");
        exit(5);
    }
    dcount = recv(s, databuf, sizeof(databuf), 0); [9]
    if (dcount < 0) {
        perror("recv");
        exit(6);
    }
    databuf[dcount] = '\0';
    serveraddrlen = sizeof(serveraddr);
    if (getpeername(s, (struct sockaddr*) &serveraddr, &serveraddrlen) < 0) { [10]
        perror("getpeername");
        exit(7);
    }
    printf("Response received from");
    ni = getnameinfo((struct sockaddr*)&serveraddr, serveraddrlen, [11]
                        node, sizeof(node), NULL, 0, NI_NAMEREQD);
    if (ni == 0)
        printf(" %s", node);
    ni = getnameinfo((struct sockaddr*)&serveraddr, serveraddrlen, [12]
                        addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST);
    if (ni == 0)
        printf(" (%s)", addrbuf);
 
    printf(": %s\n", databuf);
 
    close(s);
}
 
 

  1. addrinfo 構造体と hints 構造体を宣言する。 [例に戻る]

  2. sockaddr_in6 構造体を宣言する。 この型の構造体の使用は,ソケット (AF_INET6) の通信ドメインにより指示され,これによって通信に IPv6 プロトコルが使用されます。 プロトコルに依存しないプログラムを作成したい場合は,sockaddr_storage 構造体を宣言します。 [例に戻る]

  3. アドレス文字列バッファ,ノード名文字列バッファ,サービス名文字列バッファ,エラー番号変数,サービス・アドレス長変数を宣言する。 [例に戻る]

  4. hints 構造体をクリアし,hints 変数を設定する。 hints 構造体には,getaddrinfo の処理を指定する値が格納されています。 この場合,AF_INET6 により IPv6 アドレスが返されます。 IPv6 アドレスが構成されている場合,AI_ADDRCONFIG 値および AI_V4MAPPED 値により AAA レコードが返されます。 また,IPv6 アドレスがない場合,IPv4 アドレスが構成されていれば,A レコードが返されます。 hints 構造体の値についての詳細は, getaddrinfo(3) を参照してください。 [例に戻る]

  5. サーバ・アドレスを取得する。 getaddrinfo を呼び出すと,1 つ以上の addrinfo 型の構造体で,IPv6 フォーマットのアドレスが返されます。 [例に戻る]

  6. AF_INET6 ソケットを作成する。 ソケット・タイプは,addrinfo 構造体で指定します。 [例に戻る]

  7. cur_info という名前の addrinfo 構造体内のアドレスを使用して,サーバに接続する。 [例に戻る]

  8. すべての addrinfo 構造体を解放する。 [例に戻る]

  9. サーバに要求を送信する。 [例に戻る]

  10. サーバから応答を受信する。 [例に戻る]

  11. コネクションの他端にあるピア・ソケットのアドレスを取得し,そのアドレスを serverinfo という名前の sockaddr_in6 構造体に格納する。 [例に戻る]

  12. serveraddr という名前の sockaddr_in6 構造体内のアドレスを使用して getnameinfo を呼び出し,サーバ名を取得する。 NI_NAMEREQD フラグは,このルーチンが,指定されたアドレスのホスト名を返すように指示しています。 [例に戻る]

  13. serveraddr という名前の sockaddr_in6 構造体内のアドレスを使用して getnameinfo を呼び出し,サーバの数値アドレスを取得する。 NI_NUMERICHOST フラグは,このルーチンが,指定されたアドレスのアドレス値を返すように指示しています。 [例に戻る]

C.2.2    AF_INET6 ソケットを使用するサーバ・プログラム

例 C-4 は,ユーザのシステムで作成,コンパイル,実行が可能なサーバ・プログラムの例を示しています。 このプログラムは他のシステムで稼働しているクライアント・プログラムから要求を受信し,応答を送信します。

例 C-4:  サーバ・スタブ・ルーチン

/*
 * *****************************************************************
 * *                                                               *
 * *    Copyright (c) Compaq Computer Corporation, 2000            *
 * *                                                               *
 * *   The software contained on this media  is  proprietary  to   *
 * *   and  embodies  the  confidential  technology  of  Compaq    *
 * *   Computer Corporation.  Possession, use,  duplication  or    *
 * *   dissemination of the software and media is authorized only  *
 * *   pursuant to a valid written license from Compaq Computer    *
 * *   Corporation.                                                *
 * *                                                               *
 * *   RESTRICTED RIGHTS LEGEND   Use, duplication, or disclosure  *
 * *   by the U.S. Government is subject to restrictions  as  set  *
 * *   forth in Subparagraph (c)(1)(ii)  of  DFARS  252.227-7013,  *
 * *   or  in  FAR 52.227-19, as applicable.                       *
 * *                                                               *
 * *****************************************************************
 */
 
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <arpa/inet.h>
 
#define SERVER_PORT	7639
#define CLIENT_PORT	7739
 
#define MAXBUFSIZE 4096
 
int main (
    int argc,
    char **argv )
{
    int             s;
    char            databuf[MAXBUFSIZE];
    int             dcount;
    struct sockaddr_in6       serveraddr; [1]
    struct sockaddr_storage   clientaddr; [2]
    char                      addrbuf[INET6_ADDRSTRLEN];
    char                      node[MAXDNAME];
    char                      port[MAXDNAME];
    int                       err;
    int                       ni;
    int                       clientaddrlen;
    const char                *response = "this is the server's response";
 
    if ((s = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { [3]
        perror("socket");
        exit(1);
    }
 
    bzero((char *) &serveraddr, sizeof(struct sockaddr_in6)); [4]
    serveraddr.sin6_family      = AF_INET6;
    serveraddr.sin6_addr        = in6addr_any;
    serveraddr.sin6_port        = htons(SERVER_PORT);
 
    if (bind(s, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { [5]
        perror("bind");
        exit(2);
    }
    if (listen(s, SOMAXCONN) < 0) {  [6]
        perror("listen");
        close(s);
        exit(3);
    }
    while (1) {
        int new_s;
        clientaddrlen = sizeof(clientaddr);
        bzero((char *)&clientaddr, clientaddrlen); [7]
        new_s = accept(s, (struct sockaddr*)&clientaddr, &clientaddrlen); [8]
 
        if (new_s < 0) {
            perror("accept");
            continue;
        }
        dcount = recv(new_s, databuf, sizeof(databuf), 0); [9]
        if (dcount < 0) {
            perror("recv");
            close(new_s);
            continue;
        }
        databuf[dcount] = '\0';
 
        printf("Request received from");
        ni = getnameinfo((struct sockaddr *)&clientaddr, [10]
            clientaddrlen, node, sizeof(node), NULL, 0, NI_NAMEREQD);
        if (ni == 0)
            printf(" %s", node);
        ni = getnameinfo((struct sockaddr *)&clientaddr, [11]
            clientaddrlen, addrbuf, sizeof(addrbuf), port, sizeof(port),
            NI_NUMERICHOST|NI_NUMERICSERV);
        if (ni == 0)
            printf(" (%s) port %d", addrbuf, port);
        printf(" \"%s\"\n", port, databuf);
        if (send(new_s, response, strlen(response), 0) < 0) { [12]
            perror("send");
            close(new_s);
            continue;
        }
        close(new_s);
    }
    close(s);
}
 
 

  1. serveraddr という名前の sockaddr_in6 構造体を宣言する。 この型の構造体の使用は,ソケット (AF_INET6) の通信ドメインにより指示され,これによって通信に IPv6 プロトコルが使用されます。 [例に戻る]

  2. clientaddr という名前の sockaddr_storage 構造体を宣言する。 この型の構造体を使用すると,プログラムをプロトコル非依存にすることができます。 [例に戻る]

  3. AF_INET6 ソケットを作成する。 TCP またはコネクション指向型通信用にソケット・タイプ SOCK_STREAM を指定しています。 [例に戻る]

  4. サーバ・アドレスをクリアし,サーバ変数を設定する。 [例に戻る]

  5. サーバのアドレスを,AF_INET ソケットにバインドする。 [例に戻る]

  6. ソケット上でコネクションをリッスンする。 サーバは,以前の accept 呼び出しの処理が終わるまで,最大 SOMAXCONN 個の保留コネクションをキューイングします。 ソケット・サブシステムのカーネル属性についての詳細は, sys_attrs_socket(5) を参照してください。 [例に戻る]

  7. クライアント・アドレスをクリアする。 [例に戻る]

  8. このソケット上のコネクションを受け付ける。 accept 呼び出しは,クライアントのアドレスを,clientaddr という名前の sockaddr_storage 構造体に格納します。 [例に戻る]

  9. データをクライアントから受信する。 [例に戻る]

  10. clientaddr という名前の sockaddr_storage 構造体内のアドレスを使用して getnameinfo を呼び出し,クライアント名を取得する。 NI_NAMEREQD フラグは,このルーチンが,指定されたアドレスのホスト名を返すように指示しています。 [例に戻る]

  11. clientaddr という名前の sockaddr_storage 構造体内のアドレスを使用して getnameinfo を呼び出し,クライアントの数値アドレスとポート番号を取得する。 NI_NUMERICHOST フラグと NI_NUMERICSERV フラグは,このルーチンが,指定されたアドレスとポート番号に対応する数値を返すように指示しています。 [例に戻る]

  12. クライアントに応答を送信する。 [例に戻る]

C.3    プログラムの出力例

この節では,サーバ・プログラムとクライアント・プログラムの出力例を示します。 サーバ・プログラムは AF_INET6 ソケット上の要求はすべて,sockaddr_in6 を用いて受け付け,受信します。 IPv4 で受信した要求では,sockaddr_in6 には IPv4 にマップされた IPv6 アドレスが格納されています。

次の例では,ノード hostb6 でクライアント・プログラムが実行中であり,ノード hosta6 に要求を送信しています。 このプログラムは AF_INET6 ソケットを使用します。 hosta6 ノードの IPv6 アドレスは,DNS (Domain Name System) で 3ffe:1200::a00:2bff:fe97:7be0 になっています。

user2@hostb6> ./client hosta6
Response received from hosta6.ipv6.corp.example (3ffe:1200::a00:2bff:fe97:7be0):
 this is the server's response

サーバ・ノードでは,次の例でサーバ・プログラムの起動とクライアント・ノード hostb6 からの要求の受信を示します。

user1@hosta6> ./server
Request received from hostb6.ipv6.corp.example (3ffe:1200::a00:2bff:fe2d:02b2
 port 7739 "this is the client's request"
 
 

次の例では,ノード hostb でクライアント・プログラムが実行中であり,ノード hosta に要求を送信しています。 プログラムは AF_INET6 ソケットを使用します。 hosta ノードの IPv4 アドレスは,DNS で 10.10.10.13 になっています。

user2@hostb> ./client hosta
Response received from hosta.corp.example (::ffff:10.10.10.13): this is the
 server's response

サーバ・ノードでは,次の例でサーバ・プログラムの起動とクライアント・ノード hostb からの要求の受信を示します。

user1@hosta6> ./server
Request received from hostb.corp.example (::ffff:10.10.10.251) port 7739
 "this is the client's request"
 
 

次の例では,ノード hostc でクライアント・プログラムが実行中であり,ノード hosta に要求を送信しています。 このプログラムは,IPv4 のみのシステムで AF_INET ソケットを用いて作成され,実行されたものです。

user3@hostc> ./client hosta
Response received from hosta.corp.example (10.10.10.13): this is the
 server's response

サーバ・ノードでは,次の例でサーバ・プログラムの起動とクライアント・ノード hostc からの要求の受信を示します。

user1@hosta6>./server
Request received from hostc.corp.example (::ffff:10.10.10.63) port 7739
 "this is the client's request"