CORBAオブジェクトの取得
Simple Wiki Based Contents Management System
Home Topics Projects Software Misc
ソフトウェア関連 >> RtORBについて >> RtORBの動作について >> CORBAオブジェクトの取得

CORBAオブジェクトの取得

IOR又はObjectURLが既知の場合

先ず、クライアント側では、リモートCORBAオブジェクトの生成を行う。リモートCORBAオブジェクトは、IORまたはObjectURLが既知でなければならない。
IORとは、Interoperable Object Referenceのことであり、接頭辞 IOR: の後に16進数の文字列が並ぶ文字列である。また、ObjectURLは、Object Uniform Resource Locatorのことであり、インターネット上のリソースを特定するための文字列であるURLと似たようなものであり、RtORBでは、このObjectURLとして、Corbalocをサポートしている。
リモートCORBAオブジェクト参照の生成には、このIORまたはObjectURLをCORBA_ORB_string_to_object関数に与えることで、リモートCORBAオブジェクト参照を生成することができる。

IORについて

IORには、TypeIDと1つ以上のプロファイルから構成される。プロファイルには、使用するGIOPのバージョン、IPアドレス、ポート番号等が含まれている。
ちなみに、RtORBでは、IORは、createIOR関数で生成することができ、
 "IOR:" + byte_order(octet) +TypedID(string) +  Number of TaggedProfiles = 1 (long) 
     + IOP_TAG_INTERNET_IOP(long) + Size of TaggedProfile(long)+ TaggedProfile
となっています。
TaggedProfileは、
 byte_order(octet) + version.major(octet) + version.minor(octet) +IP Address(string) 
     + PortNo. (short) + object_key(string) + Number of TaggedComponent(octet) + TaggedComponent
となっています。
TaggedComponentは、
 ORB_TYPE(long) +ORB_TYPE data(sequence) +  CODE_SETS(long) + CODE_SET data (sequence)
として生成しています。
IIOP Completeという書籍では、
 IOR:000000000000000e49444c3a48656c6c6f3a312e300000000000000100000000
 0000003a000100000000000f3134302e3138382e31382e3231390020138900000000
 001a4f422f49442b4e554d0049444c3a48656c6c6f3a312e30003000
のような例が書いてあります。整形してみると、
 IOR:
 00 00 00 00 00 00 00 0e 49 44 4c 3a 48 65 6c 6c
 6f 3a 31 2e 30 00 00 00 00 00 00 01 00 00 00 00
 00 00 00 3a 00 01 00 00 00 00 00 0f 31 34 30 2e
 31 38 38 2e 31 38 2e 32 31 39 00 20 13 89 00 00
 00 00 00 1a 4f 42 2f 49 44 2b 4e 55 4d 00 49 44
 4c 3a 48 65 6c 6c 6f 3a 31 2e 30 00 30 00
となる。この例では、
  byte_order = 0
  TypedID = IDL:Hello:1.0  (0x49, 0x44, 0x4c, 0x3a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x3a, 0x31, 0x2e, 0x30 0x00) len=0x0e
  Number of TaggedProfiles = 1 (0x00000001)
  IOP_TAG_INTERNET_IOP = 0 (0x00000000)
  Size of TaggedProfile = 58 (0x3a)
  bye_order = 0
  version.major=1
  version.minor=0
  IP Address = 140.188.18.219 ( 0x31, 0x34, 0x30 ,0x2e ,0x31 ,0x38 ,0x38 ,0x2e ,0x31 ,0x38 ,0x2e ,0x32 ,0x31 ,0x39 0x00) len=0x0f
  PortNo. = 5001 (0x1389)
  object_key = OB/ID+NUM IDL:Hello:1.0 0 (0x4f, 0x42 ,0x2f  ,0x49  ,0x44 ,0x2b ,0x4e ,0x55 ,0x4d ,0x00 ,0x49 ,0x44, 0x4c ,0x3a ,0x48 ,0x65 ,0x6c ,0x6c ,0x6f ,0x3a ,0x31 ,0x2e ,0x30 ,0x00 ,0x30 ,0x00) len=0x1a
ということがわかります。これは、140.188.18.219 のマシン上にポート番号5001というSocketポートでOB/ID+NUM IDL:Hello:1.0 0 という名前のオブジェクトでIDL:Hello:1.0のインスタンスであるということになります。また、このマシンが、GIOP1.0のメッセージを受付け、BigEndianのマシンであることもわかります。
したがって、このIORが分かれば、リモートメソッドをコールすることもできますので、CORBAオブジェクトの参照として使われています。ちなみに、CosNamingのNameServerに登録されているのは、この形式の文字列と名前のペアになります。

ネームサーバーからIORを取得する場合

また、リモートCORBA オブジェクの参照を生成するには、NameServiceを用いる方法もある。RtORBでは、CosNameのStubも提供しているので、NameServiceのIORまたはObjectURLが既知の場合には、以下のような手続きでリモートCORBA オブジェクの参照を得ることができる。
  1. CORBA_ORB_resolve_initial_references関数等を使ってNameServerのIORを取得。
  2. 対象となるリモートCORBAオブジェクトを表すCosNaming_Nameを生成する。
  3. CosNaming_NamingContext_resolve関数で対象のリモートCORBAオブジェクトを取得。