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 オブジェクの参照を得ることができる。
- CORBA_ORB_resolve_initial_references関数等を使ってNameServerのIORを取得。
- 対象となるリモートCORBAオブジェクトを表すCosNaming_Nameを生成する。
- CosNaming_NamingContext_resolve関数で対象のリモートCORBAオブジェクトを取得。