DblPxyTcp.pas
上传用户:axbxcx
上传日期:2009-10-29
资源大小:15k
文件大小:2k
源码类别:

TAPI编程

开发平台:

Delphi

  1. unit DblPxyTcp;
  2. interface
  3. uses SysUtils, Classes, blckSock, synsock;
  4. type
  5.   TDblProxyTcpSocket = class(TTCPBlockSocket)
  6.   public
  7.     constructor Create;
  8.     procedure Connect(IP, Port: string); override;
  9.     procedure Listen; override;
  10.   end;
  11. implementation
  12. constructor TDblProxyTcpSocket.Create;
  13. begin
  14.   inherited Create;
  15. end;
  16. procedure TDblProxyTcpSocket.Connect(IP, Port: string);
  17. var x: integer;
  18.     b: boolean;
  19. begin
  20.   x := 0;
  21.   if FSocksIP <> '' then x := x + 1;
  22.   if FHTTPTunnelIP <> '' then x := x + 2;
  23.   case x of
  24.     1: SocksDoConnect(IP, Port);
  25.     2: HTTPTunnelDoConnect(IP, Port);
  26.     3: begin
  27.          HTTPTunnelDoConnect(FSocksIP, FSocksPort);
  28.          if FLastError = 0 then
  29.          begin
  30.            b := SocksOpen;
  31.            if b then b := SocksRequest(1, IP, Port);
  32.            if b then b := SocksResponse;
  33.            if not b and (FLastError = 0) then FLastError := WSASYSNOTREADY;
  34.            FSocksLocalIP := FSocksResponseIP;
  35.            FSocksLocalPort := FSocksResponsePort;
  36.            FSocksRemoteIP := IP;
  37.            FSocksRemotePort := Port;
  38.          end;
  39.          ExceptCheck;
  40.          DoStatus(HR_Connect, IP + ':' + Port);
  41.        end;
  42.     else
  43.       inherited Connect(IP, Port);
  44.   end;
  45.   if FSslEnabled then
  46.     if FLastError = 0 then
  47.       SSLDoConnect
  48.     else
  49.     begin
  50.       x := FLastError;
  51.       SSLEnabled := False;
  52.       FLastError := x;
  53.     end;
  54. end;
  55. procedure TDblProxyTcpSocket.Listen;
  56. var
  57.   b: Boolean;
  58.   Sip, SPort, SC: string;
  59. begin
  60.   if FSocksIP = '' then
  61.   begin
  62.     SockCheck(synsock.Listen(FSocket, SOMAXCONN));
  63.     GetSins;
  64.   end
  65.   else
  66.   begin
  67.     Sip := GetLocalSinIP;
  68.     if Sip = cAnyHost then Sip := LocalName;
  69.     SPort := IntToStr(GetLocalSinPort);
  70.     if FHTTPTunnelIP = '' then
  71.     begin
  72.       SC := FSocksIP;
  73.       FSocksIP := '';
  74.       inherited Connect(SC, FSocksPort);
  75.       FSocksIp := SC;
  76.     end
  77.     else HTTPTunnelDoConnect(FSocksIP, FSocksPort);
  78.     b := SocksOpen;
  79.     if b then
  80.       b := SocksRequest(2, Sip, SPort);
  81.     if b then
  82.       b := SocksResponse;
  83.     if not b and (FLastError = 0) then
  84.       FLastError := WSANO_RECOVERY;
  85.     FSocksLocalIP := FSocksResponseIP;
  86.     if FSocksLocalIP = cAnyHost then
  87.       FSocksLocalIP := FSocksIP;
  88.     FSocksLocalPort := FSocksResponsePort;
  89.     FSocksRemoteIP := '';
  90.     FSocksRemotePort := '';
  91.   end;
  92.   ExceptCheck;
  93.   DoStatus(HR_Listen, '');
  94. end;
  95. end.