难道TSocketConnection真的不能支持SOCKET 5代理吗?我快绝望了!(10分)

  • 主题发起人 主题发起人 NetNoCenter
  • 开始时间 开始时间
N

NetNoCenter

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,快帮帮忙啊,分数可以到其他帖子拿,谢谢!急啊
 
详细说一下好么?
 
能支持啊 不过要自己写代码
 
怎么写啊,给个思路,谢谢
 
这个不难把,我自己写了一个TProxySocket类专门是给异步模式下的Socket用的,
支持sock4,sock4a,sock5
 
各位老兄,使用SOCKET API或者TClientSockct是很容易的,关键是使用TSocketConnection来连接远程服务器的话,要让其支持SOCKET5代理,则非常难实现(对于我来说)!
各位有什么好的办法啊
 
不明白啊,你既然会用Socket API,那为什么不能修改TSocketConnection???
其实也就是修改真正连接的IP和端口,以及处理连接成功以后的开始的几个
包的通讯而已,
 
TO homesunway:
呵呵,能用Socket API就能够修改TSocketConnection吗? 我也试着去修改TSocketConnection,但我发现由于TSocketConnection牵涉到很多东西,所以修改起来非常困难,都不知道如何下手?
 
1,修改调用connect前的代码,修改连接的IP和端口,
2,修改连接成功以后的代码和接收数据部分的代码,在连接成功以后发送SOCKS5通讯包
再每次接收数据的时候判断和继续发包协商,直到完成建立成功以后再进入正常的接收
部分代码.
 
首先,我不知道你看过TSocketConnectioN的源代码没有看过,如果你看过,你就会觉得改源代码是非常麻烦的
 
要按sock5标准
 
TSocketConnection好像不支持代理,我们可以自己加入代理功能,但是工作量太大了。
 
工作量并不大,顶多不超过200行代码就可以写出支持socks代理的
MidasConnection对象

着手的关键是 TSocketTransport这个类
找个能支持代理的 Socket类
然后模仿上面的对象进行改写就可以了

同时也需要自己实现一个 TProxySocketConnection
模仿 TSocketConnection 即可
我估算了一下,总的代码行数不超过200行
 
TClientSocket如果大家能扩展代理的话TSocketConnection就支持代理了。
 
to lich
你是否可以帮忙搞定。
 
我找了一下,没有找到以阻塞模式工作的支持Socks代理
的组件,看谁能找到
 
to lich
你不是说加代理好容易吗,就帮人解决此问题吗。
 
我也没有找到能像SocketClient的能阻塞工作的Socket对象,
只好自己实现代理协议了,我修改了SConnect.pas文件,
加入了免费Socks5代理的支持,主要进行了以下几处修改

将SConnect.pas 复制到程序目录下

1.
在 TSocketConnection 的 published 部分加入
property Socks5Addr: String read FSocks5Addr write FSocks5Addr;
property Socks5Port: Integer read FSocks5Port write FSocks5Port;
然后按 Ctrl + Shift + C 进行代码自动完成
2.
在 TSocketTransport 的 public 部分加入
property SocksAddr: String read FSocksAddr write FSocksAddr;
property SocksPort: Integer read FSocksPort write FSocksPort;
然后按 Ctrl + Shift + C 进行代码自动完成

3.
在 TSocketConnection.CreateTransport 方法的最后一句代码
Result := SocketTransport as ITransport;
前面加上:
SocketTransport.SocksAddr := Socks5Addr;
SocketTransport.SocksPort := Socks5Port;

4.
修改 TSocketTransport.SetConnected 方法,修改后如下所示:
procedure TSocketTransport.SetConnected(Value: Boolean);
var
Buff: array[1..500] of Char;
Len, t: Integer;
IsFail: Boolean;
saddr: String;
begin
if GetConnected = Value then Exit;
if Value then
begin
if (FAddress = '') and (FHost = '') then
raise ESocketConnectionError.CreateRes(@SNoAddress);
FClientSocket := TClientSocket.Create(nil);
FClientSocket.ClientType := ctBlocking;
FSocket := FClientSocket.Socket;
if Trim(FSocksAddr) = '' then
begin
FClientSocket.Port := FPort;
if FAddress <> '' then
FClientSocket.Address := FAddress else
FClientSocket.Host := FHost;
FClientSocket.Open;
end
else
begin
//使用代理服务器的端口进行连接
FClientSocket.Port := FSocksPort;
//使用代理服务器的地址进行连接
FClientSocket.Host := FSocksAddr;
if FAddress = '' then saddr := FHost else saddr := FAddress;
FClientSocket.Open;
//传递协议数据
if FSocket.Connected then
begin
//请求使用不需要验证的Socks5代理
Buff[1] := #5;
Buff[2] := #1;
Buff[3] := #0;
FSocket.SendBuf(Buff, 3);
Len := FSocket.ReceiveBuf(Buff, 2);
IsFail := not ((Len = 2) and (Buff[1] = #5) and (Buff[2] = #0));
if not IsFail then
begin
//发送连接远程主机的命令
Buff[1] := #5;
Buff[2] := #1;
Buff[3] := #0;
Buff[4] := #3;
//设置主机名长度
Buff[5] := Chr(Length(saddr));
//复制主机名
Move(saddr[1], Buff[6], Ord(Buff[5]));
//计算端口的位置
t := 5 + Ord(Buff[5]) + 1;
//设置目标端口参数
Buff[t] := Chr((FPort shr 8) and $ff);
Buff[t + 1] := Chr(FPort and $ff);
FSocket.SendBuf(Buff, t + 1);
Len := FSocket.ReceiveBuf(Buff, 5);
//验证是否连接成功
IsFail := not ((Len = 5) and (Buff[1] = #5) and (Buff[2] = #0));
if not IsFail then
begin
if Buff[4] = #1 then
t := 5
else
t := Ord(Buff[5]) + 2;
Len := FSocket.ReceiveBuf(Buff[6], t);
IsFail := not (Len = t);
end;
end;
if IsFail then
begin
raise Exception.Create('connect via proxy fail.');
end;
end;
end;
end else
begin
FSocket.Close;
FClientSocket.Free;
if FEvent <> 0 then WSACloseEvent(FEvent);
end;
end;

这样,当TSocketConnection.Socks5Addr 不为空时,会自动使用Socks5代理连接
我仅仅实现了免费代理的连接方法,
其他的连接方法请参照Socks的 RFC 文档 rfc1928.txt

http://archive.socks.permeo.com/rfc/rfc1928.txt
http://archive.socks.permeo.com/rfc/rfc1929.txt

如果想索取我修改的源代码,请发信到 mastercn@163.com
 
关于发送的Socks5代理协议的数据,
请参照 rfc1928.txt 中的说明

相关中文文档
http://www.vckbase.com/document/listdoc.asp?mclsid=9&sclsid=917
http://www.vckbase.com/document/viewdoc.asp?id=852
或者:
http://hoversoft.net/devinfo/0112doc/25socks5/
 
后退
顶部