クライアントのほうは変更箇所が多い.まず
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);