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

VxWorks

开发平台:

C/C++

  1. /* SockEP */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01n,17dec01,nel  Add include symbol for diab build.
  7. 01m,13jul01,dbs  fix up includes
  8. 01l,01feb00,nel  Correct casting for Linux debug build
  9. 01k,19jan00,nel  Modifications for Linux debug build
  10. 01j,19aug99,aim  change assert to VXDCOM_ASSERT
  11. 01i,10aug99,aim  fix hostAddrGet and peerAddrGet on target
  12. 01h,30jul99,aim  add keepAliveSet method
  13. 01g,13jul99,aim  syslog api changes
  14. 01f,12jul99,aim  removed debug
  15. 01e,30jun99,aim  close only calls handleGet once
  16. 01d,28jun99,aim  close handle if optReuseAddrSet fails
  17. 01c,17jun99,aim  changed assert to assert
  18. 01b,04jun99,aim  added syslog messages
  19. 01a,10may99,aim  created
  20. */
  21. #include "ReactorTypes.h"
  22. #include "SockEP.h"
  23. #include "TraceCall.h"
  24. #include "private/comMisc.h"
  25. /* Include symbol for diab */
  26. extern "C" int include_vxdcom_SockEP (void)
  27.     {
  28.     return 0;
  29.     }
  30. SockEP::SockEP ()
  31.     {
  32.     TRACE_CALL;
  33. #ifdef VXDCOM_PLATFORM_WIN32
  34.     COM_ASSERT (winsockInitialised);
  35. #endif
  36.     }
  37. SockEP::~SockEP ()
  38.     {
  39.     TRACE_CALL;
  40.     if (handleIsValid ())
  41. close ();
  42.     }
  43. SockEP::SockEP
  44.     (
  45.     int type,
  46.     int protocol_family,
  47.     int protocol,
  48.     int reuseAddr
  49.     )
  50.     {
  51.     TRACE_CALL;
  52.     open (type, protocol_family, protocol, reuseAddr);
  53.     }
  54. int
  55. SockEP::optGet
  56.     (
  57.     int level,
  58.     int option,
  59.     void* optval,
  60.     int* optlen
  61.     ) const
  62.     {
  63.     TRACE_CALL;
  64. #ifdef VXDCOM_PLATFORM_LINUX
  65.     return ::getsockopt (handleGet (),
  66.  level,
  67.  option,
  68.  (char *) optval, 
  69.  reinterpret_cast <unsigned int *>(optlen));
  70. #else
  71.     return ::getsockopt (handleGet (),
  72.  level,
  73.  option,
  74.  (char *) optval, 
  75.  optlen);
  76. #endif
  77.     }
  78. int
  79. SockEP::optSet
  80.     (
  81.     int level,
  82.     int option,
  83.     void* optval,
  84.     int optlen
  85.     ) const
  86.     {
  87.     TRACE_CALL;
  88.     return ::setsockopt (handleGet (),
  89.  level,
  90.  option,
  91.  (char *) optval, 
  92.  optlen);
  93.     }
  94. int
  95. SockEP::optReuseAddrSet ()
  96.     {
  97.     TRACE_CALL;
  98.     int one = 1;
  99.     return optSet (SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
  100.     }
  101. int
  102. SockEP::optKeepAliveSet ()
  103.     {
  104.     TRACE_CALL;
  105.     int one = 1;
  106.     return optSet (SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
  107.     }
  108. int
  109. SockEP::open
  110.     (
  111.     int type,
  112.     int protocol_family, 
  113.     int protocol,
  114.     int reuseAddr,
  115.     int keepalive
  116.     )
  117.     {
  118.     TRACE_CALL;
  119.     int fd = ::socket (protocol_family, type, protocol);
  120.     if (fd != INVALID_REACTOR_HANDLE)
  121. {
  122. handleSet (fd);
  123. if (protocol_family != PF_UNIX && reuseAddr)
  124.     if (optReuseAddrSet () < 0)
  125. {
  126. close ();
  127. fd = -1;
  128. }
  129. if (keepalive)
  130.     if (optKeepAliveSet () < 0)
  131. {
  132. close ();
  133. fd = -1;
  134. }
  135. }
  136.     return fd;
  137.     }
  138. int
  139. SockEP::close ()
  140.     {
  141.     TRACE_CALL;
  142.     int result = -1;
  143.     REACTOR_HANDLE handle = handleGet ();
  144.     if (handle != INVALID_REACTOR_HANDLE)
  145. {
  146. #ifdef VXDCOM_PLATFORM_WIN32
  147. result = ::closesocket (handle);
  148. #else
  149. // result = ::shutdown (handleGet (), 2);
  150. result = ::close (handle);
  151. #endif
  152. }
  153.     handleSet (INVALID_REACTOR_HANDLE);
  154.     return result;
  155.     }
  156. int
  157. SockEP::hostAddrGet (SockAddr& sa) const
  158.     {
  159.     TRACE_CALL;
  160.     int len = sa.size ();
  161.     sockaddr *addr = sa.addr ();
  162.     if (handleInvalid ())
  163. return -1;
  164. #if defined(VXDCOM_PLATFORM_VXWORKS)
  165.     if (::getsockname (handleGet (), addr, &len) == ERROR)
  166. return -1;
  167. #elif defined(VXDCOM_PLATFORM_SOLARIS)
  168.     if (::getsockname (handleGet (), addr, &len) < 0)
  169. return -1;
  170. #elif defined(VXDCOM_PLATFORM_LINUX)
  171.     if (::getsockname (handleGet (),                                                                   addr, 
  172.                        reinterpret_cast <socklen_t *> (&len)) < 0)
  173. return -1;
  174. #else
  175.     return -1;
  176. #endif
  177.     COM_ASSERT (len == sa.size());
  178.     return 0;
  179.     }
  180. int
  181. SockEP::peerAddrGet (SockAddr& sa) const
  182.     {
  183.     TRACE_CALL;
  184.     int len = sa.size ();
  185.     sockaddr *addr = sa.addr ();
  186.     if (handleInvalid ())
  187. return -1;
  188. #if defined(VXDCOM_PLATFORM_VXWORKS)
  189.     if (::getpeername (handleGet (), addr, &len) == ERROR)
  190. return -1;
  191. #elif defined(VXDCOM_PLATFORM_SOLARIS)
  192.     if (::getpeername (handleGet (), addr, &len) < 0)
  193. return -1;
  194. #elif defined(VXDCOM_PLATFORM_LINUX)
  195.     if (::getpeername (handleGet (), 
  196.                        addr, 
  197.                        reinterpret_cast <socklen_t *> (&len)) < 0)
  198. return -1;
  199. #else
  200.     return -1;
  201. #endif
  202.     COM_ASSERT (len == sa.size());
  203.     return 0;
  204.     }
  205. ostream& 
  206. operator<< (ostream& os, const SockEP& s)
  207.     {
  208.     TRACE_CALL;
  209.     os << "SockEP(" << s.handleGet () << ")";
  210.     return os;
  211.     }
  212. #ifdef VXDCOM_PLATFORM_WIN32
  213. //////////////////////////////////////////////////////////////////////////
  214. //
  215. // winsockInit -- Win32-specific function to initialise the TCP stack.
  216. //
  217. static int winsockInit ()
  218.     {
  219.     WORD wVersionRequested = MAKEWORD (1, 1);
  220.     WSADATA wsaData; 
  221.  
  222.     int err = WSAStartup (wVersionRequested, &wsaData);
  223.     if (err)
  224.         {
  225.         // Couldn't get useable WINSOCK version...
  226.         return 0;
  227.         }
  228.     else
  229.         {
  230.         // Loaded WINSOCK - check for correct version...
  231.         if (LOBYTE (wsaData.wVersion) != 1 ||
  232.             HIBYTE (wsaData.wVersion) != 1)
  233.             {
  234.             // Not right version...
  235.             WSACleanup (); 
  236.             return 0;
  237.             }
  238.         }
  239.     return 1;
  240.     }
  241. static int winsockInitialised = winsockInit ();
  242. #endif // VXDCOM_PLATFORM_WIN32
  243.