- v4ディレクトリに移動
cd v4
-
コード見てみる
-
コンパイル
g++ -o socket_server socket_server.cpp
- 起動
./socket_server
- 確認
netstat -an | grep 12345
tcp4 0 0 *.12345 *.* LISTEN
tcp4でIPv4のみでTCPでPORT 12345でLISTENしているのが確認できる
- 叩いてみる
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
が必要です
- 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);
- bind部分の対応
対応なし
- listen部分の対応
対応なし
- accept部分の対応
sockaddr_in
-> sockaddr_in6
- 起動
g++ -o socket_server socket_server.cpp
./socket_server
- 確認
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
- setsockoptの変更
SOL_SOCKET
-> IPPROTO_IPV6
SO_REUSEADDR
-> IPV6_V6ONLY
- 起動
g++ -o socket_server socket_server.cpp
./socket_server
- 確認
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
- v4ディレクトリに移動(すでにいる場合はスキップ)
cd v4
-
コード見てみる
-
コンパイル
g++ -o socket_client socket_client.cpp
- 起動
./socket_client
gethostbynameがIPv4のみ(かつこれは1つのIPアドレスしか持ってこれない気がする)のでgetaddrinfoを使う
getaddrinfoは複数のIPアドレス取ってこれるのでこれを順番に成功するまで接続要求していく。そのためコードのdiffが大きいので今回のワークショップでは書き換えることはやらない
-
コード見てみる
-
コンパイル
g++ -o socket_client socket_client.cpp
- 起動
./socket_client