TL;DL
本日Android Emulatorでデバックをしながらコードを書いていたら盛大にハマりました。
次の犠牲者を出さないようにメモっておきます。
作っていたのはAndroidからIPv6で通信をするというアプリなのですが、Android EmulatorはすでにIPv6対応しているとのことで安心しておりました。
https://qiita.com/ip6/items/15f76aba059ebc969455
起こったこと
あるライブラリを使いIPv6で通信をしようとしたところ、なぜだか通信エラーで落ちる。
IPv4を使えば問題なし。あれーバグ書いちゃったかな???
Android EmulatorでもSettingからIPv6が確認できるじゃない。
なんで???
原因
Android Emulatorはデフォルトでサイトローカルアドレスを使うようになっている模様。
サイトローカルアドレスは、fec0::で始まるアドレス。上記スクリーンショットでも、2つ当たっている。
ところがこのサイトローカルアドレスは2004年9月にRFC3879によって廃止されています。
https://www.wdic.org/w/WDIC/%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%A6%E3%83%8B%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9
なんで、EmulatorのホストからPINGを打とうが何しようが応答が帰ってこないことが判明。
Android EmulatorはSYNで接続しようとするが、サーバーがACKを返してもそのパケットはどこかで破棄されちゃっている模様。
なんで2004年に廃止されてしまった規格を、2020年に引きづっているんだよ。勘弁してくれよーーー。
ちなみに実機だとサイトローカルアドレスは当たらないので、実機で動かしたら無事動きました。