Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Прокси на Delphi


Автор: FAK 11.5.2006, 23:39
Как сделать так, чтобы можно было подключаться одновременно к нескольким прокси?
Заранее благодарен! 

Автор: Демо 12.5.2006, 09:06
Если ты скажешь, что означает "подключиться к нескольким прокси", то возможно тебе и помогут. 

Автор: FAK 12.5.2006, 20:47
Объясняю.
Это так называемые "цепочка прокси" . Принцип действия таков:
Компьютер подключается к прокси1, который подключается к прокси2, прокси2 подключается к прокси3 и тд. Вот это мне и нужно реализовать в делфи 

Автор: Rouse_ 12.5.2006, 22:01
Ищи описание механизма Socks в RFC. 

Автор: mai62 12.5.2006, 23:56
Rouse_
Цитата

Ищи описание механизма Socks в RFC. 

Разве нужен обязательно Socks-прокси? Многие (если не все) HTTP-прокси могут передавать HTTP-запросы  вышестоящему (parent) прокси. А если HTTP-прокси поддерживает метод connect, то через него можно работать не только с HTTP-протоколом, но и, например, ICQ или FTP.
FAK
Из твоих вопросов не понятно в чем заключается задача, которую ты решаешь? Что именно ты хочешь сделать на Delphi? Смотри сколько людей откликнулось, дай им шанс помочь тебе  smile  

Автор: FAK 13.5.2006, 06:26
Я пишу свой icq клиент и мне нужно вставить эту цепочку проксей в мой клиент, чтобы подключаться
к icq серверу анонимно.  

Автор: mai62 14.5.2006, 10:44
Можно посмотреть исходники программы freecap (_http://www.freecap.ru/)
Еще видел такой диалог (_http://groups.google.ru/group/borland.public.delphi.internet.winsock/browse_thread/thread/cf01f02031d633ca/6da95be9112090b4?hide_quotes=no#msg_6da95be9112090b4)
Цитата

can you please add proxy chain support to that list, because alot 
of us want to do a proxy chain and it isnt currently possible using indy. 
It will be for extra anonymity(sp?) 
eg. 
Client -> Socks Proxy -> Socks Proxy -> Socks Proxy -> Mail Server 
or 
Client -> HTTP Proxy -> HTTP Proxy -> HTTP Proxy -> Web Server 
etc.
...
We have added this to Indy, now you wil be able to chain TIdSocksInfo and 
TIdConnectThroughHttpProxy.

Насколько я понял, речь идет об Indy 10 

Автор: FAK 14.5.2006, 10:58
исходник freeCap я уже скачал )
Но чет я там не разберусь 

Автор: RA 14.5.2006, 12:09
Собсвенноручно выкладывал тут 3 сорса проксей: http-пэшный на ics-се, http-пэшный без компонентов, и Socks4. Один из сорсов в сетевых технологиях. 

Такшо в поиск.  

Автор: Rouse_ 17.5.2006, 19:25
Цитата(mai62 @  13.5.2006,  00:56 Найти цитируемый пост)
Разве нужен обязательно Socks-прокси? Многие (если не все) HTTP-прокси могут передавать HTTP-запросы  вышестоящему (parent) прокси. А если HTTP-прокси поддерживает метод connect, то через него можно работать не только с HTTP-протоколом, но и, например, ICQ или FTP.

Это-то конечно да, только для этого должен быть настроена соответствующая цепочка, ты сможешь сказать верхнему прокси чтобы он работал не напрямую а через еще один прокси? 

Автор: mai62 17.5.2006, 21:09
Не могу. Я хотел сказать, что можно строить цепочки и Socks-прокси и HTTP-прокси
Цитата
Client -> Socks Proxy -> Socks Proxy -> Socks Proxy -> Mail Server 
or 
Client -> HTTP Proxy -> HTTP Proxy -> HTTP Proxy -> Web Server 
 

Автор: Демо 17.5.2006, 22:21
Цитата(mai62 @  17.5.2006,  21:09 Найти цитируемый пост)
Client -> HTTP Proxy -> HTTP Proxy -> HTTP Proxy -> Web Server 


Вот эта цепочка интересна, учитывая недоступность администрирования промежуточных звеньев... 

Автор: FAK 18.5.2006, 19:37
Я уже и исходники фрикапа пересмотрел, все равно не понял.
Вот есть код, возможно это путь к разгадке )) но при запуске возникает ряд ошибок.
Код

function GetResponseCode(const Response:string): Integer;
var S: string;
begin
 S := Response;
 Fetch(S);
 S := Trim(S);
 Result := StrToIntDef(Fetch(S, ' ', False), -1);
end;

procedure ConnectThroughProxy(ProxyList:TStrings);
var
 IdTCPClient:TIdTCPClient;
 i:integer;
begin
 IdTCPClient:=TIdTCPClient.Create(nil);
 try
   IdTCPClient.Host:=ProxyList.Names[0];;
   IdTCPClient.Port:=StrToInt(ProxyList.ValueFromIndex[0]);
   IdTCPClient.Connect;
   i:=1;
   while i<ProxyList.Count-1 do
   begin
     IdTCPClient.IOHandler.WriteLn('CONNECT '+ProxyList.Names[i]+':'+ProxyList.ValueFromIndex[i]+' HTTP/1.1'#13#10#13#10);
     inc(i)
   end;

   IdTCPClient.IOHandler.WriteLn('GET somedata'#13#10#13#10);

 finally
   IdTCPClient.Free;
 end;

end;




 

Автор: mai62 20.5.2006, 01:58
Демо
Цитата
Вот эта цепочка интересна, учитывая недоступность администрирования промежуточных звеньев...

http proxy chain - это не мое изобретение (к сожалению smile)
_http://www.freeproxy.ru/en/free_proxy/faq/what_is_http_proxy.htm
_http://packages.debian.org/unstable/net/proxychains.html
К сожалению не нашел нигде простого описания как это делается. Полагаю происходит это так. Допустим мы хотим пробросить канал от клиента к серверу через цепочку из двух прокси (как я уже писал выше, http прокси должны поддерживать метод connect).

Клиент --> Прокси1 --> Прокси2 --> Сервер
Клиент устанавливает соединение с Прокси1 и шлет команду
connect Прокси2 http1.1
D результате получаем такую цепочку:
Клиент --> -------->  --> Прокси2 --> Сервер
Потом
connect Сервер http1.1
Получаем
Клиент --> -------->  --> -------->  --> Сервер

На самом деле похожим образом поступает браузер, когда хочет связаться с https-сервером через http-прокси. Он соединяется с http-прокси и шлет команду
connect https_сервер:443 http1.1
И после этого обменивается с сервером по https-протоколу.

 

Автор: Демо 20.5.2006, 10:41
Цитата(mai62 @  20.5.2006,  01:58 Найти цитируемый пост)
Клиент --> Прокси1 --> Прокси2 --> Сервер


Вот в таком варианте сделать возможно и очень просто.


Вот в таком - 

Цитата(FAK @  12.5.2006,  20:47 Найти цитируемый пост)
Компьютер подключается к прокси1, который подключается к прокси2, прокси2 подключается к прокси3 и тд. Вот это мне и нужно реализовать в делфи 


невозможно.

Добавлено @ 10:43 
Дело в том, что "Прокси1" как раз и есть наш сервер, которым я могу управлять, на котором могу настроить каскадирование.
А вот "Прокси2" - это уже чужой прокси-сервер, и он будет в цепочке последним. 

Автор: mai62 20.5.2006, 21:51
Демо
Допускаю, что я что-то не понимаю, но разницы в этих двух цитатах я не вижу.
Не понимаю почему 
Цитата
А вот "Прокси2" - это уже чужой прокси-сервер, и он будет в цепочке последним.

Почему последним? Теоретически описанным мной способом можно соединить в цепочку сколько угодно проки-серверов (мне так кажется, если я не прав, то в чем?).

соединяемся с Прокси1
> connect Прокси2 http1.1
  < 200 OK
> connect Прокси3 http1.1
  < 200 OK
> connect Прокси4 http1.1
  < 200 OK
...
> connect ПроксиN http1.1
  < 200 OK
...
> connect Вожделенный_Сервер http1.1
 

Автор: Демо 21.5.2006, 11:36
Цитата(mai62 @  20.5.2006,  21:51 Найти цитируемый пост)
Почему последним? Теоретически описанным мной способом можно соединить в цепочку сколько угодно проки-серверов (мне так кажется, если я не прав, то в чем?).


Теория без практики - это как камасутра в картинках.

Протокол HTTP - это вообще-то несколько более сложная вещь, нежели просто Connect.
Приведи заголовки HTTP-запросов в каждом случае, чтобы разговор был более предметный. 

Автор: mai62 21.5.2006, 17:54
Демо
Цитата
Теория без практики - это как камасутра в картинках.

На практике так на практике, вот
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdTCPClient, StdCtrls, IdRFCReply;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  IdTCPClient: TIdTCPClient;
  repl: TIdRFCReply;
  empty: Integer;
  s, s1: String;
begin
  IdTCPClient:= TIdTCPClient.Create(nil);
  try
    IdTCPClient.Port:= 8080;
    IdTCPClient.Host:= '127.0.0.1';
    IdTCPClient.Connect;
    IdTCPClient.SendCmd('CONNECT 192.168.55.2:8080 HTTP/1.1'#13#10#13#10);
    repl:= IdTCPClient.LastCmdResult;
    if repl.ReplyExists then
    begin
      Memo1.Lines.AddStrings(repl.Text);
      if (Pos('200', repl.Text[0])>0) then
      begin
        IdTCPClient.SendCmd(
'GET http://mail.ru HTTP/1.1'#13#10+
'Accept: text/html,text/plain;q=0.7,image/png,image/jpeg,image/gif;q=0.4,*/*;q=0.6'#13#10+
'User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'#13#10+
'Host: mail.ru'#13#10+
'Proxy-Connection: close'#13#10#13#10);
        empty:= 0; s:='';
        while(True) do
        begin
          sleep(100);
          s1:= IdTCPClient.CurrentReadBuffer;
          if Length(s1)=0 then Inc(empty) else
          begin
            empty:= 0;
            s:= s+s1;
          end;
          if empty>30 then break;
        end;
        Memo1.Lines.Add(s);
      end;
    end;
  finally
    IdTCPClient.Disconnect;
    IdTCPClient.Free;
  end;
end;

end.

На форму нужно положить Memo и кнопку.
Нажмите кнопку и в Memo загрузится текст страницы с mail.ru. Я пробросил канал через 2 http-прокси:
127.0.0.1:8080
192.168.55.2:8080
Можете испытать код с другим количечтвом прокси.  

Автор: Демо 21.5.2006, 18:00
mai62
Спасибо.
Я уже обнаружил некоторую информацию о такой возможности. Буду изучать. 

Автор: Ibragim 11.9.2006, 14:32
Ув. 
mai62,  (а может кто-то еще откликнется smile )
не могли бы Вы также рассказать, как сделать работу с TIdTCPClient асинхронной?
То есть хотелось бы не ждать ответа на SendCmd, а послать команду, положим

Код

IdTCPClient.SendCmd(
'GET http://mail.ru HTTP/1.1'#13#10+
'Accept: text/html,text/plain;q=0.7,image/png,image/jpeg,image/gif;q=0.4,*/*;q=0.6'#13#10+
'User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'#13#10+
'Host: mail.ru'#13#10);


и работать дальше (чтобы процедура не останавливалась), а потом спустя некоторое время посмотреть, есть ли результат, желательно при возникновении какого-либо события.

Заранее спасибо.

Автор: mai62 11.9.2006, 17:53
Цитата(Ibragim @  11.9.2006,  14:32 Найти цитируемый пост)
не могли бы Вы также рассказать, как сделать работу с TIdTCPClient асинхронной?

TIdTCPClient не может работать в асинхронном режиме. В аснхронном режиме работает, например, Internet Component Suite (http://www.overbyte.be/)

Автор: Buhalich 14.9.2006, 23:35
Ibragim, а с сокетами нет возможности работать?

Автор: Romikgy 15.9.2006, 09:46
Цитата(Ibragim @  11.9.2006,  13:32 Найти цитируемый пост)
как сделать работу с TIdTCPClient асинхронной?

засунь в отдельный поток и будет те щастье smile
Цитата(Buhalich @  14.9.2006,  22:35 Найти цитируемый пост)
а с сокетами нет возможности работать? 

есть возможность , но мороки имхо на порядок больше

Автор: Ibragim 15.9.2006, 12:06
to Buhalich 

 Есть такая возможность. СОСВСЕМ много мороки. Уже сделано так, как советовал Romikqy: 

Цитата

засунь в отдельный поток и будет те щастье 


Вот тока счастья пока нет, поглючивают потоки у меня... пока разбираюсь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)