UDP クライアント/サーバ通信
ここでは、UDP を使用したプロセス間のリモート通信の設定方法について説明します。
概要
UDP は、%Net.UDPOpens in a new tab クラスを介してサポートされています。このクラスは、パケットを指定した宛先およびポートに Send()Opens in a new tab するメソッド、パケットをソケットから Recv()Opens in a new tab するメソッド、および最後に受け取ったパケットのトランスミッタへ Reply()Opens in a new tab するメソッドを提供します。
宛先は、ローカル・ホスト名あるいは IPv4 または IPv6 ホスト・アドレスとして識別されます。ポートは、指定されたポート番号または動的ポート割り当てのいずれかです。
UDP ソケットの確立
UDP を使用するには、%New()Opens in a new tab メソッドを使用して、UDP ソケット・オブジェクトを作成します。このオブジェクト・インスタンスはパケット転送の送信、受信、および応答に使用されます。
UDP ソケット・オブジェクトを作成する場合は、以下の例に示すように、ポート番号およびホスト・アドレスを指定できます。
SET UPDOref=##class(%Net.UDP).%New(3001,"0.0.0.0")
ポート番号およびホスト・アドレスはどちらもオプションです。%New() メソッドは、UDP ソケット・オブジェクト・インスタンスの OREF (オブジェクト参照) を返します。
UDP 転送には、以下の 2 つの側面があります。
-
サーバは、要求の受信を待機し、要求された情報を提供します。したがって、転送のこの側面を、レシーバまたはプロバイダと呼ぶことができます。プロバイダが UDP オブジェクトを作成する場合には、要求を受け取るポート番号を定義する必要があります。
-
クライアントは、情報の要求を送信し、応答を受け取ります。したがって、転送のこの側面を、センダまたはリクエスタと呼ぶことができます。リクエスタが UDP オブジェクトを作成すると、動的ポート番号を使用できます。既定値は 0 です。パケットを送信するときには、プロバイダのホスト名とポート番号を指定する必要があります。
ホスト・アドレス
Send() メソッドは宛先のバイナリ・アドレスを指定します。これは、ホスト・アドレスのバイナリ・バージョンです。このバイナリ・ホスト・アドレスは、以下のように GetHostAddr()Opens in a new tab メソッドを使用して作成する必要があります。
SET client=##class(%Net.UDP).%New()
SET addrbin=##class(%Net.UDP).GetHostAddr("172.16.61.196")
WRITE client.Send("message text",addrbin,3001)
以下の例に示すように、GetHostAddr() にホスト名、IPv4 アドレス、または IPv6 アドレスを指定することができます。
SET hostname="MYLAPTOP"
SET IPv4="172.16.61.196"
SET IPv6="::1"
SET flag=$SYSTEM.INetInfo.CheckAddressExist(hostname)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(hostname)
WRITE "host name valid",! }
ELSE { WRITE "not a hostname: ",hostname,! }
SET flag=$SYSTEM.INetInfo.CheckAddressExist(IPv4)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(IPv4)
WRITE "IPv4 valid",! }
ELSE { WRITE "not an IPv4 address: ",IPv4,! }
SET flag=$SYSTEM.INetInfo.CheckAddressExist(IPv6)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(IPv6)
WRITE "IPv6 valid",! }
ELSE { WRITE "not an IPv6 address: ",IPv6,! }
以下の例に示すように、AddrToHostName()Opens in a new tab メソッドを使用して、ホスト名にこのバイナリ・ホスト・アドレスを拡張することができます。
SET addrbin=##class(%Net.UDP).GetHostAddr("MYLAPTOP")
WRITE $SYSTEM.INetInfo.AddrToHostName(addrbin)
LocalHostName()Opens in a new tab メソッドを使用してホスト名を決定することができます。以下の例に示すように、HostNameToAddr()Opens in a new tab メソッドを使用してホスト名を IPv4 アドレスまたは IPv6 アドレスに変換することができます。
SET localhost=$SYSTEM.INetInfo.LocalHostName() /* get host name */
WRITE "local host name is ",localhost,!
SET addrbin=##class(%Net.UDP).GetHostAddr(localhost) /* compress to binary address */
WRITE "binary form of IP address is ",addrbin,!
SET hostname=$SYSTEM.INetInfo.AddrToHostName(addrbin) /* expand binary address to host name */
WRITE "binary IP address expands to ",hostname,!
SET ipaddr=$SYSTEM.INetInfo.HostNameToAddr(hostname) /* host name to IP address */
WRITE "hostname corresponds to IP address ",ipaddr,!
IPv4 と IPv6
UDP は、IPV4 および IPV6 インターネット・プロトコルの両方をサポートします。これらのプロトコルは互換性がないため、サーバとクライアントの両方ともが同じインターネット・プロトコルを使用しない場合には転送が失敗します。
IPv4 アドレスは以下の形式です。n は、0 から 255 の範囲の 10 進数の整数です。
n.n.n.n
IPv4 プロトコルを "0.0.0.0" として指定できます。
IPv6 アドレスは以下の完全な形式です。h は、4 桁の16 進数の数値です。
h:h:h:h:h:h:h:h
通常、IPv6 アドレスは先頭ゼロを削除してゼロの連続したセクションを二重コロン (::) に置き換えることによって省略されます。IPv6 アドレスで使用される二重コロンは 1 つのみです。IPv4 省略ルールを使用することによって、IPv6 プロトコルを "::" (8 つすべての h セクションの値が 0000 であることを意味する) として指定できます。
インターネット・プロトコルを確立するには、以下の手順を実行します。
-
クライアントは %New() メソッド内で IPv4 または IPv6 のいずれかを確立する必要があります。既定値は IPv4 です。
-
これは、GetHostAddr() メソッドに指定されていて Send() メソッドに (バイナリ形式で) 提供されている、IPv4 または IPv6 プロトコルと一致している必要があります。
以下は IPv4 転送の例です。
Server
SET sobj=##class(%Net.UDP).%New(3001,"127.0.0.1")
SET inmsg=sobj.Recv()
Client
SET cobj=##class(%Net.UDP).%New() /* the default is IPv4 */
SET bhost=##class(%Net.UDP).GetHostAddr("127.0.0.1")
SET outmsg="this is the message to send"
WRITE cobj.Send(outmsg,bhost,3001)
以下は IPv6 転送の例です。
Server
SET x=##class(%SYSTEM.INetInfo).IsIPV6Enabled()
IF x=1 {
SET sobj=##class(%Net.UDP).%New(3001,"::1")
SET inmsg=sobj.Recv() }
ELSE {WRITE "IPv6 not enabled" }
Client
SET cobj=##class(%Net.UDP).%New(0,"::")
SET bhost=##class(%Net.UDP).GetHostAddr("::1")
SET outmsg="this is the message to send"
WRITE cobj.Send(outmsg,bhost,3001)
ホスト・アドレスを処理するためのメソッドは %SYSTEM.INetInfoOpens in a new tab クラス・ドキュメントを参照してください。IPv4 および IPv6 の形式に関する詳細は、"IPv6 アドレスの使用" を参照してください。