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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ipxsock.h
  3.  *
  4.  * IPX 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: ipxsock.h,v $
  30.  * Revision 1.7  1999/03/09 02:59:50  robertj
  31.  * Changed comments to doc++ compatible documentation.
  32.  *
  33.  * Revision 1.6  1999/02/16 08:12:00  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.5  1998/11/30 02:50:58  robertj
  37.  * New directory structure
  38.  *
  39.  * Revision 1.4  1998/09/23 06:20:47  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.3  1996/10/08 13:21:04  robertj
  43.  * More IPX implementation.
  44.  *
  45.  * Revision 1.1  1996/09/14 13:00:56  robertj
  46.  * Initial revision
  47.  *
  48.  */
  49. #define _PIPXSOCKET
  50. #ifdef __GNUC__
  51. #pragma interface
  52. #endif
  53. #ifndef _PSOCKET
  54. #include <ptlib/socket.h>
  55. #endif
  56. /**This class describes a type of socket that will communicate using the
  57.    IPX/SPX protocols.
  58.  */
  59. class PIPXSocket : public PSocket
  60. {
  61.   PCLASSINFO(PIPXSocket, PSocket);
  62.   public:
  63.     /**Create a new IPX datagram socket.
  64.      */
  65.     PIPXSocket(
  66.       WORD port = 0       /// Port number to use for the connection.
  67.     );
  68.   public:
  69.     /** IPX protocol address specification.
  70.      */
  71.     class Address {
  72.       public:
  73.         union {
  74.           struct {
  75.             BYTE b1,b2,b3,b4;
  76.           } b;
  77.           struct {
  78.             WORD w1,s_w2;
  79.           } w;
  80.           DWORD dw;
  81.         } network;
  82.         BYTE node[6];
  83.         /** Create new, invalid, address. */
  84.         Address();
  85.         /** Create copy of existing address */
  86.         Address(const Address & addr /** Address to copy */);
  87.         /** Create address from string representation. */
  88.         Address(const PString & str /** String representation of address */);
  89.         /** Create address from node and net numbers. */
  90.         Address(
  91.           DWORD netNum, /// IPX network number.
  92.           const char * nodeNum  /// IPX node number (MAC address)
  93.         );
  94.         /** Create copy of existing address */
  95.         Address & operator=(const Address & addr /** Address to copy */);
  96.         /** Get string representation of IPX address */
  97.         operator PString() const;
  98.         /** Determine if address is valid. Note that this does not mean that
  99.             the host is online.
  100.             @return TRUE is address is valid.
  101.           */
  102.         BOOL IsValid() const;
  103.       /** Output string representation of IPX address to stream. */
  104.       friend ostream & operator<<(
  105.         ostream & strm, /// Stream to output to
  106.         Address & addr  /// Address to output
  107.       ) { return strm << (PString)addr; }
  108.     };
  109.   /**@name Overrides from class PChannel */
  110.   //@{
  111.     /**Get the platform and I/O channel type name of the channel. For an
  112.        IPX/SPX socket this returns the network number, node number of the
  113.        peer the socket is connected to, followed by the socket number it
  114.        is connected to.
  115.        @return
  116.        the name of the channel.
  117.      */
  118.     virtual PString GetName() const;
  119.   //@}
  120.   /**@name Overrides from class PSocket */
  121.   //@{
  122.     /**Connect a socket to a remote host on the port number of the socket.
  123.        This is
  124.        typically used by the client or initiator of a communications channel.
  125.        This connects to a "listening" socket at the other end of the
  126.        communications channel.
  127.        The port number as defined by the object instance construction or the
  128.        #PIPSocket::SetPort()# function.
  129.        @return
  130.        TRUE if the channel was successfully connected to the remote host.
  131.      */
  132.     virtual BOOL Connect(
  133.       const PString & address   /// Address of remote machine to connect to.
  134.     );
  135.     /**Connect a socket to a remote host on the port number of the socket.
  136.        This is
  137.        typically used by the client or initiator of a communications channel.
  138.        This connects to a "listening" socket at the other end of the
  139.        communications channel.
  140.        The port number as defined by the object instance construction or the
  141.        #PIPSocket::SetPort()# function.
  142.        @return
  143.        TRUE if the channel was successfully connected to the remote host.
  144.      */
  145.     virtual BOOL Connect(
  146.       const Address & address   /// Address of remote machine to connect to.
  147.     );
  148.     /**Listen on a socket for a remote host on the specified port number. This
  149.        may be used for server based applications. A "connecting" socket begins
  150.        a connection by initiating a connection to this socket. An active socket
  151.        of this type is then used to generate other "accepting" sockets which
  152.        establish a two way communications channel with the "connecting" socket.
  153.        If the #port# parameter is zero then the port number as
  154.        defined by the object instance construction or the
  155.        #PIPSocket::SetPort()# function.
  156.        For the UDP protocol, the #queueSize# parameter is ignored.
  157.        @return
  158.        TRUE if the channel was successfully opened.
  159.      */
  160.     virtual BOOL Listen(
  161.       unsigned queueSize = 5,  /// Number of pending accepts that may be queued.
  162.       WORD port = 0,           /// Port number to use for the connection.
  163.       Reusability reuse = AddressIsExclusive /// Can/Cant listen more than once.
  164.     );
  165.   //@}
  166.   /**@name Address and name space look up functions */
  167.   //@{
  168.     /**Get the host name for the host specified server.
  169.        @return
  170.        Name of the host or IPX number of host.
  171.      */
  172.     static PString GetHostName(
  173.       const Address & addr    /// Hosts IP address to get name for
  174.     );
  175.     /**Get the IPX address for the specified host.
  176.        @return
  177.        TRUE if the IPX number was returned.
  178.      */
  179.     static BOOL GetHostAddress(
  180.       Address & addr    /// Variable to receive this hosts IP address
  181.     );
  182.     /**Get the IPX address for the specified host.
  183.        @return
  184.        TRUE if the IPX number was returned.
  185.      */
  186.     static BOOL GetHostAddress(
  187.       const PString & hostname,
  188.       /** Name of host to get address for. This may be either a server name or
  189.          an IPX number in "colon" format.
  190.        */
  191.       Address & addr    /// Variable to receive hosts IPX address
  192.     );
  193.     /**Get the IPX/SPX address for the local host.
  194.        @return
  195.        TRUE if the IPX number was returned.
  196.      */
  197.     BOOL GetLocalAddress(
  198.       Address & addr    /// Variable to receive hosts IPX address
  199.     );
  200.     /**Get the IPX/SPX address for the local host.
  201.        @return
  202.        TRUE if the IPX number was returned.
  203.      */
  204.     BOOL GetLocalAddress(
  205.       Address & addr,    /// Variable to receive peer hosts IPX address
  206.       WORD & port        /// Variable to receive peer hosts port number
  207.     );
  208.     /**Get the IPX/SPX address for the peer host the socket is
  209.        connected to.
  210.        @return
  211.        TRUE if the IPX number was returned.
  212.      */
  213.     BOOL GetPeerAddress(
  214.       Address & addr    /// Variable to receive hosts IPX address
  215.     );
  216.     /**Get the IPX/SPX address for the peer host the socket is
  217.        connected to.
  218.        @return
  219.        TRUE if the IPX number was returned.
  220.      */
  221.     BOOL GetPeerAddress(
  222.       Address & addr,    /// Variable to receive peer hosts IPX address
  223.       WORD & port        /// Variable to receive peer hosts port number
  224.     );
  225.   //@}
  226.   /**@name I/O functions */
  227.   //@{
  228.     /**Sets the packet type for datagrams sent by this socket.
  229.        @return
  230.        TRUE if the type was successfully set.
  231.      */
  232.     BOOL SetPacketType(
  233.       int type    /// IPX packet type for this socket.
  234.     );
  235.     /**Gets the packet type for datagrams sent by this socket.
  236.        @return
  237.        type of packets or -1 if error.
  238.      */
  239.     int GetPacketType();
  240.     /**Read a datagram from a remote computer.
  241.        
  242.        @return
  243.        TRUE if all the bytes were sucessfully written.
  244.      */
  245.     virtual BOOL ReadFrom(
  246.       void * buf,     /// Data to be written as URGENT TCP data.
  247.       PINDEX len,     /// Number of bytes pointed to by #buf#.
  248.       Address & addr, /// Address from which the datagram was received.
  249.       WORD & port     /// Port from which the datagram was received.
  250.     );
  251.     /**Write a datagram to a remote computer.
  252.        @return
  253.        TRUE if all the bytes were sucessfully written.
  254.      */
  255.     virtual BOOL WriteTo(
  256.       const void * buf,   /// Data to be written as URGENT TCP data.
  257.       PINDEX len,         /// Number of bytes pointed to by #buf#.
  258.       const Address & addr, /// Address to which the datagram is sent.
  259.       WORD port           /// Port to which the datagram is sent.
  260.     );
  261.   //@}
  262.   protected:
  263.     virtual BOOL OpenSocket();
  264.     virtual const char * GetProtocolName() const;
  265. #ifdef DOC_PLUS_PLUS
  266. };
  267. #endif
  268. // Class declaration continued in platform specific header file ///////////////