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」も行っています。

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!