Rubyでsocket通信の練習

2014-03-04

IT Windows

とある事情で通信を行うプログラムを書いてみたくなり、rubyが簡単そうだったので試してみた。ちなみに私はメカ屋さんだけど、多少のプログラム経験はある。でも通信するのは初めて。

参考情報
  1. RubyでSocketプログラミング超入門
  2. 簡単なTCPサーバとクライアント
  3. RubyでTCPSocketを使用して通信をしようと思いました。 localhostにサーバを立てて...
ちょっと検索するといろいろサンプルが出てきて、あまりに簡単そうだったので試してみる気になった。なんとなく参考情報1のがよさそうだったので、そのままコピペして試してみた。
ローカルPC(Windows 7)の中で試してみる分には動いたのだが、別PC(Windows 7)でサーバープログラムを動かしてクライアントを起動すると、socketを開くところでエラーが出た

echo-client.rb:5:in `initialize': No connection could be made because the target
 machine actively refused it. - connect(2) (Errno::ECONNREFUSED)
        from echo-client.rb:5:in `open'
        from echo-client.rb:5:in `main'

正直見当もつかなかったのだが、やみくもに調べていて、サーバーでnetstatを見ると、(port 9999で起動しています)

>netstat -an
.
TCP    [::]:9999              [::]:0                 LISTENING
なんかこの[::]というのが怪しい。何を意味しているのか検索しても出てこない。
諦めかけていた時に、参考情報3を見つけた。症状(error)が同じだ。
サーバー側でポートを開くときに、hostを省略すると全てのhostを受け入れるという事になっているはずなのだが、ここを明示的に指定するといいとの事(正直よくは分かっていないけど)。

サーバー側のプログラムの、
gate = TCPServer.open(port)

gate = TCPServer.open('',port)
に変更すると、うまくいくようになった。
netstatを確認すると、
>netstat -an
.
  TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
と変わっていた。

よくはわからないけど、解決。