ipsock.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:18k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ipsock.h
  3.  *
  4.  * Internet Protocol socket I/O channel class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: ipsock.h,v $
  30.  * Revision 1.43  2000/06/26 11:17:19  robertj
  31.  * Nucleus++ port (incomplete).
  32.  *
  33.  * Revision 1.42  1999/09/10 04:35:42  robertj
  34.  * Added Windows version of PIPSocket::GetInterfaceTable() function.
  35.  *
  36.  * Revision 1.41  1999/09/10 02:31:42  craigs
  37.  * Added interface table routines
  38.  *
  39.  * Revision 1.40  1999/08/30 02:21:03  robertj
  40.  * Added ability to listen to specific interfaces for IP sockets.
  41.  *
  42.  * Revision 1.39  1999/08/08 09:04:01  robertj
  43.  * Added operator>> for PIPSocket::Address class.
  44.  *
  45.  * Revision 1.38  1999/03/09 02:59:50  robertj
  46.  * Changed comments to doc++ compatible documentation.
  47.  *
  48.  * Revision 1.37  1999/02/23 07:19:22  robertj
  49.  * Added [] operator PIPSocket::Address to get the bytes out of an IP address.
  50.  *
  51.  * Revision 1.36  1999/02/16 08:12:00  robertj
  52.  * MSVC 6.0 compatibility changes.
  53.  *
  54.  * Revision 1.35  1998/12/21 07:22:50  robertj
  55.  * Virtualised functions for SOCKS support.
  56.  *
  57.  * Revision 1.34  1998/12/18 04:34:14  robertj
  58.  * PPC Linux GNU C compatibility.
  59.  *
  60.  * Revision 1.33  1998/11/30 08:57:32  robertj
  61.  * New directory structure
  62.  *
  63.  * Revision 1.32  1998/11/22 11:30:08  robertj
  64.  * Check route table function to get a list
  65.  *
  66.  * Revision 1.31  1998/11/19 05:18:22  robertj
  67.  * Added route table manipulation functions to PIPSocket class.
  68.  *
  69.  * Revision 1.30  1998/09/23 06:20:45  robertj
  70.  * Added open source copyright license.
  71.  *
  72.  * Revision 1.29  1997/12/11 10:28:57  robertj
  73.  * Added operators for IP address to DWORD conversions.
  74.  *
  75.  * Revision 1.28  1996/12/17 11:08:05  robertj
  76.  * Added DNS name cache clear command.
  77.  *
  78.  * Revision 1.27  1996/11/30 12:10:00  robertj
  79.  * Added Connect() variant so can set the local port number on link.
  80.  *
  81.  * Revision 1.26  1996/11/16 10:48:49  robertj
  82.  * Fixed missing const in PIPSocket::Address stream output operator..
  83.  *
  84.  * Revision 1.25  1996/11/04 03:40:54  robertj
  85.  * Moved address printer from inline to source.
  86.  *
  87.  * Revision 1.24  1996/09/14 13:09:21  robertj
  88.  * Major upgrade:
  89.  *   rearranged sockets to help support IPX.
  90.  *   added indirect channel class and moved all protocols to descend from it,
  91.  *   separating the protocol from the low level byte transport.
  92.  *
  93.  * Revision 1.23  1996/08/25 09:33:55  robertj
  94.  * Added function to detect "local" host name.
  95.  *
  96.  * Revision 1.22  1996/03/26 00:51:13  robertj
  97.  * Added GetLocalAddress() variant that returns port number as well.
  98.  *
  99.  * Revision 1.21  1996/03/16 04:41:30  robertj
  100.  * Changed all the get host name and get host address functions to be more consistent.
  101.  *
  102.  * Revision 1.20  1996/03/03 07:37:56  robertj
  103.  * Added Reusability clause to the Listen() function on sockets.
  104.  *
  105.  * Revision 1.19  1996/02/25 03:00:31  robertj
  106.  * Added operator<< to PIPSocket::Address.
  107.  * Moved some socket functions to platform dependent code.
  108.  *
  109.  * Revision 1.18  1996/02/08 12:11:19  robertj
  110.  * Added GetPeerAddress that returns a port.
  111.  *
  112.  * Revision 1.17  1996/01/28 14:07:31  robertj
  113.  * Changed service parameter to PString for ease of use in GetPortByService function
  114.  * Fixed up comments.
  115.  *
  116.  * Revision 1.16  1995/12/23 03:44:59  robertj
  117.  * Fixed unix portability issues.
  118.  *
  119.  * Revision 1.15  1995/12/10 11:32:11  robertj
  120.  * Numerous fixes for sockets.
  121.  *
  122.  * Revision 1.14  1995/10/14 14:57:26  robertj
  123.  * Added internet address to string conversion functionality.
  124.  *
  125.  * Revision 1.13  1995/07/02 01:18:19  robertj
  126.  * Added static functions to get the current host name/address.
  127.  *
  128.  * Revision 1.12  1995/06/17 00:41:40  robertj
  129.  * More logical design of port numbers and service names.
  130.  *
  131.  * Revision 1.11  1995/03/18 06:26:44  robertj
  132.  * Changed IP address variable for GNU compatibility.
  133.  *
  134.  * Revision 1.10  1995/03/14  12:41:38  robertj
  135.  * Updated documentation to use HTML codes.
  136.  *
  137.  * Revision 1.9  1995/03/12  04:38:41  robertj
  138.  * Added more functionality.
  139.  *
  140.  * Revision 1.8  1995/01/02  12:28:24  robertj
  141.  * Documentation.
  142.  * Added more socket functions.
  143.  *
  144.  * Revision 1.7  1995/01/01  01:07:33  robertj
  145.  * More implementation.
  146.  *
  147.  * Revision 1.6  1994/12/15  12:47:14  robertj
  148.  * Documentation.
  149.  *
  150.  * Revision 1.5  1994/08/23  11:32:52  robertj
  151.  * Oops
  152.  *
  153.  * Revision 1.4  1994/08/22  00:46:48  robertj
  154.  * Added pragma fro GNU C++ compiler.
  155.  *
  156.  * Revision 1.3  1994/08/21  23:43:02  robertj
  157.  * Spelt Berkeley correctly.
  158.  *
  159.  * Revision 1.2  1994/07/25  03:36:03  robertj
  160.  * Added sockets to common, normalising to same comment standard.
  161.  *
  162.  */
  163. #define _PIPSOCKET
  164. #ifdef __GNUC__
  165. #pragma interface
  166. #endif
  167. #ifndef _PSOCKET
  168. #include <ptlib/socket.h>
  169. #endif
  170. /** This class describes a type of socket that will communicate using the
  171.    Internet Protocol.
  172.  */
  173. class PIPSocket : public PSocket
  174. {
  175.   PCLASSINFO(PIPSocket, PSocket);
  176.   protected:
  177.     /* Create a new Internet Protocol socket based on the port number
  178.        specified.
  179.      */
  180.     PIPSocket();
  181.   public:
  182.     /**
  183.       A class describing an IP address
  184.      */
  185.     class Address : public in_addr {
  186.       public:
  187.         /**@name Address constructors */
  188.         //@{
  189.         /// Create an IP address with the default address
  190.         Address();
  191.         /// Create an IP address with the default address
  192.         Address(const PString & dotNotation);
  193.         /// Create an IP address from four byte values
  194.         Address(BYTE b1, BYTE b2, BYTE b3, BYTE b4);
  195.         /// Create an IP address from a four byte value in network byte order
  196.         Address(DWORD dw);
  197.         /// Create an IP address from an in_addr structure
  198.         Address(const in_addr & addr);
  199.         /// Copy an address from another Address
  200.         Address(const Address & addr);
  201. #ifdef __NUCLEUS_NET__
  202.         Address(const struct id_struct & addr);
  203.         Address & operator=(const struct id_struct & addr);
  204. #endif
  205.         /// Copy an address from another Address
  206.         Address & operator=(const in_addr & addr);
  207.         /// Copy an address from another Address
  208.         Address & operator=(const Address & addr);
  209.         /// Copy an address from a string
  210.         Address & operator=(const PString & dotNotation);
  211.         /// Copy an address from a four byte value in network order
  212.         Address & operator=(DWORD dw);
  213.         //@}
  214.         /// Format an address as a string
  215.         PString AsString() const;
  216.         /// Format an address as a string
  217.         operator PString() const;
  218.         /// Return address in network order
  219.         operator DWORD() const;
  220.         /// Return first byte of IP address
  221.         BYTE Byte1() const;
  222.         /// Return second byte of IP address
  223.         BYTE Byte2() const;
  224.         /// Return third byte of IP address
  225.         BYTE Byte3() const;
  226.         /// Return fourth byte of IP address
  227.         BYTE Byte4() const;
  228.         /// return specified byte of IP address
  229.         BYTE operator[](PINDEX idx) const;
  230.         /// output address as a string to the specified string
  231.         friend ostream & operator<<(ostream & s, const Address & a);
  232.         /// output address as a string to the specified string
  233.         friend istream & operator>>(istream & s, Address & a);
  234.     };
  235.   // Overrides from class PChannel
  236.     /** Get the platform and I/O channel type name of the channel. For an IP
  237.        socket this returns the host name of the peer the socket is connected
  238.        to, followed by the socket number it is connected to.
  239.        @return
  240.        the name of the channel.
  241.      */
  242.     virtual PString GetName() const;
  243.   // Overrides from class PSocket.
  244.     /** Connect a socket to a remote host on the specified port number. This is
  245.        typically used by the client or initiator of a communications channel.
  246.        This connects to a "listening" socket at the other end of the
  247.        communications channel.
  248.        The port number as defined by the object instance construction or the
  249.        #PIPSocket::SetPort()# function.
  250.        @return
  251.        TRUE if the channel was successfully connected to the remote host.
  252.      */
  253.     virtual BOOL Connect(
  254.       const PString & address   /// Address of remote machine to connect to.
  255.     );
  256.     virtual BOOL Connect(
  257.       const Address & addr      /// Address of remote machine to connect to.
  258.     );
  259.     virtual BOOL Connect(
  260.       WORD localPort,           /// Local port number for connection
  261.       const Address & addr      /// Address of remote machine to connect to.
  262.     );
  263.     /** Listen on a socket for a remote host on the specified port number. This
  264.        may be used for server based applications. A "connecting" socket begins
  265.        a connection by initiating a connection to this socket. An active socket
  266.        of this type is then used to generate other "accepting" sockets which
  267.        establish a two way communications channel with the "connecting" socket.
  268.        If the #port# parameter is zero then the port number as
  269.        defined by the object instance construction or the
  270.        #PIPSocket::SetPort()# function.
  271.        For the UDP protocol, the #queueSize# parameter is ignored.
  272.        @return
  273.        TRUE if the channel was successfully opened.
  274.      */
  275.     virtual BOOL Listen(
  276.       unsigned queueSize = 5,  /// Number of pending accepts that may be queued.
  277.       WORD port = 0,           /// Port number to use for the connection.
  278.       Reusability reuse = AddressIsExclusive /// Can/Cant listen more than once.
  279.     );
  280.     virtual BOOL Listen(
  281.       const Address & bind,     /// Local interface address to bind to.
  282.       unsigned queueSize = 5,   /// Number of pending accepts that may be queued.
  283.       WORD port = 0,            /// Port number to use for the connection.
  284.       Reusability reuse = AddressIsExclusive /// Can/Can't listen more than once.
  285.     );
  286.   // New functions for class
  287.     /** Get the "official" host name for the host specified or if none, the host
  288.        this process is running on. The host may be specified as an IP number
  289.        or a hostname alias and is resolved to the canonical form.
  290.        @return
  291.        Name of the host or IP number of host.
  292.      */
  293.     static PString GetHostName();
  294.     static PString GetHostName(
  295.       const PString & hostname  /// Hosts IP address to get name for
  296.     );
  297.     static PString GetHostName(
  298.       const Address & addr    /// Hosts IP address to get name for
  299.     );
  300.     /** Get the Internet Protocol address for the specified host, or if none
  301.        specified, for the host this process is running on.
  302.        @return
  303.        TRUE if the IP number was returned.
  304.      */
  305.     static BOOL GetHostAddress(
  306.       Address & addr    /// Variable to receive hosts IP address
  307.     );
  308.     static BOOL GetHostAddress(
  309.       const PString & hostname,
  310.       /* Name of host to get address for. This may be either a domain name or
  311.          an IP number in "dot" format.
  312.        */
  313.       Address & addr    /// Variable to receive hosts IP address
  314.     );
  315.     /** Get the alias host names for the specified host. This includes all DNS
  316.        names, CNAMEs, names in the local hosts file and IP numbers (as "dot"
  317.        format strings) for the host.
  318.        @return
  319.        array of strings for each alias for the host.
  320.      */
  321.     static PStringArray GetHostAliases(
  322.       const PString & hostname
  323.       /* Name of host to get address for. This may be either a domain name or
  324.          an IP number in "dot" format.
  325.        */
  326.     );
  327.     static PStringArray GetHostAliases(
  328.       const Address & addr    /// Hosts IP address
  329.       /* Name of host to get address for. This may be either a domain name or
  330.          an IP number in "dot" format.
  331.        */
  332.     );
  333.     /** Determine if the specified host is actually the local machine. This
  334.        can be any of the host aliases or multi-homed IP numbers or even
  335.        the special number 127.0.0.1 for the loopback device.
  336.        @return
  337.        TRUE if the host is the local machine.
  338.      */
  339.     static BOOL IsLocalHost(
  340.       const PString & hostname
  341.       /* Name of host to get address for. This may be either a domain name or
  342.          an IP number in "dot" format.
  343.        */
  344.     );
  345.     /** Get the Internet Protocol address for the local host.
  346.        @return
  347.        TRUE if the IP number was returned.
  348.      */
  349.     virtual BOOL GetLocalAddress(
  350.       Address & addr    /// Variable to receive hosts IP address
  351.     );
  352.     virtual BOOL GetLocalAddress(
  353.       Address & addr,    /// Variable to receive peer hosts IP address
  354.       WORD & port        /// Variable to receive peer hosts port number
  355.     );
  356.     /** Get the Internet Protocol address for the peer host the socket is
  357.        connected to.
  358.        @return
  359.        TRUE if the IP number was returned.
  360.      */
  361.     virtual BOOL GetPeerAddress(
  362.       Address & addr    /// Variable to receive hosts IP address
  363.     );
  364.     virtual BOOL GetPeerAddress(
  365.       Address & addr,    /// Variable to receive peer hosts IP address
  366.       WORD & port        /// Variable to receive peer hosts port number
  367.     );
  368.     /** Get the host name for the local host.
  369.        @return
  370.        Name of the host, or an empty string if an error occurs.
  371.      */
  372.     PString GetLocalHostName();
  373.     /** Get the host name for the peer host the socket is connected to.
  374.        @return
  375.        Name of the host, or an empty string if an error occurs.
  376.      */
  377.     PString GetPeerHostName();
  378.     /** Clear the name (DNS) cache.
  379.      */
  380.     static void ClearNameCache();
  381.     /** Get the IP address that is being used as the gateway, that is, the
  382.        computer that packets on the default route will be sent.
  383.        The string returned may be used in the Connect() function to open that
  384.        interface.
  385.        Note that the driver does not need to be open for this function to work.
  386.        @return
  387.        TRUE if there was a gateway.
  388.      */
  389.     static BOOL GetGatewayAddress(
  390.       Address & addr     /// Variable to receive the IP address.
  391.     );
  392.     /** Get the name for the interface that is being used as the gateway,
  393.        that is, the interface that packets on the default route will be sent.
  394.        The string returned may be used in the Connect() function to open that
  395.        interface.
  396.        Note that the driver does not need to be open for this function to work.
  397.        @return
  398.        String name of the gateway device, or empty string if there is none.
  399.      */
  400.     static PString GetGatewayInterface();
  401.     /**
  402.        Describes a route table entry
  403.     */
  404.     class RouteEntry : public PObject
  405.     {
  406.       PCLASSINFO(RouteEntry, PObject);
  407.       public:
  408.         /// create a route table entry from an IP address
  409.         RouteEntry(const Address & addr) : network(addr) { }
  410.         /// Get the network address associated with the route table entry
  411.         Address GetNetwork() const { return network; }
  412.         /// Get the network address mask associated with the route table entry
  413.         Address GetNetMask() const { return net_mask; }
  414.         /// Get the default gateway address associated with the route table entry
  415.         Address GetDestination() const { return destination; }
  416.         /// Get the network address name associated with the route table entry
  417.         const PString & GetInterface() const { return interfaceName; }
  418.         /// Get the network metric associated with the route table entry
  419.         long GetMetric() const { return metric; }
  420.       protected:
  421.         Address network;
  422.         Address net_mask;
  423.         Address destination;
  424.         PString interfaceName;
  425.         long    metric;
  426.       friend class PIPSocket;
  427.     };
  428.     PLIST(RouteTable, RouteEntry);
  429.     /** Get the systems route table.
  430.        @return
  431.        TRUE if the route table is returned, FALSE if an error occurs.
  432.      */
  433.     static BOOL GetRouteTable(
  434.       RouteTable & table      /// Route table
  435.     );
  436.     /**
  437.       Describes an interface table entry
  438.      */
  439.     class InterfaceEntry : public PObject
  440.     {
  441.       PCLASSINFO(InterfaceEntry, PObject)
  442.       public:
  443.         /// create an interface entry from a name, IP addr and MAC addr
  444.         InterfaceEntry(const PString & _name, const Address & _addr, const PString & _macAddr)
  445.           : name(_name), ipAddr(_addr), macAddr(_macAddr) { }
  446.         /// Get the name of the interface
  447.         PString GetName() const { return name; }
  448.         /// Get the address associated with the interface
  449.         Address GetAddress() const { return ipAddr; }
  450.         /// Get the MAC address associate with the interface
  451.         PString GetMACAddress() const { return macAddr; }
  452.       protected:
  453.         PString name;
  454.         Address ipAddr;
  455.         PString macAddr;
  456.     };
  457.     PLIST(InterfaceTable, InterfaceEntry);
  458.     /** Get a list of all interfaces
  459.        @return
  460.        TRUE if the interface table is returned, FALSE if an error occurs.
  461.      */
  462.     static BOOL GetInterfaceTable(
  463.       InterfaceTable & table      /// interface table
  464.     );
  465. #ifdef DOC_PLUS_PLUS
  466. };
  467. #endif
  468. // Class declaration continued in platform specific header file ///////////////