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

カスタム検索



外部サイト

プレコ王国
ディスカス魂
金魚タイムズ
YouTubeチャネル
Twitter
Facebook
mixi(ほぼ未使用)


フィードメーター - Geekなぺーじ にほんブログ村 IT技術ブログへ
Copyright (C) Geekなページ.
All rights reserved. 無断転載や無断コピーなど、私的利用の範囲を逸脱した利用はおやめ下さい.