【IRIS/Cache】端末のIPアドレスを取得する

本記事は、IPの取得方法と$system.INetInfo.cls($system.INetInfo)の備忘録になります。

※この記事は下記の方向けになります。
  • IPアドレスを取得したい方
  • ネットワーク関連を操作したい方

IPアドレスを取得する

マシン名とIPアドレスの取得

マシン名とIPアドレスの取得を行う場合は、%System.INetInfo.clsの関数を利用します。

下記がサンプルになります。

ClassMethod getIp()
{
	s name = $system.INetInfo.LocalHostName()
	w "name:",name,! // ホスト名が表示される

	s ip = $system.INetInfo.HostNameToAddr(name)
	w "ip:",ip,! // IPアドレスが表示される
	
	w "ip:",$system.INetInfo.HostNameToAddr("localhost") // 127.0.0.1が返る
}

関数「LocalHostName()」は、IRIS/Cache内部でWindowsのコマンド「gethostname()」を実行しホスト名を取得します。

関数「HostNameToAddr()」は、同様にWindowsのコマンド「getaddrinfo()」を内部で実行し、指定したホスト名(変数name or localhost)のIPアドレスを取得します。

Telnetクライアントから取得する

Tera Termやターミナルをリモートで接続した際、自端末(Telnetクライアント)のIPアドレスを取得します。

ホスト名とIPの取得コマンドは下記になります。

s ioDt = $zIO
s name = $P(ioDt, "/", 1)
w name // ホスト名が表示される

s ipDt = $zu(54, 13, name)
s ip = $p(ipDt, ",", 1)
w ip // クライアント端末のIPが表示される

%System.INetInfo.clsの他の関数群

%System.INetInfo.cls($system.INetInfo)は、IPアドレス操作用のインターフェースになります。

どのようなコマンドがあるかは、ターミナルで関数「Help()」を実行する事で確認可能です。

d $system.INetInfo.Help()

TextAddrToBinary

10進数のIPアドレスをバイナリ文字列に変換します。
windowsの「inet_addr()」を内部で実行し、結果を取得します。

s ip = "192.168.50.245"
w $system.INetInfo.TextAddrToBinary(ip) // À¨2õ と表示される

BinaryAddrToText

バイナリ文字列を10進数のIPアドレスに変換します。
windowsの「inet_ntoa()」を内部で実行し、結果を取得します。

s ip = "192.168.50.245"
s bi = $system.INetInfo.TextAddrToBinary(ip)

w $system.INetInfo.BinaryAddrToText(bi) // 192.168.50.245 と表示される

AddrToHostName

ホスト名を返します。ホスト名が関連付けられていない場合はnullを返します。

s ip = "192.168.50.245"
s bi = $system.INetInfo.TextAddrToBinary(ip)
w $system.INetInfo.AddrToHostName(bi) // ホスト名が返る

AddrType

アドレスタイプが返る。
0:ホスト名、1:IPV4, 2:IPV6

s ip = "192.168.50.245"
w $system.INetInfo.AddrType(ip) // 1が返る

s bi = $system.INetInfo.TextAddrToBinary(ip)
s hostNm = $system.INetInfo.AddrToHostName(bi)
w $system.INetInfo.AddrType(hostNm) // 0が返る

CheckAddressExist

IPアドレスがネットワーク内に存在するか確認する。
 1:存在する、0:存在しない

s ip = "192.168.50.245"
w $system.INetInfo.CheckAddressExist(ip) // 1
w $system.INetInfo.CheckAddressExist("192.168.50.226") // 0 (存在しない)

CheckArpingInstalled

「arping」がシステムにインストールしているか確認をする。
 1:インストールされている、0:インストールされていない

w $system.INetInfo.CheckArpingInstalled() // 1:インストール済み

GetInterfacesInfo

インターフェース情報を返す。
返却される文字列は、I/F名とIPアドレスを「$c(1)」で接続して返す。
 例)[I/F名]_$c(1)_[IPアドレス]

インターフェース情報が複数ある場合は、上の組み合わせを「$c(0)」で接続して返す。
 例)[I/F名]_$c(1)_[IPアドレス]_$c(0)_[I/F名]_$c(1)_[IPアドレス]…

s ifs = $system.INetInfo.GetInterfacesInfo()
f pos=1:1:$l(ifs,$c(0)) s d=$p(ifs,$c(0),pos) w $p(d,$c(1),1),",",$p(d,$c(1),2),!

GetListOfConfiguredInterfaces

インターフェース名を$List形式で返す。

引数:1=インターフェース名のみのリスト形式で返る
引数:0=インターフェースとIPをリスト形式にして、さらに複数のインターフェースをリスト形式で返す

s list=$system.INetInfo.GetListOfConfiguredInterfaces(1) // インターフェース名のみ
s list=$system.INetInfo.GetListOfConfiguredInterfaces(0) // インターフェース名とIP

CheckInterfaceExist

ネットワークインターフェースが存在するか確認をする。
 1:存在する、0:存在しない

s ifs = $system.INetInfo.GetInterfacesInfo()
s if = $p($p(ifs,$c(0),1),$c(1),1)
w if,! // イーサネット が表示された
w $system.INetInfo.CheckInterfaceExist(if) // 1=存在する

OSsupportsIPV6

OSでIPV6がサポートされているか確認する。
 1:サポートされている、0:サポートされていない

w $system.INetInfo.OSsupportsIPV6() // 1:サポートされている

DisableIPV6

IPV6を「システム全体 or プロセス単位」で無効にする。
 ※引数:1=システム全体, null=プロセス単体

戻り値:1:有効, 0:無効 ※変更前の値が返る?

w $system.INetInfo.DisableIPV6() // プロセス単位
w $system.INetInfo.DisableIPV6(1) // システム全体

EnableIPV6

IPV6を「システム全体 or プロセス単位」で有効にする。
 ※引数:1=システム全体, null=プロセス単体

戻り値:1=有効, 0=無効 ※変更前の値が返る?

w $system.INetInfo.EnableIPV6() // プロセス単位
w $system.INetInfo.EnableIPV6(1) // システム全体

IsIPV6Enabled

IPV6を「システム全体 or プロセス単位」で有効か確認する。
 ※引数:1=システム全体, null=プロセス単体

戻り値:1=有効, 0=無効

w $system.INetInfo.IsIPV6Enabled() // プロセス単位
w $system.INetInfo.IsIPV6Enabled(1) // システム全体

NetToHostLong

4 バイトの符号なし整数をネットワーク順からホスト順に変換する。
windowsの「htonl()」を内部で実行し、結果を取得します。

s ipNum = 3232248565 // 192.168.50.245
w $system.INetInfo.HostToNetLong(ipNum) // 4113737920(245.50.168.192) が返る

実際に「ping 3232248565」「ping 4113737920」をコマンドプロンプトで実行すると分かりやすい。

HostToNetLong

4 バイトの符号なし整数をホスト順からネットワーク順に変換する。
windowsの「htonl()」を内部で実行し、結果を取得します。

w $system.INetInfo.NetToHostLong(4113737920) // 3232248565(192.168.50.245) が返る

GetServiceByPort

ポート番号からサービス名を取得する。

w $system.INetInfo.GetServiceByPort(80) // http が返る
w $system.INetInfo.GetServiceByPort(1972) // 1972 が返る

詳細は、%SYSTEM.INetInfo.clsを参照してください。