« 2008年11月 | メイン | 2009年01月 »

2008年12月 アーカイブ

2008年12月16日

RubyでUDPブロードキャストを送受信してみる

複数サーバで動いているサーバ上でIPアドレスを知らない相手に
メッセージ送受信をしたい機会が出てきたので、
RubyでUDP broadcastを送受信するのを調べてみました。

server:


#!/usr/bin/env ruby

require 'socket'
require 'yaml'

SETTING = YAML.load_file('./udp.yaml')
sock = UDPSocket.open()

sock.bind('0.0.0.0', SETTING[:expose_port])
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)

while(1) do
  p sock.recvfrom(20)
end

client:


#!/usr/bin/env ruby

require 'socket'
require 'yaml'
SETTING = YAML.load_file('./udp.yaml')
sock = UDPSocket.open()

port = SETTING[:expose_port]
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
p sock.send("Hello\n", 0, "<broadcast>", port)

というかんじでできました。
送信側のsend時の<broadcast>と、受信側のbind時の'0.0.0.0'が肝でした。
受信側のbindアドレスに'localhost'とかだとだめみたいです。

起動時にUDPブロードキャストデータグラムを送信して、
管理プログラムにクライアントを登録するような使い方が便利です。

たぶんPythonとかでも大体同じだと思います。