class UDPSocket

[edit]

要約

UDP/IPデータグラム型ソケットのクラス。

目次

特異メソッド
インスタンスメソッド

継承しているメソッド

IPSocketから継承しているメソッド
BasicSocketから継承しているメソッド
IOから継承しているメソッド
Enumerableから継承しているメソッド

特異メソッド

open(address_family=Socket::AF_INET) -> UDPSocket[permalink][rdoc][edit]
new(address_family=Socket::AF_INET) -> UDPSocket

新しい UDP ソケットを返します。

address_family には Socket::AF_INET のような整数、:INET のようなシンボル、"INET" のような文字列を指定することができます。

require 'socket'

UDPSocket.new                   # => #<UDPSocket:fd 3>
UDPSocket.new(Socket::AF_INET6) # => #<UDPSocket:fd 4>
[PARAM] address_family:
ソケットのアドレスファミリー

インスタンスメソッド

bind(host, port) -> Integer[permalink][rdoc][edit] [redefined by resolv-replace]

UDPSocket#bindのパラメータ host の名前解決に resolv ライブラリを使います。

[PARAM] host:
bindするホスト名を文字列で指定します。
[PARAM] port:
bindするポートを指定します。
[EXCEPTION] SocketError:
名前解決に失敗した場合に発生します。
bind(host, port) -> 0[permalink][rdoc][edit]

ソケットを host の port に bind(2) します。

bind したポートから Socket#recv でデータを受け取ることができます。

[PARAM] host:
bind するホスト名文字列
[PARAM] port:
bind するポート番号
connect(host, port) -> Integer[permalink][rdoc][edit] [redefined by resolv-replace]

UDPSocket#connect のパラメータ host の名前解決に resolv ライブラリを使います。

[PARAM] host:
connect するホスト名を文字列で指定します。
[PARAM] port:
connect するポートを指定します。
[EXCEPTION] SocketError:
名前解決に失敗した場合に発生します。
connect(host, port) -> 0[permalink][rdoc][edit]

ソケットを host の port に connect(2) します。

これによって UDPSocket#send で送り先のアドレスを指定せずにデータを送ることができます(connect しなくとも送り先のアドレスを明示すればデータを送ることができます)。

require 'socket'

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:
接続するポート番号
recvfrom_nonblock(maxlen, flags=0) -> [String, Array][permalink][rdoc][edit]

ソケットをノンブロッキングモードに設定した後、 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, host, port) -> Integer[permalink][rdoc][edit]
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:
送り先のアドレス情報
send(mesg, flags , dest_sockaddr=nil) -> Integer[permalink][rdoc][edit] [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:
名前解決に失敗した場合に発生します。