まつもと ゆきひろです
In message "[ruby-list:5875] Re: Are there any sample programs for UDP socket ?"
on 98/01/13, Toshihiko SHIMOKAWA / 下川俊彦 <toshi / csce.kyushu-u.ac.jp> writes:
|[1 <text/plain; iso-2022-jp (7bit)>]
|なんとか send 側のコードは動きました:-)
おお,実はとしちゃん(とお呼びすればよろしいんでしょうか)のメー
ルに触発されて,機能はUDPと格闘しちゃいました.
# UDPsocketクラスを作っちゃいました.^^;;;
まず,お約束のサンプルです.としちゃんはもうできちゃってるん
で参考程度に.
-- udp.rb
require 'socket'
include Socket::Constants
hostaddr = Socket::gethostbyname("localhost")[3]
sockaddr_in = "S n a4 x8"
port = 7 # echo
sockaddr = [AF_INET, port, hostaddr].pack(sockaddr_in)
p sockaddr
s = Socket::open(AF_INET, SOCK_DGRAM, 0)
#s.connect(sockaddr)
s.send("foo\r\n", 0, sockaddr)
s,addr = s.recvfrom(100)
p s
p addr.unpack(sockaddr_in)
--
Socket::Constantsをincludeするとか,ドキュメントに載ってない
わざを使ってますね.ドキュメントに追加しておきます.
それからUDPsocketクラスを使ったものです.もちろん,これは私
の手元にしかありませんので,次のバージョンからしか使えません.
-- udp2.rb
require 'socket'
include Socket::Constants
s = UDPsocket.new
#s.connect("localhost", "echo")
s.send("foo\r\n", 0, "localhost", "echo")
p s.recvfrom(100)
--
UDPsocketクラスのメソッドは
UDPsocket.open
UDPsocket.new
connect(host, port)
bind(host, port)
send(mesg, flags[, host, port])
recvfrom(len)
です.recvfromは[文字列, [host, port]]という配列を返します.
その他にTCPsocketクラスの持っていた
addr
peeraddr
getaddress
も使えます(共通のスーパークラスIPsocketが新設されました).
|C なソケットプログラマには分かりやすいという話もあります:-) 今なら
|UDPsocket クラスに要望を出せるということでもありますよね。
1.1b5が出る前でしたら上記のUDPsocketに対して自由に要望を出し
て下さい.
|> * Rubyの文字列は長さを知っていますからmsg,lenの代わ
|> りに文字列1つを使います.
|
|これは文字列で良いのですね。ありがとうございました。
そうですね.Cからの変換には
* ソケットを指定する引数はレシーバになる
* mesg, lenという2引数が文字列一つに置き換わる
* recvfromはsockaddr構造体を引数に取らない(文字列とアドレ
スの配列を返す)
* sendtoはない.sendに追加の引数を指定する
という違いがあります.
|そういえば gethostbyname あたりのメソッドがクラスメソッドであることが分
|からずにちょっと苦労しました。クラスメソッドじゃないとするとかっこ悪いの
|ですぐに想像できてしかるべきなのかもしれませんが、結局ソースコードを眺め
|てて気が付きました。マニュアルに一言あるとうれしいかと思います。
マニュアルを書き直します.
まつもと ゆきひろ /:|)