⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dblpxytcp.pas

📁 一个用于网上通信的网络电话
💻 PAS
字号:
unit DblPxyTcp;

interface

uses SysUtils, Classes, blckSock, synsock;

type
  TDblProxyTcpSocket = class(TTCPBlockSocket)
  public
    constructor Create;
    procedure Connect(IP, Port: string); override;
    procedure Listen; override;
  end;

implementation

constructor TDblProxyTcpSocket.Create;
begin
  inherited Create;
end;

procedure TDblProxyTcpSocket.Connect(IP, Port: string);
var x: integer;
    b: boolean;
begin
  x := 0;
  if FSocksIP <> '' then x := x + 1;
  if FHTTPTunnelIP <> '' then x := x + 2;
  case x of
    1: SocksDoConnect(IP, Port);
    2: HTTPTunnelDoConnect(IP, Port);
    3: begin
         HTTPTunnelDoConnect(FSocksIP, FSocksPort);
         if FLastError = 0 then
         begin
           b := SocksOpen;
           if b then b := SocksRequest(1, IP, Port);
           if b then b := SocksResponse;
           if not b and (FLastError = 0) then FLastError := WSASYSNOTREADY;
           FSocksLocalIP := FSocksResponseIP;
           FSocksLocalPort := FSocksResponsePort;
           FSocksRemoteIP := IP;
           FSocksRemotePort := Port;
         end;
         ExceptCheck;
         DoStatus(HR_Connect, IP + ':' + Port);
       end;
    else
      inherited Connect(IP, Port);
  end;
  if FSslEnabled then
    if FLastError = 0 then
      SSLDoConnect
    else
    begin
      x := FLastError;
      SSLEnabled := False;
      FLastError := x;
    end;
end;

procedure TDblProxyTcpSocket.Listen;
var
  b: Boolean;
  Sip, SPort, SC: string;
begin
  if FSocksIP = '' then
  begin
    SockCheck(synsock.Listen(FSocket, SOMAXCONN));
    GetSins;
  end
  else
  begin
    Sip := GetLocalSinIP;
    if Sip = cAnyHost then Sip := LocalName;
    SPort := IntToStr(GetLocalSinPort);
    if FHTTPTunnelIP = '' then
    begin
      SC := FSocksIP;
      FSocksIP := '';
      inherited Connect(SC, FSocksPort);
      FSocksIp := SC;
    end
    else HTTPTunnelDoConnect(FSocksIP, FSocksPort);
    b := SocksOpen;
    if b then
      b := SocksRequest(2, Sip, SPort);
    if b then
      b := SocksResponse;
    if not b and (FLastError = 0) then
      FLastError := WSANO_RECOVERY;
    FSocksLocalIP := FSocksResponseIP;
    if FSocksLocalIP = cAnyHost then
      FSocksLocalIP := FSocksIP;
    FSocksLocalPort := FSocksResponsePort;
    FSocksRemoteIP := '';
    FSocksRemotePort := '';
  end;
  ExceptCheck;
  DoStatus(HR_Listen, '');
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -