Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

idTCPClient: отсылка запроса через проксю?


Страницы:   1 2

Луарвик ©   (2004-10-16 19:36:00) 

Как? Пример. Плиз....


Slym   (2004-10-28 05:59:00) [1]

Пример проверки доступности странички через прокси локалки + через анонимный прокси (пложенность проксей теоретически не ограничена, включая зацикливание проксей друг на друга)

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 TForm1.Button2Click(Sender: TObject);
 procedure log(const Msg:string);
 begin
   Memo1.Lines.Add(Msg);
 end;
 procedure Wln(const Msg:string);
 begin
   Log(Msg);IdTCPClient1.WriteLn(Msg);
 end;
 function Rln:string;
 var s:string;
 begin
   result:='';
   repeat
     s:=IdTCPClient1.ReadLn;
     result:=result+#13#10+s;
   until s='';
   Log(result);
 end;
begin
 try
   Memo1.Clear;
   Log('Connecting to '+IdTCPClient1.Host+':'+IntToStr(IdTCPClient1.Port)+' proxy');
   IdTCPClient1.Connect;
   try
     Log('Connected'#13#10);
     Wln('CONNECT 61.131.63.186:8080 HTTP/1.1');
     Wln('Proxy-Authorization: Basic blabla'#13#10);
     if GetResponseCode(Rln)<>200 then begin Log('Error'); exit; end;
     Wln('HEAD / HTTP/1.1');
     Wln('Host: www.MotherFucker.ru'#13#10);
     if GetResponseCode(Rln)<>200 then begin Log('Error'); exit; end;
     Log(IdTCPClient1.AllData);
   finally
     IdTCPClient1.Disconnect;
   end;
 except
   on e:exception do
   begin
     Log(E.Message);
   end;
 end;
end;


Reindeer Moss Eater   (2004-10-27 09:12:00) [2]

Читай в RFC2616 про команду CONNECT


alienserg   (2004-10-27 05:06:00) [3]

GobliNGuT ©   (27.10.04 01:11) [26]

1) найти доку по протоколу мессенджера

есть дока

2) подключится телнетом к порту 20847

По какому адресу подключиться? Ведь клиент под HTTP прокси. Клиент не может подключаться напрямую. Задача состоит в том, чтобы заставить прокси установить коннект между клиентом и внешним сервером мессенджера, который не знает, что такое команда GET. В какой момент прокси организует коннект между клиентом и внешним сервером мессенджера? После какой последовательности команд, отправленных от клиента к прокси? Каким образом клиент сообщит прокси адрес и порт сервера мессенджера?
Для простоты предположим, что клиент и сервер взяты из демошек IndyDemos\Chat\Client и Chat\Server.
Там последовательность действий предельно простая, если работать напрямую:
1. клиент коннектится по адресу/порту
2. в событии IdTCPClient1Connected клиент посылает серверу свое имя
3. сервер отвечает фразой

Извини за дотошность расспросов. Просто интересно знать, заставит ли посылка команд от клиента к прокси

IdTcpClient.WriteLn('GET messenger_server_IP');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');
IdTcpClient.WriteLn('');


установить связь с сервером мессенджера. Как в таком случае клиент сообщает прокси порт, по которому нужно коннектиться?


GobliNGuT   (2004-10-27 01:11:00) [4]

alienserg   (26.10.04 19:58) [25]

Естественно он игнорирует. У мессенджера насколько я понимаю должен быть свой протокол. Значит действия должны быть такого рода:
1) найти доку по протоколу мессенджера
2) подключится телнетом к порту 20847 и попробовать ручками поработать с портом, проанализировав посланные данные и полученные
3) создать в дельфи соединение TCP/IP на нужный порт
4) писать в порт данные согласно протоколу мессенджера

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


alienserg   (2004-10-26 19:58:00) [5]

GobliNGuT ©   (25.10.04 15:01) [20]

IdTcpClient.WriteLn('GET www.delphimaster.ru');
IdTcpClient.WriteLn('HTTP/1.0');
IdTcpClient.WriteLn('Content-Type: text/html');


Сработает ли вышепреведенный прием, если надо законнектиться по порту например 20847 к серверу мессенджера, который понятия не имеет, что такое HTTP протокол и GET запрос просто проигнорирует?


Луарвик   (2004-10-25 23:57:00) [6]

Ок, post так же работает? Знач все что мне нужно - это в TCP.Host указать хост прокси, и вуаля!
Я думал будет сложнее...


GobliNGuT   (2004-10-25 15:30:00) [7]

согласен


Reindeer Moss Eater   (2004-10-25 15:24:00) [8]

     IdTcpClient.WriteLn('Content-Type: text/html');
       ...
       IdTcpClient.WriteLn(''); //посылка #10#13
       IdTcpClient.WriteLn('');// 2 раза!


Последняя строка - лишняя.


GobliNGuT   (2004-10-25 15:02:00) [9]

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


GobliNGuT   (2004-10-25 15:01:00) [10]

alienserg   (25.10.04 02:22) [18]

я на вопрос ответил, разжевать забыл =)
... делается это примерно так

if IdTcpClient.connect
     then
       begin
       ResStr:=IdTcpClient.ReadLn;
       ... //просмотр ответа сервера, первые 3 символа содержат
// код ответа, если 200 - то все ОК. В последующих символах можно //прочитать инфу о серваке.
        IdTcpClient.WriteLn('GET www.delphimaster.ru');
        IdTcpClient.WriteLn('HTTP/1.0');
        IdTcpClient.WriteLn('Content-Type: text/html');
        ...
        IdTcpClient.WriteLn(''); //посылка #10#13
        IdTcpClient.WriteLn('');// 2 раза!
ResStr='';
ResStr:=IdTcpClient.ReadLn;
while (ResStr='')and(timeOut<60) do ResStr:=IdTcpClient.ReadLn;

       end;


Внимание!Это не готовый код а общая идея. Аналогичную штуку я писал и она работала. код не сохранился

В idHTTP достаточно было бы воспользоваться методом GET.
А здесь приходится писать все подробно.


GobliNGuT   (2004-10-25 15:00:00) [11]

alienserg   (25.10.04 02:22) [18]

я на вопрос ответил, разжевать забыл =)
... делается это примерно так

if IdTcpClient.connect
     then
       begin
       ResStr:=IdTcpClient.ReadLn;
       ... //просмотр ответа сервера, первые 3 символа содержат
// код ответа, если 200 - то все ОК. В последующих символах можно //прочитать инфу о серваке.
        IdTcpClient.WriteLn('GET www.delphimaster.ru');
        IdTcpClient.WriteLn('HTTP/1.0');
        IdTcpClient.WriteLn('Content-Type: text/html');
        ...
        IdTcpClient.WriteLn(''); //посылка #10#13
        IdTcpClient.WriteLn('');// 2 раза!
ResStr='';
ResStr:=IdTcpClient.ReadLn;
while (ResStr='')and(timeOut<60) do ResStr:=IdTcpClient.ReadLn;

       end;


Внимание!Это не готовый код а общая идея. Аналогичную штуку я писал и она работала. код не сохранился

В idHTTP достаточно было бы воспользоваться методом GET.
А здесь приходится писать все подробно.


alienserg   (2004-10-25 02:22:00) [12]

GobliNGuT ©   (25.10.04 01:16) [17]

Посылать http запросы через прокси не проблема. Это умеет делать TIdHttpClient.
Вопрос был, насколько я понимаю, о том, как заставить работать TIdTcpClient через прокси на низовом уровне. Connect, WriteLn, ReadLn, и т.д.


GobliNGuT   (2004-10-25 01:16:00) [13]

сделай соединение с нужным портом прокси и пошли туда команду
GET www.delphimaster.ru
HTTP/1.0
Content-Type: text/html

(2 раза #10#13)
... и еще что-то - не помню, вообщем тебе надо почитать доку по протоколу HTTP. а попрактиковать умения сможешь подрубившись c помощью телнета(не забудь сделать эхо чтобы видеть что набираешь).
протокол HTTP описан в каком-то rfcХХХ - номер не помню.


Луарвик   (2004-10-24 14:33:00) [14]

Ну пасибо


alienserg   (2004-10-24 03:41:00) [15]

скачиваешь
http://www.milliseconds.webhost.ru/files/IndyFAQHTMLHelp.zip
смотришь раздел Firewalls and Proxies
и видишь:
Q. How do I use a TIdTCPClient with a HTTP Tunneling Proxy?
A. Both Indy 8.0 and Indy 9.0 do not support HTTP Tunneling proxies so you have to use Indy 10.
Q. How do I use a TIdTCPClient with a SOCKS Proxy?
A. (For Indy 9.0)
1. Create an IOHandler such as TIdIOHandlerSocket or TIdSSLIOHandlerSocket and assign the TCPClient.IOHandler property this.  
2. Create a TIdSocksInfo object and assign it to the IOHandler's SocksInfo property.  
3. Set the TIdSocksInfo properties as required.  

Еще почитай там же
Q. How do I use Indy with a NAT (Network Address Translator)?

И вообще прочитай все, что там написано. Два-три раза.


Луарвик   (2004-10-22 23:27:00) [16]

Неужели никак?


Луарвик   (2004-10-21 15:38:00) [17]

Не понял. Ты хоть сам понял?


Palladin   (2004-10-20 22:54:00) [18]

Потому что http://book.itep.ru/...
если ты там что нибудь поймешь...


Луарвик   (2004-10-20 22:50:00) [19]

У того же IdFTP есть настройки прокси! Почему TCP нет?!


Луарвик!   (2004-10-20 22:44:00) [20]

Ну да! А тот же idHTTP?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо