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

VxWorks

开发平台:

C/C++

  1. /* SockAcceptor */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,17dec01,nel  Add include symbol for diab build.
  7. 01e,01feb00,nel  Correct casting for Linux debug build
  8. 01d,19aug99,aim  change assert to VXDCOM_ASSERT
  9. 01c,18aug99,aim  remove default parameter on accept
  10. 01b,05jun99,aim  removed hardcoded INETSockAddr assumptions
  11. 01a,11may99,aim  created
  12. */
  13. #include "stdio.h"
  14. #include "errno.h"
  15. #include "SockAcceptor.h"
  16. #include "TraceCall.h"
  17. /* Include symbol for diab */
  18. extern "C" int include_vxdcom_SockAcceptor (void)
  19.     {
  20.     return 0;
  21.     }
  22. SockAcceptor::SockAcceptor ()
  23.     {
  24.     TRACE_CALL;
  25.     }
  26. SockAcceptor::~SockAcceptor ()
  27.     {
  28.     TRACE_CALL;
  29.     }
  30. SockAcceptor::SockAcceptor
  31.     (
  32.     const SockAddr& sa,
  33.     int reuseAddr, 
  34.     int protocolFamily,
  35.     int backlog, 
  36.     int protocol
  37.     )
  38.     {
  39.     TRACE_CALL;
  40.     open (sa, reuseAddr, protocolFamily, backlog, protocol);
  41.     }
  42. int
  43. SockAcceptor::open
  44.     (
  45.     const SockAddr& sa,
  46.     int reuseAddr,
  47.     int protocolFamily, 
  48.     int backlog, 
  49.     int protocol
  50.     )
  51.     {
  52.     TRACE_CALL;
  53.     if (SockEP::open (SOCK_STREAM, protocolFamily, protocol, reuseAddr) != -1)
  54. {
  55. sockaddr* laddr = 0;
  56. if (sa.clone (laddr) != -1)
  57.     {
  58.     size_t size = sa.size ();
  59.     if (::bind (handleGet (), laddr, size) < 0)
  60. close ();
  61.     else if (::listen (handleGet (), backlog) < 0)
  62. close ();
  63.     }
  64. delete laddr;
  65. }
  66.     
  67.     return handleInvalid () ? -1 : 0;
  68.     }
  69. int
  70. SockAcceptor::accept
  71.     (
  72.     SockStream& newStream,
  73.     SockAddr& peerAddr
  74.     )
  75.     {
  76.     TRACE_CALL;
  77.     REACTOR_HANDLE newHandle = INVALID_REACTOR_HANDLE;
  78.     int len = peerAddr.size ();
  79.     do // blocking accept
  80.         {
  81. #ifdef VXDCOM_PLATFORM_LINUX
  82.         newHandle = ::accept (handleGet (), 
  83.                               peerAddr, 
  84.                               reinterpret_cast <socklen_t *> (&len));
  85. #else
  86.         newHandle = ::accept (handleGet (), peerAddr, &len);
  87. #endif
  88.         }
  89.     while (newHandle < 0 && errno == EINTR);
  90.     if (newHandle != INVALID_REACTOR_HANDLE)
  91. newStream.handleSet (newHandle);
  92.     return newHandle == INVALID_REACTOR_HANDLE ? -1 : 0;
  93.     }