class UDPSocket + IPSocket
クラスの継承リスト: UDPSocket < IPSocket < BasicSocket < IO < Enumerable < File::Constants < Object < Kernel < BasicObject
要約
UDP/IPデータグラム型ソケットのクラス。
特異メソッド
getaddress(host) -> String
[redefined by resolv-replace]-
IPSocket.getaddress を置きかえ、 resolv ライブラリを使い名前解決します。
- [PARAM] host:
- ホスト名を指定します。
- [EXCEPTION] SocketError:
- 名前解決に失敗した場合に発生します。
getaddress(host) -> String
-
ホスト名からホストのアドレスを返します。ホストのアドレスは文 字列は octet decimal の文字列 (例: 127.0.0.1) です。
- [PARAM] host:
- ホスト名を文字列で指定します。
例:
p IPSocket.getaddress("www.ruby-lang.org") #=> "210.163.138.100"
open(address_family=Socket::AF_INET) -> UDPSocket
new(address_family=Socket::AF_INET) -> UDPSocket
-
新しい UDP ソケットを返します。
address_family には Socket::AF_INET のような整数、:INET のような シンボル、"INET" のような文字列を指定することができます。
- [PARAM] address_family:
- ソケットのアドレスファミリー
インスタンスメソッド
addr -> Array
-
ソケットの接続情報を表す配列を返します。配列の各要素は第1要 素が文字列 "AF_INET", "AF_INET6" など、第2要素が port 番号、第3要素がホストを表 す文字列、第4要素がホストの IP アドレスを表す文字列 (octet decimal や hexadecimal) です。
- [EXCEPTION] Errno::EXXX:
- getsockname(2) が 0 未満の値を返した場合に発生します。
例:
serv = TCPServer.new("localhost", 0) p serv.addr #=> ["AF_INET", 46102, "localhost.localdomain", "127.0.0.1"] c = TCPSocket.new(*serv.addr.values_at(3,1)) s = serv.accept
bind(host, port) -> Integer
[redefined by resolv-replace]-
UDPSocket#bindのパラメータ host の名前解決に resolv ライブラリを使います。
- [PARAM] host:
- bindするホスト名を文字列で指定します。
- [PARAM] port:
- bindするポートを指定します。
- [EXCEPTION] SocketError:
- 名前解決に失敗した場合に発生します。
bind(host, port) -> 0
-
ソケットを host の port に bind(2) します。
bind したポートから Socket#recv でデータを受け取ることができます。
- [PARAM] host:
- bind するホスト名文字列
- [PARAM] port:
- bind するポート番号
connect(host, port) -> Integer
[redefined by resolv-replace]-
UDPSocket#connect のパラメータ host の名前解決に resolv ライブラリを使います。
- [PARAM] host:
- connect するホスト名を文字列で指定します。
- [PARAM] port:
- connect するポートを指定します。
- [EXCEPTION] SocketError:
- 名前解決に失敗した場合に発生します。
connect(host, port) -> 0
-
ソケットを host の port に connect(2) します。
これによって UDPSocket#send で送り先のアドレスを指定せずに データを送ることができます(connect しなくとも送り先のアドレスを明示すれば データを送ることができます)。
u1 = UDPSocket.new u1.bind("127.0.0.1", 4913) u2 = UDPSocket.new u2.connect("127.0.0.1", 4913) u2.send "uuuu", 0 p u1.recvfrom(10) #=> ["uuuu", ["AF_INET", 33230, "localhost", "127.0.0.1"]]
- [PARAM] host:
- 接続するホスト名文字列
- [PARAM] port:
- 接続するポート番号
peeraddr -> Array
-
接続相手先ソケットの情報を表す配列を返します。配列の各要素は IPSocket#addr メソッドが返す配列 と同じです。
- [EXCEPTION] Errno::EXXX:
- getpeername(2) が 0 未満の値を返した場合に発生します。
例:
TCPSocket.open("localhost", "http") {|s| p s.peeraddr #=> ["AF_INET", 80, "localhost.localdomain", "127.0.0.1"] p s.addr #=> ["AF_INET", 52615, "localhost.localdomain", "127.0.0.1"] }
recvfrom(maxlen, flags = 0) -> Array
-
recv と同様にソケットからデータを受け取りますが、 戻り値は文字列と相手ソケットのアドレス (形式は IPSocket#addr 参照) のペアです。引数につ いては BasicSocket#recv と同様です。
- [PARAM] maxlen:
- 受け取る文字列の最大の長さを指定します。
- [PARAM] flags:
- recv(2) を参照してください。
- [EXCEPTION] IOError:
- [EXCEPTION] Errno::EXXX:
- recvfrom(2) がエラーになった場合などに発生します。
例:
s1 = UDPSocket.new s1.bind("0.0.0.0", 0) # 適当に空いている port を割り当てる s2 = UDPSocket.new s2.send("foo", 0, s1.getsockname) mesg, inet_addr = s1.recvfrom(100) p mesg #=> "foo" p inet_addr #=> ["AF_INET", 32876, "localhost.localdomain", "127.0.0.1"]
recvfrom_nonblock(maxlen, flags=0) -> [String, Array]
-
ソケットをノンブロッキングモードに設定した後、 recvfrom(2) でソケットからデータを受け取ります。
maxlen で受け取るデータの最大バイト数を指定します。
flags はフラグで、Socket::MSG_* の bitwise OR を渡します。 詳しくは recvfrom(2) を参照してください。
返り値はデータの文字列と送り元のアドレス情報の 2要素の配列となります。
recvfrom(2) がエラーになった場合、 Errno::EAGAIN, Errno::EINTR を含め例外 Errno::EXXX が発生します。 Errno::EWOULDBLOCK、Errno::EAGAIN のような待ってからリトライすることが 可能であることを意味する例外には、IO::WaitReadable が extend されています。
require 'socket' s1 = UDPSocket.new s1.bind("127.0.0.1", 0) s2 = UDPSocket.new s2.bind("127.0.0.1", 0) s2.connect(*s1.addr.values_at(3,1)) s1.connect(*s2.addr.values_at(3,1)) s1.send "aaa", 0 begin # emulate blocking recvfrom p s2.recvfrom_nonblock(10) #=> ["aaa", ["AF_INET", 33302, "localhost.localdomain", "127.0.0.1"]] rescue IO::WaitReadable IO.select([s2]) retry end
- [PARAM] maxlen:
- 受け取るデータの最大バイト数
- [PARAM] flags:
- フラグ
[SEE_ALSO] IPSocket#recvfrom
send(mesg, flags , dest_sockaddr=nil) -> Integer
[redefined by resolv-replace]send(mesg, flags, host, port) -> Integer
[redefined by resolv-replace]-
4 引数の形式で UDPSocket#send 実行したとき、 パラメータ host の名前解決に resolv ライブラリを使います。
- [PARAM] mesg:
- 送るデータを文字列で与えます。
- [PARAM] flags:
- フラグを指定します。
- [PARAM] host:
- データを送る先のホストを指定します。
- [PARAM] port:
- データを送る先のポートを指定します。
- [EXCEPTION] SocketError:
- 名前解決に失敗した場合に発生します。
send(mesg, flags, host, port) -> Integer
send(mesg, flags, sockaddr_to) -> Integer
send(mesg, flags) -> Integer
-
UDP ソケットを介してデータを送ります。
flags には Socket::MSG_* という定数の bitwise OR を渡します。 詳しい意味は send(2) を参照してください。
host, port の対、もしくは sockaddr_to で送り先を指定します。 送り先を省略した場合は UDPSocket#connect で接続した 先にデータを送ります。
実際に送ったデータの長さを返します。
sockaddr_to にはsocket/ソケットアドレス構造体を pack した文字列 もしくは Addrinfo オブジェクトを指定します。
host, port に関しては socket/ホスト指定形式 、 socket/サービス指定形式 を参照してください。
2 引数、3 引数の形式の場合の動作は、 BasicSocket#send と同じです。
4 引数の形式で、指定したホストが複数のアドレスを持つ場合、いずれか のアドレスへの送信が成功するまで(あるいはすべての送信が失敗するま で)、各アドレスへの送信を順に試みます。
データの送信に失敗した場合は例外 Errno::EXXX が発生します。
- [PARAM] mesg:
- 送るデータ文字列
- [PARAM] flags:
- フラグ
- [PARAM] host:
- 送り先のホスト名
- [PARAM] port:
- 送り先のポート番号
- [PARAM] sockaddr_to:
- 送り先のアドレス情報