福嶋です。

Toshihiko SHIMOKAWA / 下川俊彦 <toshi / csce.kyushu-u.ac.jp> wrote:
> 現在 UDPsocket#recvfrom は
> 
> 	[ 受信文字列, [ 送信元ホスト, 送信元ポート]]
> 
> という配列を返します。ここで、「送信元ホスト」は DNS を逆引きした結果の

> そこで、UDPsocket#recvfrom の返り値を、TCPsocket#recvfrom に合わせて、
> 
> 	[ 受信文字列, 相手ソケットアドレス]
> 	ただし「相手ソケットアドレス」の形式は IPsocket#addr
> 
> に変更してはどうかという案があります。

前から思っていたのですが、この種の返り値は Struct を使って表すと
いうのはどうでしょうか。

Struct.new('UDPRecv', :data, :addr)
# data => 受信文字列
# addr => 相手ソケットアドレス

こうすれば、今後変更があった時にも、既存のコードへの影響が少ない
ですし、コードの可読性も上がるように思います。

また、互換性にこだわるなら以下のようにするのも手じゃないかと。

Struct.new('UDPRecv', :data, :src, :addr)
# data => 受信文字列
# src  => [ 送信元ホスト, 送信元ポート]
# addr => 相手ソケットアドレス

これだと、以下のように既存の API を使ったコードと新しい API を使っ
たコードが共存できるのではないでしょうか。

data = aUDPsocket.recvfrom[0]
host = aUDPsocket.recvfrom[1][0]
port = aUDPsocket.recvfrom[1][1]

addr = aUDPsocket.recvfrom.addr

---
福嶋正機