Acceptor.tcc
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* Acceptor - Encapsulates the behaviour for a listening socket */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,18aug99,aim  SockAcceptor API changes
  7. 01g,12aug99,aim  fix handleInput
  8. 01f,10aug99,aim  fix SvcHandler leaks when accept fails
  9. 01e,13jul99,aim  syslog api changes
  10. 01d,07jul99,aim  prints info on new connection
  11. 01c,29jun99,aim  handleClose always calls m_acceptor.close
  12. 01b,05jun99,aim  removed unnecessary headers
  13. 01a,12may99,aim  created
  14. */
  15. template <class SVC_HANDLER, PEER_ACCEPTOR_1>
  16. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::operator PEER_ACCEPTOR& () const
  17.     {
  18.     return (PEER_ACCEPTOR &) m_acceptor;
  19.     }
  20. template <class SVC_HANDLER, PEER_ACCEPTOR_1> PEER_ACCEPTOR&
  21. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::acceptor () const
  22.     {
  23.     return (PEER_ACCEPTOR &) m_acceptor;
  24.     }
  25. template <class SVC_HANDLER, PEER_ACCEPTOR_1> REACTOR_HANDLE
  26. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::handleGet () const
  27.     {
  28.     return m_acceptor.handleGet ();
  29.     }
  30. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  31. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::open
  32.     (
  33.     const PEER_ACCEPTOR_ADDR& localAddr,
  34.     Reactor* reactor,
  35.     int reuseAddr
  36.     )
  37.     {
  38.     int result = m_acceptor.open (localAddr, reuseAddr);
  39.     if (result != -1)
  40. result = reactor->handlerAdd (this, EventHandler::ACCEPT_MASK);
  41.     if (result != -1)
  42. reactorSet (reactor);
  43.     return result;
  44.     }
  45. template <class SVC_HANDLER, PEER_ACCEPTOR_1>
  46. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::Acceptor (Reactor* reactor)
  47.     {
  48.     reactorSet (reactor);
  49.     }
  50. template <class SVC_HANDLER, PEER_ACCEPTOR_1>
  51. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::Acceptor
  52.     (
  53.     const PEER_ACCEPTOR_ADDR& addr,
  54.     Reactor* reactor,
  55.     int reuseAddr
  56.     )
  57.     {
  58.     reactorSet (reactor);
  59.     open (addr, reactor, reuseAddr);
  60.     }
  61. template <class SVC_HANDLER, PEER_ACCEPTOR_1>
  62. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::~Acceptor ()
  63.     {
  64.     handleClose ();
  65.     }
  66. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  67.     Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::close ()
  68.     {
  69.     return handleClose ();
  70.     }
  71. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  72. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::handleClose
  73.     (
  74.     REACTOR_HANDLE handle,
  75.     REACTOR_EVENT_MASK mask
  76.     )
  77.     {
  78.     m_acceptor.close ();
  79.     // Guard against multiple closes.
  80.     if (reactorGet () != 0)
  81. {
  82. // We must pass the DONT_CALL flag here to avoid recursion.
  83. REACTOR_EVENT_MASK mask = EventHandler::ACCEPT_MASK |
  84.   EventHandler::DONT_CALL;
  85. reactorGet()->handlerRemove (this, mask);
  86. }
  87.     return 0;
  88.     }
  89. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  90. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::newSvcHandler
  91.     (
  92.     SVC_HANDLER*& svcHandler
  93.     )
  94.     {
  95.     if (svcHandler == 0)
  96. svcHandler = new SVC_HANDLER(reactorGet ());
  97.     return svcHandler ? 0 : -1;
  98.     }
  99. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  100. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::acceptSvcHandler
  101.     (
  102.     SVC_HANDLER* svcHandler
  103.     )
  104.     {
  105.     if (svcHandler == 0)
  106. return -1;
  107.     
  108.     PEER_ACCEPTOR_ADDR peerAddr;
  109.     
  110.     if (m_acceptor.accept (svcHandler->stream (), peerAddr) < 0)
  111. return -1;
  112.     if (svcHandler->open (this) < 0)
  113. {
  114. svcHandler->close (); // close fd
  115. return -1;
  116. }
  117.     return 0;
  118.     }
  119. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  120. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::handleInput (REACTOR_HANDLE)
  121.     {
  122.     SVC_HANDLER* svcHandler = 0;
  123.     if (newSvcHandler (svcHandler) < 0)
  124. return 0; // always leave this Handler registered
  125.     if (acceptSvcHandler (svcHandler) < 0)
  126. {
  127. S_ERR(LOG_REACTOR|LOG_ERRNO, "acceptSvcHandler failed: " << (*svcHandler));
  128. DELZERO (svcHandler);
  129. }
  130.     else
  131. S_INFO(LOG_REACTOR, "connection: " << (*svcHandler));
  132.     
  133.     return 0; // always leave this Handler registered
  134.     }
  135. template <class SVC_HANDLER, PEER_ACCEPTOR_1> int
  136. Acceptor<SVC_HANDLER, PEER_ACCEPTOR_2>::hostAddrGet (PEER_ACCEPTOR_ADDR& sa)
  137.     {
  138.     return m_acceptor.hostAddrGet (sa);
  139.     }