Форум: "Сети";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизidTCPClient: отсылка запроса через проксю? Найти похожие ветки
← →
Луарвик (2004-10-16 19:36) [0]Как? Пример. Плиз....
← →
Piter © (2004-10-16 20:01) [1]http://delphimaster.net/view/6-1097865516/
← →
Луарвик (2004-10-17 14:17) [2]Э-э, нет, вроде не то... Я имел в виду, что в моей проге есть компонент idTCPClient, с помощью него отсылаю запросы. У idHTTP есть Proxy Params, а как настроить TCP, таким же образом?
← →
Луарвик (2004-10-18 15:01) [3]ЛЮДИ!!! ХЕЛП
У idHTTP есть Proxy Params, а как настроить TCP, таким же образом?
← →
Reindeer Moss Eater © (2004-10-18 15:03) [4]Таким же не получится
← →
Луаврик (2004-10-18 18:11) [5]А каким ПОЛУЧИТЬСЯ?
← →
Луарвик (2004-10-20 00:54) [6]КАК ОТПРАВИТЬ ЗАПРОС С ПОМОЩЬЮ IdTCPClient ЧЕРЕЗ ПРОКСИ?
← →
Piter © (2004-10-20 01:50) [7]какого типа прокси?
← →
Луарвик (2004-10-20 19:31) [8]Блин, я в этом не смыслю... Ну тот который вводять в браузер, чтоб его ip не вычислили :)
← →
alienserg (2004-10-20 20:32) [9]Луаврик (18.10.04 18:11) [5]
А каким ПОЛУЧИТЬСЯ?
Indy 9 может работать только с Socks proxy
для этого добавь IdIOHandlerSocket + IdSocksInfo
Для того, чтобы работать с HTTP proxy, надо переходить на Indy 10
Кстати, недавно наконец вышла документация на Indy 10. Всем советую.
← →
Луарвик! (2004-10-20 22:44) [10]Ну да! А тот же idHTTP?
← →
Луарвик (2004-10-20 22:50) [11]У того же IdFTP есть настройки прокси! Почему TCP нет?!
← →
Palladin © (2004-10-20 22:54) [12]Потому что http://book.itep.ru/...
если ты там что нибудь поймешь...
← →
Луарвик (2004-10-21 15:38) [13]Не понял. Ты хоть сам понял?
← →
Луарвик (2004-10-22 23:27) [14]Неужели никак?
← →
alienserg (2004-10-24 03:41) [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-24 14:33) [16]Ну пасибо
← →
GobliNGuT © (2004-10-25 01:16) [17]сделай соединение с нужным портом прокси и пошли туда команду
GET www.delphimaster.ru
HTTP/1.0
Content-Type: text/html
(2 раза #10#13)
... и еще что-то - не помню, вообщем тебе надо почитать доку по протоколу HTTP. а попрактиковать умения сможешь подрубившись c помощью телнета(не забудь сделать эхо чтобы видеть что набираешь).
протокол HTTP описан в каком-то rfcХХХ - номер не помню.
← →
alienserg (2004-10-25 02:22) [18]GobliNGuT © (25.10.04 01:16) [17]
Посылать http запросы через прокси не проблема. Это умеет делать TIdHttpClient.
Вопрос был, насколько я понимаю, о том, как заставить работать TIdTcpClient через прокси на низовом уровне. Connect, WriteLn, ReadLn, и т.д.
← →
GobliNGuT © (2004-10-25 15:00) [19]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:01) [20]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:02) [21]сорри за то что два раза заслал - сервак не принимал ...
← →
Reindeer Moss Eater © (2004-10-25 15:24) [22]IdTcpClient.WriteLn("Content-Type: text/html");
...
IdTcpClient.WriteLn(""); //посылка #10#13
IdTcpClient.WriteLn("");// 2 раза!
Последняя строка - лишняя.
← →
GobliNGuT © (2004-10-25 15:30) [23]согласен
← →
Луарвик (2004-10-25 23:57) [24]Ок, post так же работает? Знач все что мне нужно - это в TCP.Host указать хост прокси, и вуаля!
Я думал будет сложнее...
← →
alienserg (2004-10-26 19:58) [25]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 запрос просто проигнорирует?
← →
GobliNGuT © (2004-10-27 01:11) [26]alienserg (26.10.04 19:58) [25]
Естественно он игнорирует. У мессенджера насколько я понимаю должен быть свой протокол. Значит действия должны быть такого рода:
1) найти доку по протоколу мессенджера
2) подключится телнетом к порту 20847 и попробовать ручками поработать с портом, проанализировав посланные данные и полученные
3) создать в дельфи соединение TCP/IP на нужный порт
4) писать в порт данные согласно протоколу мессенджера
В целом, прием сработает, надо только изучить протокол для того чтобы знать что писать в порт.
← →
alienserg (2004-10-27 05:06) [27]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("");
установить связь с сервером мессенджера. Как в таком случае клиент сообщает прокси порт, по которому нужно коннектиться?
← →
Reindeer Moss Eater © (2004-10-27 09:12) [28]Читай в RFC2616 про команду CONNECT
← →
Slym (2004-10-28 05:59) [29]Пример проверки доступности странички через прокси локалки + через анонимный прокси (пложенность проксей теоретически не ограничена, включая зацикливание проксей друг на друга)
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;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.039 c