nanashiki / ipv6_socket_workshop

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

POSIX Socket IPv4 -> IPv6ワークショップ

IPv4でのサーバアプリ

  1. v4ディレクトリに移動
cd v4
  1. コード見てみる

  2. コンパイル

g++ -o socket_server  socket_server.cpp
  1. 起動
./socket_server
  1. 確認
netstat -an | grep 12345

tcp4       0      0  *.12345                *.*                    LISTEN   

tcp4でIPv4のみでTCPでPORT 12345でLISTENしているのが確認できる

  1. 叩いてみる
nc -zv 127.0.0.1 12345
nc -zv ::1  12345
nc -zv ::ffff:127.0.0.1  12345

or

telnet 127.0.0.1 12345
telnet ::1 12345
telnet ::ffff:127.0.0.1 12345

最近のmacOSはtelnet入ってないので brew install telnet が必要です

IPv6に対応してみる

  1. socket作成部分の対応

AF_INETがIPv4の意味でAF_INET6がIPv6の意味

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -> socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);

sockaddr_inはIPv4のアドレス構造体でIPv6のアドレスを入れられないので変更

sockaddr_in -> sockaddr_in6 ddr.sin_family = AF_INET; -> addr.sin6_family = AF_INET6; addr.sin_port = htons(12345); -> addr.sin6_port = htons(12345);

  1. bind部分の対応

対応なし

  1. listen部分の対応

対応なし

  1. accept部分の対応

sockaddr_in -> sockaddr_in6

  1. 起動
g++ -o socket_server  socket_server.cpp
./socket_server
  1. 確認
netstat -an | grep 12345
nc -zv 127.0.0.1 12345
nc -zv ::1  12345
nc -zv ::ffff:127.0.0.1  12345

or

telnet 127.0.0.1 12345
telnet ::1 12345
telnet ::ffff:127.0.0.1 12345

IPv6のみにする

  1. setsockoptの変更

SOL_SOCKET -> IPPROTO_IPV6 SO_REUSEADDR -> IPV6_V6ONLY

  1. 起動
g++ -o socket_server  socket_server.cpp
./socket_server
  1. 確認
netstat -an | grep 12345
nc -zv 127.0.0.1 12345
nc -zv ::1  12345
nc -zv ::ffff:127.0.0.1  12345

or

telnet 127.0.0.1 12345
telnet ::1 12345
telnet ::ffff:127.0.0.1 12345

IPv4でのクライアントアプリ

  1. v4ディレクトリに移動(すでにいる場合はスキップ)
cd v4
  1. コード見てみる

  2. コンパイル

g++ -o socket_client  socket_client.cpp
  1. 起動
./socket_client

クライアントアプリをIPv6対応してみる

gethostbynameがIPv4のみ(かつこれは1つのIPアドレスしか持ってこれない気がする)のでgetaddrinfoを使う

getaddrinfoは複数のIPアドレス取ってこれるのでこれを順番に成功するまで接続要求していく。そのためコードのdiffが大きいので今回のワークショップでは書き換えることはやらない

スクリーンショット 2023-12-22 13 19 22
  1. コード見てみる

  2. コンパイル

g++ -o socket_client  socket_client.cpp
  1. 起動
./socket_client

About


Languages

Language:C++ 100.0%