読者です 読者をやめる 読者になる 読者になる

誰も掴んでない TCP ポートを使うことができない

たとえば、次の例では 12345 ポートは netstat や lsof でも出てこないし、クライアントから接続することもできません。

# netstat -a | grep 12345
# lsof -i :12345
# telnet localhost 12345
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

が、12345 ポートで LISTEN するサーバーを起動すると Address already in use になってしまいます。

# ruby -rsocket -e 'TCPServer.new(12345)'
-e:1:in `initialize': Address already in use - bind(2) for nil port 12345 (Errno::EADDRINUSE)
        from -e:1:in `new'
        from -e:1:in `<main>'

どうやら bind(2) した後 listen(2) しなければ、このようなプロセスを作ることができるようです。

# ruby -rsocket -e 'Socket.new(:INET, :STREAM).bind(Addrinfo.tcp("0.0.0.0", 12345)); sleep'

ちなみに lsof でこのプロセスを見ると、問題の Socket ファイルは can't identify protocol になってました。

# lsof -p 11210
〜(中略)〜
ruby    11210 tommy    7u  sock    0,8      0t0 1105451 can't identify protocol

このような状況になったら、どうやればこのプロセスを探し出すことができるんでしょうねぇ…。