Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

UDP クライアント/サーバ通信

この章では、UDP を使用したプロセス間のリモート通信の設定方法について説明します。パイプ、またはインタジョブ・コミュニケーション (IJC) デバイスを使用したプロセス間のローカル通信については、このドキュメントの "ローカル・プロセス間通信" の章を参照してください。

Caché は、TCP および UDP の 2 つのインターネット・プロトコル (IP) をサポートします。これらのインターネット・プロトコルにより、Caché は、プロセスが Caché を実行中かどうかにかかわらず、ローカルあるいはリモート・システムでプロセスと通信できます。

  • TCP: Caché 転送制御プロトコル (TCP) バインディング。サーバと 1 つのクライアント間の双方向通信を確立します。エラーのチェックと修正を伴った信頼性のあるデータのバイト・ストリーム送信、およびメッセージ応答を提供します。詳細は、このドキュメントの "TCP クライアント/サーバ通信" の章を参照してください。

  • UDP: Caché ユーザ・データグラム・プロトコル (UDP) バインディング。サーバと多数のクライアント間の双方向メッセージ転送を提供します。UDP は接続ベースではありません。各データ・パケット転送は独立したイベントです。ローカル・パケット・ブロードキャストおよびリモート・マルチキャストにおいて高速で軽量なデータ転送を提供します。本質的に、TCP よりも信頼性が低くなっています。メッセージ応答を提供しません。

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 の形式に関する詳細は、"Caché プログラミング入門ガイド" の “サーバ構成オプション” の章にある “IPv6 アドレスの使用” のセクションを参照してください。

FeedbackOpens in a new tab