<br>
<div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br>&gt; Then, discconect the network card of PC A, and start process<br>&gt; A. This process, every 3 seconds test its TCP conection
<br>&gt; trying to ping the IP where omninames is running. If the test<br>&gt; success (when I reconnect the network card), creates a thread<br>&gt; that goes into orb-&gt;run(), and (in another thread) poll the process B.
<br><br>I assume that when process A calls the service in B, it passses in an object reference to a servant in process A, right ? Have a look at that object reference - I think that you will see that the object reference contains an IP address which is localhost.
</blockquote>
<div>&nbsp;</div><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">This is because when you started up process A I assume that you initialized the orb before you begin checking for the presence of the network 
</blockquote></div>
<div><br>Firstly I did what you said, but then I saw the local reference so I change it. I&#39;ve only start the thread that goes into orb-run() if I have TCP connection and if the PC in which omninames are running is reachable. It is what I meant when I said &quot;if the test success&quot;.
</div>
<div>&nbsp;</div>
<div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&gt;If my guesses are correct the problem should be avoidable by either setting a static IP address of the machine &gt;containing process A (the machine address is then visible to the orb even when the network is down)
</div>
<div>&nbsp;</div>
<div>Every PC I use have static IP (only one network card, and only one IP).</div>
<div>&nbsp;</div>
<div>Each time I discconect and connect the network while the process are running the port used is different, but I think this have no importance, right</div>
<div>&nbsp;</div>
<div>Is there some way to me of seeing what&#39;s happening since&nbsp;proccess A invoques a method&nbsp;of process B&nbsp;until it reachs the code implementation in proccess B? I have look the ORB traces, but I don&#39;t really understand it.
</div>
<div>&nbsp;</div>
<div>The code to do this is:</div></div>
<div>
<div>For process A</div>
<div>&nbsp;&nbsp;&nbsp; &nbsp;if(ping.Ping(&quot;<a href="http://192.168.2.114">192.168.2.114</a>&quot;))<br>&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;hThreadCorba = CreateThread (NULL, NULL, ServerResponse, NULL, 0, NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;SetTimer(TIMER_CORBA,3003,NULL);
</div></div>
<div>&nbsp;</div>
<div>For process B</div>
<div>&nbsp;&nbsp;&nbsp; if(ping.Ping(&quot;<a href="http://192.168.2.114">192.168.2.114</a>&quot;))<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;hThreadCorba = CreateThread (NULL, NULL, HiloCorba, NULL, 0, );<br>&nbsp;&nbsp; &nbsp;&nbsp;}<br>&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;SetTimer(TIMER_CORBA,3003,NULL);
</div>
<div>&nbsp;</div>
<div><a href="http://192.168.2.114">192.168.2.114</a> is the static IP of the PC where omninames are running.</div>
<div>&nbsp;</div>
<div>Each time&nbsp;a process want something of the other creates a variable:</div>
<div>
<p>&nbsp;&nbsp; try<br>&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessA m_corbaCallOb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_corbaCallOb.methodB();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch(CORBA::TRANSIENT&amp; ex)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; catch(...)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></p>
<p>&nbsp;</p>
<p>And finally, the constructor of ProcessA (is the same to proccess B, changing the name of the class and the name&nbsp;&nbsp;used by the CORBA server when&nbsp;binding to the name server)</p>
<p>CProcessA::CProcessA ()<br>{<br>&nbsp;try {<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; // Initialize ORB object.<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------
<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; argc=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Dummy variables to support following call.<br>&nbsp;&nbsp;&nbsp; char** argv=0;<br>&nbsp;&nbsp;&nbsp; CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; // Bind ORB object to name service object.<br>&nbsp;&nbsp;&nbsp; // (Reference to Name service root context.)<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------
<br>&nbsp;&nbsp;&nbsp; CORBA::Object_var obj = orb-&gt;resolve_initial_references(&quot;NameService&quot;);<br>&nbsp;&nbsp;&nbsp; assert (!CORBA::is_nil(obj.in()));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; // Narrow this to the naming context (Narrowed reference to root context.)
<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow(obj.in());<br>&nbsp;&nbsp;&nbsp; assert (!CORBA::is_nil(nc.in()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; // The &quot;name text&quot; put forth by CORBA server in name service.<br>&nbsp;&nbsp;&nbsp; // This same name (&quot;DataServiceName1&quot;) is used by the CORBA server when
<br>&nbsp;&nbsp;&nbsp; // binding to the name server (CosNaming::Name).<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; CosNaming::Name _corbaCosName;<br>&nbsp;&nbsp;&nbsp; _corbaCosName.length(1);</p>
<p>&nbsp;&nbsp;&nbsp; char str[100] = &quot;DispatcherService&quot;; <br>&nbsp;&nbsp;&nbsp; _corbaCosName[0].id=CORBA::string_dup((const char*)str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------
<br>&nbsp;&nbsp;&nbsp; // Resolve &quot;name text&quot; identifier to an object reference.<br>&nbsp;&nbsp;&nbsp; //------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; CORBA::Object_var obj1 = nc-&gt;resolve(_corbaCosName);<br>
&nbsp;&nbsp;&nbsp; assert(!CORBA::is_nil(obj1.in()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; m_ObjCall = ProcessA ::_narrow(obj1.in());<br>&nbsp;&nbsp;&nbsp; if (CORBA::is_nil(m_ObjCall.in()))<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;IOR is not an SA object reference.&quot; &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; catch(CORBA::COMM_FAILURE&amp; ex) {<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Caught system exception COMM_FAILURE -- unable to contact the &quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; &quot;object.&quot; &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; throw DS_ServerConnectionException();
<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; catch(CORBA::SystemException&amp; ) {<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Caught a CORBA::SystemException.&quot; &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; throw DS_SystemException();<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; catch(CORBA::Exception&amp; ) {
<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Caught CORBA::Exception.&quot; &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; throw DS_Exception();<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; catch(omniORB::fatalException&amp; fe) {<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Caught omniORB::fatalException:&quot; &lt;&lt; endl;
<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;&nbsp; file: &quot; &lt;&lt; fe.file() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;&nbsp; line: &quot; &lt;&lt; fe.line() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;&nbsp; mesg: &quot; &lt;&lt; fe.errmsg() &lt;&lt; endl;
<br>&nbsp;&nbsp;&nbsp; throw DS_FatalException();<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; catch(...) {<br>&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Caught unknown exception.&quot; &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; throw DS_Exception();<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }</p></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>Thanks</div>
<div>&nbsp;</div>