Gauche > Archives > 2018/04/03

2018/04/03 18:03:46 UTCとおる。
#
上で試したときは Docker for Mac だったんですが、いま Ubuntu のホストでためしたら、確かにエラーでないです……。
2018/04/03 18:30:01 UTCshiro
#
なるほどそれが再現条件ぽいですね。同じポート番号を使いまわしてるのでテストの書き方も良くないんですよね。そっちを変えるべきかも。
2018/04/03 18:51:35 UTCakadoy
#
はじめまして。ちょっと気になったので調べてみました。
#
上記2012-12-05のアーカイブにもありますが、IPv6の設定が有効になってないと当該エラーが出るようです。手元の環境(ArchLinux, CentOS7)ではそれで100%再現しました。
2018/04/03 18:54:11 UTCshiro
#
あっなんかそういうのがあった記憶が
2018/04/03 18:54:53 UTCakadoy
#
具体的には、sysctl で net.ipv6.conf.all.disable_ipv6 と net.ipv6.conf.default.disable_ipv6 を両方とも0にするとエラーが出ます。1に戻すと直ります。
#
Dockerの場合は dockerd の設定でIPv6が有効になっているとエラーが出ないようです。--ipv6フラグ付きで起動しているとか、/etc/docker/daemon.json にIPv6の設定がある場合とか。
#
LinuxでIPv6が有効かどうかは ip addr show dev lo で確認できます。IPv6が無効な場合は inet6 のアドレスが出てきません。
2018/04/03 19:01:55 UTCshiro
#
configureでipv6が検出されて、ランタイムでdisableされてる場合、2個前の "inet client socket" テストでipv6サーバソケット使おうとしてるとこでなんか中途半端な状態になっちゃうのかな。
2018/04/03 19:04:53 UTCakadoy
#
そもそもの原因としては、(make <sockaddr-in6> :port :any ...) を実行した場合、Linuxだと IPv6 と v4 の両方に接続可能なソケットが作られてしまうみたいです。なので、IPv6が無効になっていても ext/net/test.scm の run-simple-server がエラーにならなくてソケットが残る。
#
一方、クライアント側は (get-ipv6-sock) がエラーになるのでサーバに接続せず終了する。その結果 run-simple-server のプロセスがいつまでも待ち続ける…ということが起こっているように見えます。
2018/04/03 19:06:26 UTCshiro
#
それだ
2018/04/03 19:07:46 UTCakadoy
#
エラーメッセージでも 127.0.0.1:6726 が already in use になっていますよね。IPv6 で作ったはずのソケットが IPv4 のソケットを邪魔してるわけです。
2018/04/03 19:12:28 UTCakadoy
#
対処方法として自分が考え付くのは2つあって、1つはソケット生成後に socket-setsockopt で IPV6_V6ONLY を設定する方法。
#
(define set-v6only (sock addr) (when (global-variable-bound? 'gauche.net 'IPV6_V6ONLY) (socket-setsockopt sock SOL_SOCKET IPV6_V6ONLY 1)))
#
みたいな関数を用意して make-server-socket の :sock-init に渡すことでエラーが止まります。手元で確認しました。
#
もう1つの方法は、(make <sockaddr-in6> :port :any ...) のところで、:host :any の代わりに :host "::1" とアドレスを決め打ちしてしまうこと。IPv6が有効なら "::1" は必ず存在するはずなので、:any にする特段の理由がなければこちらの方が手軽でいいかも。
2018/04/03 19:20:35 UTCshiro
#
愚直に、クライアントからipv6で接続できなければサーバをkillするコードを入れちゃいました。
#
"::1"の方が楽だったかも。
2018/04/03 19:28:44 UTCakadoy
#
HEAD をビルド中です。自分も最初、同じように run-process の戻り値をあれこれして…って考えたのですが、コードがうまく書けなくて上記の対処方法に辿りついたのでした。勉強になります。
2018/04/03 19:30:34 UTCshiro
#
こちらこそ助かりました。ありがとうございます。
2018/04/03 19:45:30 UTCakadoy
#
どういたしまして。お役に立てたなら何よりです。
#
ArchLinuxでビルドして修正を確認しました。お疲れさまでした。