ACE VERSION: 5.5<br>  &nbsp;&nbsp;&nbsp; HOST MACHINE and OPERATING SYSTEM:<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux 2.6.9 Kernel.CentOS4.2 (32bit)<br>  &nbsp;&nbsp;&nbsp; COMPILER NAME AND VERSION (AND PATCHLEVEL):<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)<br>  &nbsp;&nbsp;&nbsp; THE $ACE_ROOT/ace/config.h FILE: #include "ace/config-linux.h"<br>  &nbsp;&nbsp;&nbsp; THE $ACE_ROOT/include/makeinclude/platform_macros.GNU FILE:platform_linux.GNU<br>  <br>  &nbsp;&nbsp;&nbsp; CONTENTS OF $ACE_ROOT/bin/MakeProjectCreator/config/default.rel<br>  &nbsp;&nbsp;&nbsp; // This is the default relative definitions.&nbsp; Wildcards are acceptable.<br>  //<br>  // The first column is the name for which we create a relative definition.<br>  // The second (optional) column is the value to build up if it isn't defined<br>  // as an environmenment variable.<br>   *_ROOT<br>  TAO_ROOT,&nbsp; $ACE_ROOT/TAO<br>  CIAO_ROOT, $TAO_ROOT/CIAO<br> 
 <br>  &nbsp;&nbsp;&nbsp; AREA/CLASS/EXAMPLE AFFECTED:ACE_Select_Reactor<br>  &nbsp;&nbsp;&nbsp; DOES THE PROBLEM AFFECT:<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMPILATION? NO<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LINKING? NO<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTION? YES<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTHER (please specify)? <br>  &nbsp;&nbsp;&nbsp; SYNOPSIS:<br> &nbsp;&nbsp;&nbsp; A simple, syncronous ACE::recv_n in hadle_input( ) followed by a simple ACE::send_n( ) sendng data does not work for me<br>  &nbsp;&nbsp;&nbsp; DESCRIPTION:<br>  &nbsp;&nbsp;&nbsp; I'm&nbsp; building a simple echo test program.<br>  &nbsp;&nbsp;&nbsp; I have an ACE_Select_Reactor listening in a port waiting data to be sent by telnet, for example. The reactor is registered for READ events. When telnet client connects, I write eight bytes in terminal. ACE_Reactors calls handle_input() , who tries to read the 8 bytes, and then (still inside
 handle_input() ) it does a schedule_cancel( ) on read events, and a schedule_wakeup for WRITE events. I think ACE_Reactor should call handle_ouput( ) , but it is never called, so I can send the answer to the client.&nbsp; Only handle_input( ) gets called.<br>  The idea is to control when I want to be notified for read or write in my Event Handler, because my protocol needs to exchange some packets syncronously in the right order. Is there any kind of read priorization over send outpur in the way ACE_reactor manage events? <br>  <br>  &nbsp;&nbsp;&nbsp; REPEAT BY:<br>  &nbsp;&nbsp;&nbsp; See test program<br>  <br>  &nbsp;&nbsp;&nbsp; SAMPLE FIX/WORKAROUND: ?<br>  <br>  My program is:<br>  <br>  #include "ace/ACE.h"<br>  #include "ace/INET_Addr.h"<br>  #include "ace/SOCK_Acceptor.h"<br>  #include "ace/Reactor.h"<br>  #include "ace/Acceptor.h"<br>  #include "ace/Select_Reactor.h"<br>  #include "ace/Svc_Handler.h"<br>   #include "ace/SOCK_Stream.h"<br>  <br>  // Test program
 to read 8 bytes, then echo them to the client<br>  // To test, compila the program,boot it,and do a telnet to 127.0.0.1 7020 port and send exactly 8 bytes<br>  // I have tryed also writng a simple sockets program that sends exactly 8 bytes<br>  // <br>  <br>  class MyEH : public ACE_Svc_Handler&lt;ACE_SOCK_STREAM, ACE_NULL_SYNCH&gt;<br>  {<br>  public:<br>  &nbsp;&nbsp;&nbsp; // Will wait 8 bytes,then answer to the client with them<br>  &nbsp;&nbsp;&nbsp; MyEH (): m_iLenData(8),m_iReceived(0){}<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; int open(void *p);<br>  &nbsp;&nbsp;&nbsp; int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE);<br>  &nbsp;&nbsp;&nbsp; int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);<br>  &nbsp;&nbsp;&nbsp; int handle_close (ACE_HANDLE handle,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Reactor_Mask close_mask);<br>  <br>   &nbsp;&nbsp;&nbsp; char
 m_pBuffer[256];<br>  &nbsp;&nbsp;&nbsp; int m_iLenData;<br>  &nbsp;&nbsp;&nbsp; int m_iReceived;<br>  };<br>  <br>  int MyEH::open (void *p)<br>  {<br>  &nbsp; ACE_TCHAR peer_name[MAXHOSTNAMELEN];<br>  &nbsp; ACE_INET_Addr peer_addr;<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp; if (this-&gt;peer().get_remote_addr (peer_addr) == 0 &amp;&amp;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; peer_addr.addr_to_string (peer_name, MAXHOSTNAMELEN) == 0)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("New incoming connection from %s\n",peer_name);<br>  &nbsp; <br>  &nbsp; if (reactor ()-&gt;register_handler (this, ACE_Event_Handler::READ_MASK ) == -1)<br>  &nbsp;&nbsp;&nbsp; printf("Read_Handler::open, cannot register handler\n");<br>  <br>  &nbsp; //peer().enable(ACE_NONBLOCK);<br>  &nbsp; <br>  &nbsp; return 0;<br>  }<br>  int MyEH::handle_input (ACE_HANDLE h)<br>  {<br>  &nbsp;&nbsp;&nbsp; size_t result;<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; printf("\nrecv(%d)
 HEADER  waiting %d bytes\n",h,m_iLenData - m_iReceived);<br>  &nbsp;&nbsp;&nbsp; result = ACE::recv_n (h,&amp;m_pBuffer[m_iReceived],m_iLenData - m_iReceived);<br>  &nbsp;&nbsp;&nbsp; if(result&lt;=0)<br>  &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(errno == EWOULDBLOCK)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("WOULDBLOCK\n");<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0;<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br>  &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; m_iReceived+= result;<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; if(m_iReceived == m_iLenData)<br>  &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pBuffer[m_iReceived] = 0;<br>  <br> 
 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  printf("recv(%d) DATA %d %s\n",h,m_iReceived,m_pBuffer);<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_iLenData = 8; // nest time,receive 8 again<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_iReceived = 0;<br>  &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp; else <br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return result;<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; printf("Received %d bytes.Setting IO\n",m_iReceived);<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; if (ACE_Reactor::instance ()-&gt;cancel_wakeup (this, ACE_Event_Handler::READ_MASK) == -1)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br>  &nbsp;&nbsp;&nbsp; printf("Input for %d disabled\n",h);<br>  &nbsp;&nbsp;&nbsp; if (ACE_Reactor::instance ()-&gt;schedule_wakeup (this, ACE_Event_Handler::WRITE_MASK) == -1)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp;
 <br>  &nbsp;&nbsp;&nbsp; printf("Output for %d  enabled\n",h);<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; return result;<br>  }<br>  <br>  int MyEH::handle_output (ACE_HANDLE h)<br>  {<br>  &nbsp;&nbsp;&nbsp; printf("\nhandle_output(%d) called\n",h);<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; int rc = ACE::send_n(h,m_pBuffer,strlen(m_pBuffer));<br>  &nbsp;&nbsp;&nbsp; if (rc &lt;= 0)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Error header send\n");<br>  &nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("HEADER %s sent %d\n",m_pBuffer,rc);<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; printf("handle_output() %d\n",rc);<br>  &nbsp;&nbsp;&nbsp; <br> &nbsp;&nbsp;&nbsp; if (ACE_Reactor::instance ()-&gt;cancel_wakeup&nbsp; (this, ACE_Event_Handler::WRITE_MASK) != -1)&nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Ouput for %d
 disabled\n",get_handle());<br>  &nbsp;&nbsp;&nbsp; if (ACE_Reactor::instance  ()-&gt;schedule_wakeup&nbsp; (this, ACE_Event_Handler::READ_MASK) == -1)<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; printf("Input for %d enabled\n",get_handle());<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; return rc;<br>  }<br>  <br>  int MyEH::handle_close (ACE_HANDLE,ACE_Reactor_Mask)<br>  {<br>  &nbsp;&nbsp;&nbsp; printf("Close\n");<br>  &nbsp;&nbsp;&nbsp; this-&gt;reactor ()-&gt;end_reactor_event_loop ();<br>  &nbsp;&nbsp;&nbsp; delete this;<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; return 0;<br>  }<br>  <br>  typedef ACE_Acceptor&lt;MyEH, ACE_SOCK_ACCEPTOR&gt; MyAcceptor;<br>  <br>  int main (int, ACE_TCHAR *[])<br>  {<br>  &nbsp;&nbsp;&nbsp; ACE_Select_Reactor select_reactor;<br>  &nbsp;&nbsp;&nbsp; ACE_Reactor reactor ((ACE_Reactor_Impl *)&amp;select_reactor);<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; ACE_INET_Addr
 listenAddress("127.0.0.1:7020");<br>  &nbsp;&nbsp;&nbsp; MyAcceptor acceptor;<br>  &nbsp;&nbsp;&nbsp;  <br>  &nbsp;&nbsp;&nbsp; acceptor.reactor (ACE_Reactor::instance (&amp;reactor));<br>  &nbsp;&nbsp;&nbsp; if (acceptor.open (listenAddress) == -1)<br>  &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Listen error\n");<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(0);&nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp; else<br>  &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Working...\n");<br>  &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp; <br>  &nbsp;&nbsp;&nbsp; reactor.run_reactor_event_loop ();<br>  <br>  &nbsp;&nbsp;&nbsp; return 0;<br>  }<p>&#32;
      <hr size=1>Be a better sports nut! Let your teams follow you 
with Yahoo Mobile. <a href="http://us.rd.yahoo.com/evt=51731/*http://mobile.yahoo.com/sports;_ylt=At9_qDKvtAbMuh1G1SQtBI7ntAcJ
">Try it now.</a>