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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * socks.h
  3.  *
  4.  * PWLib application header file for GetCyberPatrol
  5.  *
  6.  * Copyright 98 Equivalence
  7.  *
  8.  * $Log: socks.h,v $
  9.  * Revision 1.4  1999/05/01 03:52:20  robertj
  10.  * Fixed various egcs warnings.
  11.  *
  12.  * Revision 1.3  1999/03/09 08:01:47  robertj
  13.  * Changed comments for doc++ support (more to come).
  14.  *
  15.  * Revision 1.2  1998/12/23 00:33:05  robertj
  16.  * UDP support
  17.  *
  18.  * Revision 1.1  1998/12/22 10:34:17  robertj
  19.  * Initial revision
  20.  *
  21.  */
  22. #ifndef _SOCKS_H
  23. #define _SOCKS_H
  24. #include <ptlib/sockets.h>
  25. /**
  26. Base class for implementing the SOCKS protocol for use with PSocksSocket and
  27. PSocksUDPSocket.
  28. */
  29. class PSocksProtocol
  30. {
  31.   public:
  32.     PSocksProtocol(WORD port);
  33.     virtual ~PSocksProtocol() { }
  34.   // New functions for class
  35.     enum {
  36.       DefaultServerPort = 1080
  37.     };
  38.     BOOL SetServer(
  39.       const PString & hostname,
  40.       const char * service = "socks 1080"
  41.     );
  42.     BOOL SetServer(
  43.       const PString & hostname,
  44.       WORD port
  45.     );
  46.     /** Set the username and password for the SOCKS server authentication. This
  47.        is for the cleartext authentication only, GSSAPI, Kerberos etc is not
  48.        yet supported.
  49.      */
  50.     void SetAuthentication(
  51.       const PString & username,
  52.       const PString & password
  53.     );
  54.   protected:
  55.     BOOL ConnectSocksServer(PTCPSocket & thisSocket);
  56.     virtual void SetErrorCodes(PChannel::Errors errCode, int osErr) = 0;
  57.     virtual BOOL SendSocksCommand(PTCPSocket & socket,
  58.                                   BYTE command,
  59.                                   const char * hostname,
  60.                                   PIPSocket::Address addr);
  61.     virtual BOOL ReceiveSocksResponse(PTCPSocket & socket,
  62.                                       PIPSocket::Address & addr,
  63.                                       WORD & port);
  64.     PString            serverHost;
  65.     WORD               serverPort;
  66.     PString            authenticationUsername;
  67.     PString            authenticationPassword;
  68.     PIPSocket::Address remoteAddress;
  69.     WORD               remotePort;
  70.     PIPSocket::Address localAddress;
  71.     WORD               localPort;
  72. };
  73. /** This is an ancestor class allowing access to a SOCKS servers (version 4 and 5).
  74.  */
  75. class PSocksSocket : public PTCPSocket, public PSocksProtocol
  76. {
  77.   PCLASSINFO(PSocksSocket, PTCPSocket)
  78.   public:
  79.     PSocksSocket(
  80.       WORD port = 0
  81.     );
  82.   // Overrides from class PSocket.
  83.     /** Connect a socket to a remote host on the specified port number. This is
  84.        typically used by the client or initiator of a communications channel.
  85.        This connects to a "listening" socket at the other end of the
  86.        communications channel.
  87.        The port number as defined by the object instance construction or the
  88.        <A>PIPSocket::SetPort()</A> function.
  89.        @return
  90.        TRUE if the channel was successfully connected to the remote host.
  91.      */
  92.     virtual BOOL Connect(
  93.       const PString & address   // Address of remote machine to connect to.
  94.     );
  95.     virtual BOOL Connect(
  96.       const Address & addr      // Address of remote machine to connect to.
  97.     );
  98.     /** Listen on a socket for a remote host on the specified port number. This
  99.        may be used for server based applications. A "connecting" socket begins
  100.        a connection by initiating a connection to this socket. An active socket
  101.        of this type is then used to generate other "accepting" sockets which
  102.        establish a two way communications channel with the "connecting" socket.
  103.        If the <CODE>port</CODE> parameter is zero then the port number as
  104.        defined by the object instance construction or the
  105.        <A>PIPSocket::SetPort()</A> function.
  106.        For the UDP protocol, the <CODE>queueSize</CODE> parameter is ignored.
  107.        @return
  108.        TRUE if the channel was successfully opened.
  109.      */
  110.     virtual BOOL Listen(
  111.       unsigned queueSize = 5,  // Number of pending accepts that may be queued.
  112.       WORD port = 0,           // Port number to use for the connection.
  113.       Reusability reuse = AddressIsExclusive // Can/Cant listen more than once.
  114.     );
  115.     /** Open a socket to a remote host on the specified port number. This is an
  116.        "accepting" socket. When a "listening" socket has a pending connection
  117.        to make, this will accept a connection made by the "connecting" socket
  118.        created to establish a link.
  119.        The port that the socket uses is the one used in the <A>Listen()</A>
  120.        command of the <CODE>socket</CODE> parameter.
  121.        Note that this function will block until a remote system connects to the
  122.        port number specified in the "listening" socket.
  123.        A further note is that when the version that uses a parameter is used,
  124.        the <CODE>socket</CODE> parameter is automatically closed and its
  125.        operating system handle transferred to the current object. This occurs
  126.        regardless of the return value of the function.
  127.        @return
  128.        TRUE if the channel was successfully opened.
  129.      */
  130.     BOOL Accept();
  131.     virtual BOOL Accept(
  132.       PSocket & socket          // Listening socket making the connection.
  133.     );
  134.   // Overrides from class PIPSocket.
  135.     /** Get the Internet Protocol address for the local host.
  136.        @return
  137.        TRUE if the IP number was returned.
  138.      */
  139.     virtual BOOL GetLocalAddress(
  140.       Address & addr    // Variable to receive hosts IP address
  141.     );
  142.     virtual BOOL GetLocalAddress(
  143.       Address & addr,    // Variable to receive peer hosts IP address
  144.       WORD & port        // Variable to receive peer hosts port number
  145.     );
  146.     /** Get the Internet Protocol address for the peer host the socket is
  147.        connected to.
  148.        @return
  149.        TRUE if the IP number was returned.
  150.      */
  151.     virtual BOOL GetPeerAddress(
  152.       Address & addr    // Variable to receive hosts IP address
  153.     );
  154.     virtual BOOL GetPeerAddress(
  155.       Address & addr,    // Variable to receive peer hosts IP address
  156.       WORD & port        // Variable to receive peer hosts port number
  157.     );
  158.   protected:
  159.     virtual void SetErrorCodes(PChannel::Errors errCode, int osErr);
  160.     int TransferHandle(PSocksSocket & destination);
  161.   private:
  162.     virtual BOOL Connect(WORD localPort, const Address & addr);
  163. };
  164. /** This class allows access to RFC1928 compliant SOCKS server.
  165.  */
  166. class PSocks4Socket : public PSocksSocket
  167. {
  168.   PCLASSINFO(PSocks4Socket, PSocksSocket)
  169.   public:
  170.     PSocks4Socket(
  171.       WORD port = 0
  172.     );
  173.     PSocks4Socket(
  174.       const PString & host,
  175.       WORD port = 0
  176.     );
  177.   // Overrides from class PObject
  178.     /** Create a copy of the class on the heap. The exact semantics of the
  179.        descendent class determine what is required to make a duplicate of the
  180.        instance. Not all classes can even <EM>do</EM> a clone operation.
  181.        
  182.        The main user of the clone function is the <A>PDictionary</A> class as
  183.        it requires copies of the dictionary keys.
  184.        The default behaviour is for this function to assert.
  185.        @return
  186.        pointer to new copy of the class instance.
  187.      */
  188.     virtual PObject * Clone() const;
  189.   protected:
  190.     virtual BOOL SendSocksCommand(PTCPSocket & socket,
  191.                                   BYTE command,
  192.                                   const char * hostname,
  193.                                   PIPSocket::Address addr);
  194.     virtual BOOL ReceiveSocksResponse(PTCPSocket & socket,
  195.                                       PIPSocket::Address & addr,
  196.                                       WORD & port);
  197. };
  198. /** This class allows access to RFC1928 compliant SOCKS server.
  199.  */
  200. class PSocks5Socket : public PSocksSocket
  201. {
  202.   PCLASSINFO(PSocks5Socket, PSocksSocket)
  203.   public:
  204.     PSocks5Socket(
  205.       WORD port = 0
  206.     );
  207.     PSocks5Socket(
  208.       const PString & host,
  209.       WORD port = 0
  210.     );
  211.   // Overrides from class PObject
  212.     /** Create a copy of the class on the heap. The exact semantics of the
  213.        descendent class determine what is required to make a duplicate of the
  214.        instance. Not all classes can even <EM>do</EM> a clone operation.
  215.        
  216.        The main user of the clone function is the <A>PDictionary</A> class as
  217.        it requires copies of the dictionary keys.
  218.        The default behaviour is for this function to assert.
  219.        @return
  220.        pointer to new copy of the class instance.
  221.      */
  222.     virtual PObject * Clone() const;
  223. };
  224. /** This class allows access to RFC1928 compliant SOCKS server.
  225.  */
  226. class PSocksUDPSocket : public PUDPSocket, public PSocksProtocol
  227. {
  228.   PCLASSINFO(PSocksUDPSocket, PUDPSocket)
  229.   public:
  230.     PSocksUDPSocket(
  231.       WORD port = 0
  232.     );
  233.     PSocksUDPSocket(
  234.       const PString & host,
  235.       WORD port = 0
  236.     );
  237.   // Overrides from class PObject
  238.     /** Create a copy of the class on the heap. The exact semantics of the
  239.        descendent class determine what is required to make a duplicate of the
  240.        instance. Not all classes can even <EM>do</EM> a clone operation.
  241.        
  242.        The main user of the clone function is the <A>PDictionary</A> class as
  243.        it requires copies of the dictionary keys.
  244.        The default behaviour is for this function to assert.
  245.        @return
  246.        pointer to new copy of the class instance.
  247.      */
  248.     virtual PObject * Clone() const;
  249.   // Overrides from class PSocket.
  250.     /** Connect a socket to a remote host on the specified port number. This is
  251.        typically used by the client or initiator of a communications channel.
  252.        This connects to a "listening" socket at the other end of the
  253.        communications channel.
  254.        The port number as defined by the object instance construction or the
  255.        <A>PIPSocket::SetPort()</A> function.
  256.        @return
  257.        TRUE if the channel was successfully connected to the remote host.
  258.      */
  259.     virtual BOOL Connect(
  260.       const PString & address   // Address of remote machine to connect to.
  261.     );
  262.     virtual BOOL Connect(
  263.       const Address & addr      // Address of remote machine to connect to.
  264.     );
  265.     /** Listen on a socket for a remote host on the specified port number. This
  266.        may be used for server based applications. A "connecting" socket begins
  267.        a connection by initiating a connection to this socket. An active socket
  268.        of this type is then used to generate other "accepting" sockets which
  269.        establish a two way communications channel with the "connecting" socket.
  270.        If the <CODE>port</CODE> parameter is zero then the port number as
  271.        defined by the object instance construction or the
  272.        <A>PIPSocket::SetPort()</A> function.
  273.        For the UDP protocol, the <CODE>queueSize</CODE> parameter is ignored.
  274.        @return
  275.        TRUE if the channel was successfully opened.
  276.      */
  277.     virtual BOOL Listen(
  278.       unsigned queueSize = 5,  // Number of pending accepts that may be queued.
  279.       WORD port = 0,           // Port number to use for the connection.
  280.       Reusability reuse = AddressIsExclusive // Can/Cant listen more than once.
  281.     );
  282.   // Overrides from class PIPSocket.
  283.     /** Get the Internet Protocol address for the local host.
  284.        @return
  285.        TRUE if the IP number was returned.
  286.      */
  287.     virtual BOOL GetLocalAddress(
  288.       Address & addr    // Variable to receive hosts IP address
  289.     );
  290.     virtual BOOL GetLocalAddress(
  291.       Address & addr,    // Variable to receive peer hosts IP address
  292.       WORD & port        // Variable to receive peer hosts port number
  293.     );
  294.     /** Get the Internet Protocol address for the peer host the socket is
  295.        connected to.
  296.        @return
  297.        TRUE if the IP number was returned.
  298.      */
  299.     virtual BOOL GetPeerAddress(
  300.       Address & addr    // Variable to receive hosts IP address
  301.     );
  302.     virtual BOOL GetPeerAddress(
  303.       Address & addr,    // Variable to receive peer hosts IP address
  304.       WORD & port        // Variable to receive peer hosts port number
  305.     );
  306.   // Overrides from class PIPDatagramSocket.
  307.     /** Read a datagram from a remote computer.
  308.        
  309.        @return
  310.        TRUE if any bytes were sucessfully read.
  311.      */
  312.     virtual BOOL ReadFrom(
  313.       void * buf,     // Data to be written as URGENT TCP data.
  314.       PINDEX len,     // Number of bytes pointed to by <CODE>buf</CODE>.
  315.       Address & addr, // Address from which the datagram was received.
  316.       WORD & port     // Port from which the datagram was received.
  317.     );
  318.     /** Write a datagram to a remote computer.
  319.        @return
  320.        TRUE if all the bytes were sucessfully written.
  321.      */
  322.     virtual BOOL WriteTo(
  323.       const void * buf,   // Data to be written as URGENT TCP data.
  324.       PINDEX len,         // Number of bytes pointed to by <CODE>buf</CODE>.
  325.       const Address & addr, // Address to which the datagram is sent.
  326.       WORD port           // Port to which the datagram is sent.
  327.     );
  328.   protected:
  329.     virtual void SetErrorCodes(PChannel::Errors errCode, int osErr);
  330.     PTCPSocket socksControl;
  331.     Address    serverAddress;
  332.   private:
  333.     virtual BOOL Connect(WORD localPort, const Address & addr);
  334. };
  335. #endif  // _SOCKS_H
  336. // End of File ///////////////////////////////////////////////////////////////