要实现功能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.
现出现如下问题,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.
解决方案 »
- 如何隐藏Excel表中的列
- 怎么用STRINGGRID更新数据库??
- delphi2007如何安装aafont
- 用delphi6自带的installShiled制作安装程序,但Oracle数据库如何加进去?
- 请问那里有WINDOWS API函数库?
- 请问:如何把当前桌面复制,并保存到文件中。(复制相当于按 Print Screen键)
- 有谁可以告诉我如何给分
- 难道没有人能解决:用DELPHI编写程序将多媒体流通过转换卡发送到电视视频上?
- 买了DELPHI 6 D版,说能告诉我,它的序列号和密匙是多少??
- 字符串操作知多少!
- 文件传输问题求助!!
- 怎样获得RaveSolo.dll文件,有没有网址下载,各位老大帮帮忙吧
高手都去哪儿啦?
自己顶一下!