オブジェクトリファレンスとIPアドレスについて¶
エンドポイントが変化したときにオブジェクトリファレンスにIPアドレスが埋め込まれていると到達不可能になる問題を解決したい。
corba.endpoints¶
corba.endpoints: all などとすると、すべてのインターフェースのアドレスがオブジェクトリファレンスに埋め込まれる。
ただし、1番目以降のIPアドレスは TAG_ALTERNATE_IIOP_ADDRESS というタグに埋め込まれるので、Javaなどでは接続に時間がかかる。
IOR: IOR:010000003500000049444c3a6f70656e72746d2e616973742e676f2e6a702f4f70656e52544d2f44617461466c6f77436f6d706f6e656e743a312e300000000001000000000000008800000001010200100000003139322e3136382e3232302e313831003da800000e000000fe5dc45352000038b1000000000400000300000000000000080000000100000000545441010000001c000000010000000100010001000000010001050901010001000000090101000300000018000000010000000e0000003135302e32392e39392e313936003da8 IOR information Type ID: "IDL:openrtm.aist.go.jp/OpenRTM/DataFlowComponent:1.0" Profiles: 1. IIOP 1.2 192.168.220.181 43069 POA(root) Object Key: "...." = 0x00000004 (4 bytes) Object Key: ".].SR..8......" = 0xfe5dc45352000038b10000000004 (14 bytes) TAG_ORB_TYPE omniORB TAG_CODE_SETS char native code set: ISO-8859-1 char conversion code set: UTF-8 wchar native code set: UTF-16 wchar conversion code set: UTF-16 TAG_ALTERNATE_IIOP_ADDRESS 150.29.99.196 43069
OMNIORB_USEHOSTNAME¶
環境変数 OMNIORB_USEHOSTNAME をセットすると、たとえ corba.endpoints: all が指定されていても、セットされたホスト名のみがIORに埋め込まれる。
IOR: IOR:010000003500000049444c3a6f70656e72746d2e616973742e676f2e6a702f4f70656e52544d2f44617461466c6f77436f6d706f6e656e743a312e3000000000010000000000000064000000010102000d0000007562756e74752e6c6f63616c00007fa80e000000fec2c45352000038d3000000000400000200000000000000080000000100000000545441010000001c00000001000000010001000100000001000105090101000100000009010100 IOR information Type ID: "IDL:openrtm.aist.go.jp/OpenRTM/DataFlowComponent:1.0" Profiles: 1. IIOP 1.2 ubuntu.local 43135 POA(root) Object Key: "...." = 0x00000004 (4 bytes) Object Key: "...SR..8......" = 0xfec2c45352000038d30000000004 (14 bytes) TAG_ORB_TYPE omniORB TAG_CODE_SETS char native code set: ISO-8859-1 char conversion code set: UTF-8 wchar native code set: UTF-16 wchar conversion code set: UTF-16
この辺の設定は、omniObjAdapter::initialize() の以下の部分で行われている。
if ( !options.endpoints.empty() ) { Options::EndpointURIList::iterator i = options.endpoints.begin(); for ( ; i != options.endpoints.end(); i++ ) { CORBA::Boolean ok = instantiate_endpoint((*i)->uri, (*i)->no_publish, listening_endpoints); if (!ok) { if (omniORB::trace(1)) { omniORB::logger log; log << "Error: Unable to create an endpoint of this description: " << (const char*)(*i)->uri << "\n"; } OMNIORB_THROW(INITIALIZE,INITIALIZE_TransportError, CORBA::COMPLETED_NO); } } } else { // instantiate a default tcp port. const char* hostname = getenv(OMNIORB_USEHOSTNAME_VAR); if( !hostname ) hostname = ""; CORBA::String_var estr = omniURI::buildURI("giop:tcp:", hostname, 0); CORBA::Boolean ok = instantiate_endpoint(estr, 0, listening_endpoints); if (!ok) { if (omniORB::trace(1)) { omniORB::logger log; log << "Error: Unable to create an endpoint of this description: " << (const char*)estr << "\n"; } OMNIORB_THROW(INITIALIZE,INITIALIZE_TransportError, CORBA::COMPLETED_NO); } }