
本記事は、IPの取得方法と$system.INetInfo.cls($system.INetInfo)の備忘録になります。
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を参照してください。