getsockname
ここでは、ソケットからsockaddr情報を取得するgetsocknameの利用方法を説明したいと思います。
getsocknameサンプル
getsocknameを利用すると、そのソケットに関する接続情報などが取得できます。
getsocknameを利用するユースケースで多いのが、0番ポートを指定してbindした場合の実際のポート番号を取得することです(下記サンプルではopenになっていますが、便宜上bindで説明します)。
TCPのサーバソケットを0番ポート指定で作成した場合、実際にはそのシステムで空いているポート番号が自動的に割り振られます(0番ポートはプロトコル上使ってはならないため)。 しかし、0番でbindを行った場合、自動的に割り振られたポート番号がいくつであるかがbindのAPIだけではわかりません。
そこで、実際に割り当てられたポート番号を知るためにgetsocknameを利用します。
#!/usr/bin/ruby
require "socket"
s = TCPServer.open("", 0)
saddr = s.getsockname
p saddr;
p Socket.unpack_sockaddr_in(saddr)
上記サンプルでは、s.getsocknameによって作成されたソケットに関する情報を取得できます。
getsocknameで取得できる情報はバイナリのままです。 そのため、人間が見ても解りにくい値になっています。 上記サンプルでは、人間が見てもわかるように、unpack_sockaddr_inを使った「p」も行っています。