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

VxWorks

开发平台:

C/C++

  1. /* INETSockAddr */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,17dec01,nel  Add include symbol for diab build.
  7. 01i,16nov99,nel  Correct type usage in INETSockAddr :: setAddr
  8. 01h,19aug99,aim  added TraceCall header
  9. 01g,16jul99,dbs  fix address-equality
  10. 01f,15jul99,dbs  add equality op
  11. 01e,23jun99,aim  fix hostAddrGet on vxWorks
  12. 01d,15jun99,aim  changed hostAddrGet to return dotted ip number
  13. 01c,05jun99,aim  added clone method
  14. 01b,03jun99,dbs  fix for OS-specifics
  15. 01a,11may99,aim  created
  16. */
  17. #include "INETSockAddr.h"
  18. #include "TraceCall.h"
  19. /* Include symbol for diab */
  20. extern "C" int include_vxdcom_INETSockAddr (void)
  21.     {
  22.     return 0;
  23.     }
  24. INETSockAddr::INETSockAddr ()
  25.     {
  26.     TRACE_CALL;
  27.     (void) ::memset (addr_in(), 0, size ());
  28.     sin_family      = PF_INET;
  29.     sin_addr.s_addr = htonl(INADDR_ANY);
  30.     sin_port        = 0;
  31.     }
  32.  
  33. INETSockAddr::INETSockAddr (int port)
  34.     {
  35.     TRACE_CALL;
  36.     (void) ::memset (addr_in(), 0, size ());
  37.     sin_family      = PF_INET;
  38.     sin_addr.s_addr = htonl(INADDR_ANY);
  39.     sin_port        = htons (port);
  40.     }
  41. INETSockAddr::INETSockAddr (unsigned long address, int port)
  42.     {
  43.     TRACE_CALL;
  44.     (void) ::memset (addr_in(), 0, size ());
  45.     sin_family      = PF_INET;
  46.     sin_addr.s_addr = htonl (address);
  47.     sin_port        = htons (port);
  48.     }
  49. INETSockAddr::INETSockAddr (const char* hostname, int port)
  50.     {
  51.     TRACE_CALL;
  52.     (void) ::memset (addr_in(), 0, size ());
  53.     sin_port = htons (port);
  54.     setAddr (hostname); // sets sin_family
  55.     }
  56. INETSockAddr::~INETSockAddr ()
  57.     {
  58.     TRACE_CALL;
  59.     }
  60. int
  61. INETSockAddr::setAddr (const char* address)
  62.     {
  63.     TRACE_CALL;
  64.     sin_family = PF_UNSPEC;
  65.     sin_addr.s_addr = ::inet_addr (const_cast<char *> (address) );
  66.     if (sin_addr.s_addr == (unsigned long) -1) // inet_addr failure
  67. {
  68. #ifndef VXDCOM_PLATFORM_VXWORKS
  69. hostent* hp = ::gethostbyname (address);
  70. if (hp != 0)
  71.     {
  72.     (void) ::memcpy (&sin_addr.s_addr, hp->h_addr, hp->h_length);
  73.     sin_family = hp->h_addrtype;
  74.     }
  75. #else
  76. // Only PF_INET supported on VxWorks
  77. sin_addr.s_addr = ::hostGetByName (const_cast<char*> (address));
  78. sin_family = PF_INET;
  79. #endif
  80. }
  81.     else
  82. {
  83. sin_family = PF_INET;
  84. }
  85.     return sin_family == PF_INET;
  86.     }
  87. int
  88. INETSockAddr::size () const
  89.     {
  90.     TRACE_CALL;
  91.     return (sizeof (sockaddr_in));
  92.     }
  93. sockaddr*
  94. INETSockAddr::addr ()
  95.     {
  96.     TRACE_CALL;
  97.     return reinterpret_cast<sockaddr*> (addr_in());
  98.     }
  99. INETSockAddr::operator sockaddr* ()
  100.     {
  101.     TRACE_CALL;
  102.     return addr ();
  103.     }
  104. int
  105. INETSockAddr::family () const
  106.     {
  107.     TRACE_CALL;
  108.     return PF_INET;
  109.     }
  110. sockaddr_in*
  111. INETSockAddr::addr_in ()
  112.     {
  113.     TRACE_CALL;
  114.     return dynamic_cast<sockaddr_in*> (this);
  115.     }
  116. INETSockAddr::operator sockaddr_in* ()
  117.     {
  118.     TRACE_CALL;
  119.     return dynamic_cast<sockaddr_in*> (this);
  120.     }
  121. const sockaddr_in*
  122. INETSockAddr::addr_in () const
  123.     {
  124.     TRACE_CALL;
  125.     return static_cast<const sockaddr_in*> (this);
  126.     }
  127. INETSockAddr::operator const sockaddr_in* () const
  128.     {
  129.     TRACE_CALL;
  130.     return static_cast<const sockaddr_in*> (this);
  131.     }
  132. int
  133. INETSockAddr::portGet () const
  134.     {
  135.     TRACE_CALL;
  136.     return ntohs (sin_port);
  137.     }
  138. int
  139. INETSockAddr::hostAddrGet (char* hostAddr, int len) const
  140.     {
  141.     TRACE_CALL;
  142.     in_addr internet_addr = sin_addr;
  143.     if (internet_addr.s_addr == INADDR_ANY)
  144. {
  145. #ifndef VXDCOM_PLATFORM_VXWORKS
  146. if (::gethostname (hostAddr, len) < 0)
  147.     return -1;
  148. hostent* hp = 0;
  149. if ((hp = ::gethostbyname (hostAddr)) < 0)
  150.     return -1;
  151. (void) ::memcpy (&internet_addr.s_addr,
  152.  hp->h_addr,
  153.  sizeof (internet_addr.s_addr));
  154. #else
  155. if (::gethostname (hostAddr, len) == ERROR)
  156.     return -1;
  157. int addr = ::hostGetByName (hostAddr);
  158. (void) ::memcpy (&internet_addr.s_addr,
  159.  &addr,
  160.  sizeof (internet_addr.s_addr));
  161. #endif
  162. }
  163.     char* dottedName = ::inet_ntoa (internet_addr);
  164.     if (dottedName != 0)
  165. ::strncpy (hostAddr, dottedName, len);
  166.     return dottedName != 0 ? 0 : -1;
  167.     }
  168. int
  169. INETSockAddr::familyNameGet (char* buf, int len) const
  170.     {
  171.     TRACE_CALL;
  172.     ::strncpy (buf, "INET", len);
  173.     return 0;
  174.     }
  175. int
  176. INETSockAddr::clone (sockaddr*& buf) const
  177.     {
  178.     TRACE_CALL;
  179.     buf = 0;
  180.     sockaddr_in* sin_addr = new sockaddr_in (*addr_in ());
  181.     if (sin_addr)
  182. buf = reinterpret_cast<sockaddr*> (sin_addr);
  183.     return buf ? 0 : -1;
  184.     }
  185. bool INETSockAddr::operator == (const INETSockAddr& other) const
  186.     {
  187.     return (memcmp (static_cast<const sockaddr_in*> (this),
  188.     static_cast<const sockaddr_in*> (&other),
  189.     size ()) == 0);
  190.     }