Socket.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Socket.h,v 1.3 2009/05/25 20:20:10 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1995-1996 Sam Leffler
  4.  * Copyright (c) 1995-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #ifndef _Socket_
  27. #define _Socket_
  28. #include "Types.h" // includes port.h
  29. extern "C" {
  30. #include <sys/socket.h>
  31. #include <sys/un.h>
  32. #if HAS_NETERRNO_H
  33. #include <net/errno.h>
  34. #endif
  35. #include <netdb.h>
  36. #include <netinet/in.h>
  37. }
  38. /*
  39.  * Wrapper functions for C library socket calls.
  40.  *
  41.  * These exist to isolate system dependencies and to insure that
  42.  * proper type casts are done at the call sites.  Note that the
  43.  * actual number of functions in this class could be a lot larger;
  44.  * only those functions that potentially cause portability problems
  45.  * due to missing implicit casts of function parameters are included
  46.  * here.
  47.  *
  48.  * NB: socklen_t is defined based on a #define that configure writes
  49.  *     to port.h.  If this #define exists, then it should specify the
  50.  *     type of the call-by-reference parameters required by the
  51.  *     operating system (some vendors have changed this from int,
  52.  *     sometimes because of 64-bit reasons but mostly because they
  53.  *     did not properly consider the consequences).
  54.  */
  55. class Socket {
  56. public:
  57.     static int accept(int s, void* addr, socklen_t* addrlen);
  58.     static int bind(int s, const void* addr, socklen_t addrlen);
  59.     static int connect(int s, const void* addr, socklen_t addrlen);
  60.     static int getpeername(int s, void* name, socklen_t* namelen);
  61.     static int getsockname(int s, void* name, socklen_t* namelen);
  62.     static int setsockopt(int s, int level, int oname, const void* oval, socklen_t olen);
  63.     static struct hostent* gethostbyname(const char* name);
  64.     union Address
  65.     {
  66.     struct sockaddr s;
  67.     struct sockaddr_in in;
  68.     struct sockaddr_in6 in6;
  69.     struct sockaddr_un un;
  70.     operator struct sockaddr_in&() { return in; };
  71.     operator struct sockaddr_in6&() { return in6; };
  72.     operator struct sockaddr_un&() { return un; };
  73.     };
  74.     static socklen_t socklen(const Address& a);
  75.     static size_t addrlen(const Address& a);
  76.     static sa_family_t& family(Address& a);
  77.     static in_port_t& port(Address& a);
  78.     static void* addr (Address& a);
  79. };
  80. inline int Socket::accept(int s, void* addr, socklen_t* addrlen)
  81. {
  82. #ifdef CONFIG_HPUX_SOCKLEN_T_BRAINDAMAGE
  83.     return ::accept(s, (struct sockaddr*) addr, (int*)addrlen);
  84. #else
  85.     return ::accept(s, (struct sockaddr*) addr, addrlen);
  86. #endif
  87. }
  88. inline int Socket::bind(int s, const void* addr, socklen_t addrlen)
  89. {
  90.     return ::bind(s, (const struct sockaddr*) addr, addrlen);
  91. }
  92. inline int Socket::connect(int s, const void* addr, socklen_t addrlen)
  93. {
  94.     return ::connect(s, (const struct sockaddr*) addr, addrlen);
  95. }
  96. inline int Socket::getpeername(int s, void* name, socklen_t* namelen)
  97. {
  98. #ifdef CONFIG_HPUX_SOCKLEN_T_BRAINDAMAGE
  99.     return ::getpeername(s, (struct sockaddr*) name, (int*)namelen);
  100. #else
  101.     return ::getpeername(s, (struct sockaddr*) name, namelen);
  102. #endif
  103. }
  104. inline int Socket::getsockname(int s, void* name, socklen_t* namelen)
  105. {
  106. #ifdef CONFIG_HPUX_SOCKLEN_T_BRAINDAMAGE
  107.     return ::getsockname(s, (struct sockaddr*) name, (int*)namelen);
  108. #else
  109.     return ::getsockname(s, (struct sockaddr*) name, namelen);
  110. #endif
  111. }
  112. inline int Socket::setsockopt(int s, int level, int oname, const void* oval, socklen_t olen)
  113. {
  114.     return ::setsockopt(s, level, oname, (const char*) oval, olen);
  115. }
  116. inline struct hostent* Socket::gethostbyname(const char* name)
  117. {
  118.     return ::gethostbyname(name);
  119. }
  120. inline socklen_t Socket::socklen (const Address& a)
  121. {
  122.     switch (a.s.sa_family)
  123.     {
  124. case AF_INET:
  125. return sizeof(a.in);
  126. case AF_INET6:
  127. return sizeof(a.in6);
  128. case AF_UNIX:
  129. return sizeof(a.un);
  130.     }
  131.     return sizeof(a);
  132. }
  133. inline size_t Socket::addrlen (const Address& a)
  134. {
  135.     switch (a.s.sa_family)
  136.     {
  137. case AF_INET:
  138. return sizeof(a.in.sin_addr);
  139. case AF_INET6:
  140. return sizeof(a.in6.sin6_addr);
  141.     }
  142.     fxAssert(true, "Socket::addrlen on invalid Address");
  143.     return 0; // DEAD CODE
  144. }
  145. inline sa_family_t& Socket::family (Address& a)
  146. {
  147.     return a.s.sa_family;
  148. }
  149. inline in_port_t& Socket::port (Address& a)
  150. {
  151.     switch (a.s.sa_family)
  152.     {
  153. case AF_INET:
  154. return a.in.sin_port;
  155. case AF_INET6:
  156. return a.in6.sin6_port;
  157.     }
  158.     fxAssert(true, "Socket::port on invalid Address");
  159.     return a.in.sin_port; // DEAD CODE
  160. }
  161. inline void* Socket::addr (Address& a)
  162. {
  163.     switch (a.s.sa_family)
  164.     {
  165. case AF_INET:
  166.     return (void*) &a.in.sin_addr;
  167. case AF_INET6:
  168.     return (void*) &a.in6.sin6_addr;
  169. case AF_UNIX:
  170.     return (void*) &a.un.sun_path;
  171.     }
  172.     return NULL;
  173. }
  174. #endif /* _Socket_ */