AnyEventとかCoroあたりを知るために、RemedieのMacのbinary版を入れてみたりしているのですが、1つ気になった点がありました。
RemedieはBonjourをサポートしているので、起動すると自動でSafariのブックマークのBojourメニューに現れます。
ただ、ここからアクセスすることは出来ませんでした。
Bonjourに登録されたアドレスは、
http://kazeburomp.local.:10010/
Safariからでは接続ができなかったようです。
そこでtelnetを用いて、接続をできるか、確認すると、
% telnet kazeburomp.local. 10010
Trying fe80::21c:42ff:fe00:0...
telnet: connect to address fe80::21c:42ff:fe00:0: Connection refused
Trying fe80::21c:42ff:fe00:0...
telnet: connect to address fe80::21c:42ff:fe00:0: Connection refused
Trying fe80::214:51ff:feed:706b...
ここで止まってしまい、connectできません。
よく見ると、アドレスに見慣れない文字、そうIPv6になってます。
どうやらBonjourに登録されたアドレスは、SafariではIPv6として解決されるようです
MacのIPv6といえば、
高木浩光@自宅の日記 -
MacユーザはIPv6を切るかnet.inet6.ip6.use_tempaddr=1の設定を
なんていう話もあるので、あまり有効にしていないかもしれません。
自分も無効にしていたはずなんですが、Parallelsの仮想NICが残ってました。試しにこの仮想NICのIPv6をすべて無効にしたところ、SafariのBonjourメニューから普通にRemedieの画面にアクセスができました。
高木先生の指摘点はありますが、IPv6が有効な状態でBonjourにアクセスできないか調べていたのですが、最も良さげなのはRemedieをIPv6のアドレスでListenさせることではないかと思います。
デフォルトの状態では、IPv4でListenするので、netstatでみると
% netstat -nat|grep 10010
tcp4 0 0 *.10010 *.* LISTEN
こんな感じ。tcp4と表示されています。
では、RemedieをIPv6化するにはどうしたらいいかと言うことなのですが、幸いなことに、最新版のRemedieはHTTP::Engine::Interfaceを経由してAnyEventを利用しているので、簡単に対応可能です。
AnyEvent::Socketにその説明がありました。
AnyEvent::Socket
- useful IPv4 and IPv6 stuff.
AnyEvent::SocketはIPv6対応がすでにされていて、どうやら、tcp_serverのhostに「::」を渡せばいいようです。
Remedieのサーバを起動するコマンドremedie-server.plのオプションでhostを渡せるのですが、その方法がよくわからなかったので、とりあえず、Remedie::CLI::Serverを直接書き換えました。
% vim /Applications/Remedie\ Server.app/Contents/Resources/lib/Remedie/CLI/Server.pm
この50行目あたりのhostのデフォルトを
- default => '0',
+ default => '::',
と書き換えますします。変更後はRemedie Serverを一度再起動です。
さて、もう一度、netstatで確認すると、
% netstat -nat|grep 10010
tcp46 0 0 *.10010 *.* LISTEN
となり、IPv6でListenしているのが確認できます。tcp6ではなく、tcp46なのはすみません勉強不足でよくわかりません。IPv4でも接続ができるモードのようです。
telnetでも確認します
% telnet kazeburomp.local. 10010
Trying fe80::21c:42ff:fe00:0...
Connected to kazeburomp.local.
Escape character is '^]'.
今度は何事もなく、接続できました。
SafariのBonjourメニューからも接続ができました。
いやいや、Bonjourアツい。 HTTP::Engine + AnyEventで何か作りたい!