分散システム組んでるとこういう簡単なのが便利だったりする。
RubyのSocketでacceptしてSocketの情報読んで送り返してcloseするだけの簡単な物。
setsockopt
で再利用できるよう指定することで、二度目以降もこのプロセスが立ち上がりやすいようにしている。
require 'socket'
# ソケット作成
serv = Socket.new Socket::AF_INET, Socket::SOCK_STREAM, 0
# 関連付けたい自分のアドレスを作成
sockaddr = Socket.sockaddr_in 9191, "0.0.0.0"
# 再利用可能なように設定
serv.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
# アドレスとソケットを関連付け
serv.bind sockaddr
# listen開始。外部の接続を受け付ける
serv.listen 5
puts 'IP notifier start'
# 無限ループ
loop do
# 接続を待機。sockは[socket, address]の配列で帰って来る
sock, addr = serv.accept
# IPアドレスとポートの組を獲得。 _ で受け取ってるのは使わないから
host, _ = addr.ip_unpack
# 接続してきたクライアントにそのIPを通知
sock.write host
# ソケット切断
sock.close
end
簡単ですね。