next up previous
Next: 検証 Up: 情報工学実験2:IPv6-secure-programming Previous: サンプルソースIPv4対応 server4.c

プログラム解説

サーバーの改良は簡単で,IPv4にしか対応していない関数,構造体をIPv6に対応 したものにちょっと変更するだけで良い.変更した箇所は なぜAF_INET6でIPv4にも対応できるのかなどの疑問は課題2で説明される.




クライアントのほうは変更箇所が多い.まず

が使えないのでかわりに 下記のようにgetaddrinfo()を使ってリモートホストの情報を取得す る.
  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_UNSPEC;  /*IPv4, IPv6 どちらであるかを明示しない.*/
  hints.ai_socktype = SOCK_STREAM;
  getaddrinfo(argv[1], argv[2], &hints, &hp);
hints, hp はaddrinfo構造体である.hintsには希望のソケットタイプを 指定する.ここではTCPということだけを指定してあり,IPv4, IPv6については AF_UNSPECとすることで,どちらでも良いとしている.ここでAF_UNSPECではなく, AF_INETやAF_INET6とすれば両対応ではなくなる.

ソケットの生成においては以下のように

 s = socket(hp->ai_family, hp->ai_socktype, hp->ai_protocol);
として,getaddrinfoで取得した情報を使うようにすることで両対応にできる.

また,サーバーとの接続には直接関係がないが,inet_ntop()についても変更し た.

inet_ntop(hp->ai_family, &(((struct sockaddr_in6
	*)hp->ai_addr)->sin6_addr), hbuf, sizeof(hbuf));
こうすることで正しくホストのアドレスを取得できるが,getnameinfo()を使っ ても取得できる.
  getnameinfo(hp->ai_addr, hp->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
  sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);



fumiya nakamura 2006-02-10