From: "Toshihiko SHIMOKAWA / 下川俊彦" Date: 1998-01-13T23:45:48+09:00 Subject: [ruby-list:5875] Re: Are there any sample programs for UDP socket ? ----Next_Part(Tue_Jan_13_23:43:21_1998_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit なんとか send 側のコードは動きました:-) From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-list:5874] Re: Are there any sample programs for UDP socket ? Date: Tue, 13 Jan 98 18:44:12 +0900 > さて,まずいくつかの点で謝罪した方がよいような気がします. 謝罪なんてとんでもありません。こんな楽しい言語を作ってくださったのに:-) > 1. UDPソケット専用のクラスはまだありません.Socketクラスで > Cとほとんど同じようにぽちぽちプログラムするしかないです. > 面倒ですね.Rubyらしくないですね.その通りです.ごめん > なさい. C なソケットプログラマには分かりやすいという話もあります:-) 今なら UDPsocket クラスに要望を出せるということでもありますよね。 > 2. C言語でシステムコールのsendを使ったことがありますか? はい。 > Rubyのsendは基本的にシステムコールのsend/sendtoと同じで > す.ただし,以下の点が違います. この点はマニュアルから読み取れました。 > * sendtoのアドレスはpackした構造体を使います. pack するべきテンプレートおよび要素が分かりませんでした。でも、ふと思い 付いてperl のマニュアルや sys/socket.h を眺めてなんとかなりました。 > * Rubyの文字列は長さを知っていますからmsg,lenの代わ > りに文字列1つを使います. これは文字列で良いのですね。ありがとうございました。 > 3. send(2)というのはUNIXのmanのsection 2(システムコール)の > 項目と言う意味です.説明が少なくてごめんなさい. 少なくとも僕には通じていました。ご安心下さい。 > 4. なによりRubyでUDPプログラミングをしたことのあるひとがい > ません.バグがあるかも. 少なくとも短い文字列を send するだけならできました。 そういえば gethostbyname あたりのメソッドがクラスメソッドであることが分 からずにちょっと苦労しました。クラスメソッドじゃないとするとかっこ悪いの ですぐに想像できてしかるべきなのかもしれませんが、結局ソースコードを眺め てて気が付きました。マニュアルに一言あるとうれしいかと思います。 ということで、とりあえず動いたサンプルをつけておきます。ruby を使いはじ めて日が浅いのでおしゃれな記述になっていないかもしれません。youbin 付属 の sendto コマンド相当のものです。 さ、次は recv 側だ。 -- としちゃん // toshi@tea.forus.or.jp, toshi@csce.kyushu-u.ac.jp ----Next_Part(Tue_Jan_13_23:43:21_1998_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: udpclnt.rb #! /usr/local/bin/ruby # $Id: udpclnt.rb,v 1.1 1998/01/13 14:40:16 toshi Exp $ # udp socket example - client side # usage: ruby udpclnt.rb host port message require "socket" if ARGV.length != 3 print "Usage: ruby udpclnt.rb host port message\n" exit 1 end host= ARGV.shift service = ARGV.shift message = ARGV.shift remote_addr = Socket.gethostbyname(host) port = Socket.getservbyname(service, "udp") server_addr = [ 16, Socket::AF_INET, port, remote_addr[3] ] sockaddr_in = "CCnNx8" s = Socket.open(Socket::PF_INET, Socket::SOCK_DGRAM, 0) s.send(message, 0, server_addr.pack(sockaddr_in)) s.close ----Next_Part(Tue_Jan_13_23:43:21_1998_809)----