要实现功能Http、Socks5(无验证)代理。
现出现如下问题,1、Http代理可用,但不能实现多线程。
                2、Socks5代理IPV4可用,域名方式下载时不能获取文件大小,出现实况转播情况。
由于文件太大,分成了两张贴子!=========================================================================================
//====================Socks5 Proxy 执行线程===============================
unit SExeThread;interfaceuses
  classes,SysUtils,winsock,Dialogs,
  Windows;
type
  TSExeThread=class(TThread)
  private
    ClientSock:TSocket;
  protected
    procedure Execute;override;
  public
    constructor CreateExeThread(C:TSocket);
    Destructor Destroy;override;
  end;implementationconst
  MaxChangeLen=$2048;Constructor TSExeThread.CreateExeThread(C:TSocket);
begin
  inherited Create(True);
  ClientSock:=C;
  FreeonTerminate:=True;
end;procedure Transfers(Buf:Array of Byte;Len:integer;CSock:TSocket; SSock:TSocket);
begin
  Send(SSock,Buf[0],Len,0);
  try
    Len:=Recv(SSock,Buf[0],MaxChangeLen,0);
    while Len>0 do
    begin
      Send(CSock,Buf[0],Len,0);
      Len:=Recv(Ssock,Buf[0],MaxChangeLen,0);
    end;
  finally
    CloseSocket(SSock);
    CloseSocket(CSock);
  end;
end;Procedure IPV4(CSock:TSocket; Buf:array of Byte);    //IPV4地址
var
  SSock:TSocket;
  SAddr:TSockAddr;
  myHost,myPort:integer;
  Re,Len:Integer;
  MyBuf:array[0..256] of Byte;
  TempBuf:Array of Byte;
begin
  SSock:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
  SAddr.sin_family:=AF_INET;
  CopyMemory(@myHost,@Buf[4],4);
  CopyMemory(@myPort,@Buf[8],2);
  SAddr.sin_addr.S_addr:=myHost;
  SAddr.sin_port:=myPort;
  Re:=Connect(SSock,SAddr,SizeOf(SAddr));
  MyBuf[0]:=$05;
  MyBuf[1]:=Re;   //返回值
  MyBuf[2]:=$00;   //保留字,固定为00
  MyBuf[3]:=$01;   //地址类型IP-V4
  CopyMemory(@MyBuf[4],@SAddr.sin_addr,4);   //地址,长度4位
  CopyMemory(@MyBuf[8],@SAddr.sin_addr,2);   //端口,长度2位
  Send(CSock,MyBuf,10,0);
  SetLength(TempBuf,MaxChangeLen);
  Len:=Recv(CSock,TempBuf[0],MaxChangeLen,0);
  Transfers(TempBuf,Len,CSock,SSock);
end;procedure Domainname(CSock:TSocket; Buf:array of Byte; l:integer);    //DomainName域名地址
var
  SSock:TSocket;
  SAddr:TSockAddr;
  myHost:string;
  myPort:integer;
  HostLen:integer;
  HostAddr:integer;
  HostInfo:PHostEnt;
  Re,Len,i:integer;
  MyBuf:array[0..256] of Byte;
  TempBuf:array of Byte;
begin
  SSock:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
  SAddr.sin_family:=AF_INET;
  HostLen:=Buf[4];
  for i:=0 to hostLen-1 do myHost:=myHost+char(Buf[i+5]);
  HostAddr:=inet_addr(Pchar(myHost));
  if (HostAddr=-1) then
  begin
    HostInfo:=GetHostByName(Pchar(myHost));
    if HostInfo<>Nil then
      SAddr.sin_addr:=(Pinaddr(HostInfo.h_addr_list^))^
    else begin
      strdispose(Pchar(myHost));
      Closesocket(CSock);
      Exit;
    end;
  end else SAddr.sin_addr.S_addr:=HostAddr;
  CopyMemory(@myPort,@buf[hostlen+5],2);
  SAddr.sin_port:=myPort;
  Re:=Connect(SSock,SAddr,SizeOf(SAddr));
  MyBuf[0]:=$05;
  MyBuf[1]:=Re;
  MyBuf[2]:=$00;
  MyBuf[3]:=$03;
  MyBuf[4]:=HostLen;
  CopyMemory(@MyBuf[5],@SAddr.sin_addr,HostLen);  //地址
  CopyMemory(@MyBuf[5+HostLen],@Saddr.sin_addr,2);  //Prot
  Send(CSock,MyBuf,7+HostLen,0);
  SetLength(TempBuf,MaxChangeLen);
  Len:=Recv(CSock,TempBuf[0],MaxChangeLen,0);
  Transfers(TempBuf,Len,CSock,SSock);
  SetLength(TempBuf,0);
end;procedure TSExeThread.Execute;
var
  MyBuf:array[0..256] of Byte;
  Len:integer;
begin
  if ClientSock=INVALID_SOCKET then exit;
  Len:=Recv(ClientSock,MyBuf,257,0);
  if Len>0 then
  begin
    if MyBuf[0]=$05 then
    begin
      if (MyBuf[1]=$01) and (MyBuf[2]=$00) then    //No Auth
      begin
        if MyBuf[3]=$01 then                       //IP-V4
          IPV4(ClientSock,MyBuf)
        else if MyBuf[3]=$03 then                  //DomainName
          DomainName(ClientSock,MyBuf,Len);
      end;
    end;
  end;
end;Destructor TSExeThread.Destroy;
begin
  inherited Destroy;
end;
end.