![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Смесь бульдога с носорогом: моя версия :)) [D6, Win95/98, Win2k]
savva © (2002-07-19 11:14:00)Короче дела такие... подробности того, как я пытаюсь открыть сокет..
const
// В заголовке необходимы некоторые данные
HTTP_Data =
"Content-Type: application/x-www-form-urlencoded"#10+
"User-Agent: Chat Client By Savva (savva@nm.ru)"#10+
"Host: savva.ru"#10+
"Connection: Keep-Alive: on"#10;
....
Соединение открываю так:
function TForm1.DoConnect(user,msg : string): boolean;
begin
Content:= msg + #10;
// Вычисляем длину содержимого
Content:= "Content-Length: "+IntToStr(Length(Content))+#10+#10+Content;
if chUseProxy.Checked then begin
{-- Начало прокси ---}
ClientSocket1.Host := edProxyServer.Text;;
ClientSocket1.Port := StrToIntDef( edProxyPort.text,3128);
HTTP_POST := " http://"+edWebServer.Text+":"+edWebPort.text+" "+
user+""#10;
{--- Конец прокси ---}
end else begin
{--- Начало соединения напрямую --- }
ClientSocket1.Host := edWebServer.Text;
ClientSocket1.Port := StrToIntDef( edWebPort.text,3000);
HTTP_POST := user+#10;
{--- Конец соединения напрямую ---}
end;
// Соединяем заголовок
HTTP_Post := HTTP_Post + HTTP_Data;
// открываем соединение
ClientSocket1.Active:=true;
mess_str:=HTTP_POST+Content;
result:=true;
end;
...
procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Постим данные при коннекте
Socket.SendText(mess_str);
mess_str:="";
end;
то есть фактически после этого мы имеем открытый транспортный канал, но дальнейшие телодвижения типа Socket.SendText("что нибудь");не приводят ни к какому результату. Причем со стороны сервера такие вещи проходят - клиент получает сообщения и прекрасно их может читать :)
тут мне напрашивается вопрос - а не надо ли перед посылкой сообщения от клиента серверу к тексту припысать какую либо еще информацию? Может прокси сервер прикрывает соединение (хотя это наврядли - сообщение-то от сервера приходят) !?!
Wonder (2002-07-19 13:31:00) [21]Например, в HTTP_Data вот это вот:
"Connection: Keep-Alive: on"#10;
ты откуда взял?
savva (2002-07-19 13:22:00) [22]>Digitman © (19.07.02 13:17)
да... он получает см.выше
savva (2002-07-19 13:21:00) [23]то что я запутал - это я понял :)))
поясняю ситуацию :))
есть сервер слушает 1 порт.. к примеру 3000. он в интернет лезет без прокси..
есть клиент, выходящий через прокси..
все остальное я уже говорил :))) по порядку :))))
savva (2002-07-19 13:18:00) [24]первый раз проходит - при коннекте DoConnect функция а второй : Send_Text - их содержание практически идентично.. при коннекте сервер получает:
/ savva
Content-Type: application/x-www-form-urlencoded
User-Agent: Chat Client By Savva (savva@nm.ru)
Host: savva.ru
Content-Length: 27
Connection: close
а далше тихо как в гробу..
лог:
[19/Jul/2002 13:10:02] Packet filter: ACL 2:0 Intel(R) PRO Adapter: permit packet out id=36386 : TCP 192.168.0.XX:3627 -> 192.168.0.XX:3128
[19/Jul/2002 13:10:02] Packet filter: ACL 2:0 Intel(R) PRO Adapter: permit packet out id=36388 : TCP 192.168.0.XX:3627 -> 192.168.0.XX:3128
[19/Jul/2002 13:10:02] Packet filter: ACL 2:0 Intel(R) PRO Adapter: permit packet out id=36389 : TCP 192.168.0.XX:3627 -> 192.168.0.XX:3128
[19/Jul/2002 13:10:02] Packet filter: ACL 2:0 Intel(R) PRO Adapter: permit packet out id=36391 : TCP 192.168.0.XX:3627 -> 192.168.0.XX:3128
дальнейшие посылы SendText не вызывают у прокси никакх изменений..
Digitman (2002-07-19 13:17:00) [25]Так, стоп. Ты уже двоих запутал) ...
О факте установления транспортного канала говорит как минимум событие OnConnect(), никакие логические данные, передаваемые в SendText() в OnWrite() или еще где-то к транспорту как таковому отношения не имеют - он либо есть либо его нет ...
Вот теперь скажи - есть ли реакция Web-сервера на самый 1-й SendText() ?
Digitman (2002-07-19 13:08:00) [26]Получается, что первое сообщение имеет корректный формат (и Web-сервер, обработав, вернул тебе результат) , а последующие - некорректный.
Ты хочешь сказать, что "напрямую" (без прокси) обмен идет успешно ?
Wonder (2002-07-19 13:04:00) [27]Непонял. Ты ж говоришь, что от клиента к серверу вообщеничего не идет. Какие два раза?
savva (2002-07-19 13:02:00) [28]>Wonder © (19.07.02 12:59)
подход верен.. но почему один и тот же пакет не проходит 2 раза..
Wonder (2002-07-19 12:59:00) [29]Как я делал в таких случаях дабы не обременять себя вычитыванием RFC и составлением правильных http-пакетов :)))
- Берем снифер
- Браузером отправляем данные через форму по какому-либо адресу (например, постинг сюда)
- Смотрим http-пакет
- Отправляем твоей программой
- Смотрим http-пакет
- Сравниваем оба пакета на предмет различий
savva (2002-07-19 12:56:00) [30]>Digitman © (19.07.02 12:53)
ща
Digitman (2002-07-19 12:53:00) [31]Так, ну а "Журнал http" в WinRoute что показывает на эту тему ? Или это сложно - поиметь такую инфу ?
savva (2002-07-19 12:50:00) [32]>Wonder © (19.07.02 12:45)
я тоже так думал..
но тут тогда появляется не понятка почему функция
не имеет желаемого результата...
function TForm1.Send_Text( msg : string): boolean;
begin
Content:= msg + #10;
// Вычисляем длину содержимого
Content:= "Content-Length: "+IntToStr(Length(Content))+#10+#10+Content;
if chUseProxy.Checked then begin
{-- Начало прокси ---}
ClientSocket1.Host := edProxyServer.Text;;
ClientSocket1.Port := StrToIntDef( edProxyPort.text,3128);
HTTP_POST := " http://"+edWebServer.Text+":"+edWebPort.text+" "+
{user name}nickname+""#10;
{--- Конец прокси ---}
end else begin
{--- Начало соединения напрямую --- }
ClientSocket1.Host := edWebServer.Text;
ClientSocket1.Port := StrToIntDef( edWebPort.text,3000);
{--- Конец соединения напрямую ---}
end;
// Соединяем заголовок
HTTP_POST :=HTTP_Post+#$D#$A+ msg+#10;
HTTP_Post := HTTP_Post + HTTP_Data;
mess_str:=HTTP_POST+Content;
sckt.SendText(mess_str);
result:=true;
end;
Digitman (2002-07-19 12:49:00) [33]"приплюсоввывать что-то" или наоборот убрать лишнее - здесь уже я тебе вряд ли что-то подскажу ... вступает в силу ПИО с прокси-сервером, "держащим" http...
разумеется, если прокси "споткнулся" на твоем заголовке запроса, никакой речи о трансляции его целевому узлу и речи быть не может ...
спроси у Володи (<Wonder>) на тему ПИО с http-прокси - он гораздо "круче" меня владеет этими тонкостями
Digitman (2002-07-19 12:46:00) [34]"приплюсоввывать что-то" или наоборот убрать лишнее - здесь уже я тебе вряд ли что-то подскажу ... вступает в силу ПИО с прокси-сервером, "держащим" http...
разумеется, если прокси "споткнулся" на твоем заголовке запроса, никакой речи о трансляции его целевому узлу и речи быть не может ...
Wonder (2002-07-19 12:45:00) [35]Так.
Насколько я понимаю http-прокси работают следующим образом: любой трафик со стороны клиента обрабатывается прокси в соответствии со стандартом http. Ни о каком транспортном канале до веб-сервера не может идти речи, потому как прокси работает на уровне протокола http (на то он и http-прокси :) А вот со стороны веб-сервера прокси-серверу уже до балды соответствие трафика какому-либо протоколу высокого уровня. Потому как это уже браузер клиента отслеживает.
savva (2002-07-19 12:44:00) [36]именно http он и держит (поддерживает..) через него IE работает...
прокси - WinRoute..(если это важно :))
Digitman (2002-07-19 12:41:00) [37]Пока речь идет о прокси : он первый в цепочке передачи получает кл.поток, анализирует, фильтрует и перенаправляет ...
Упс ... <Wonder> верную ведь мысль подал : с прокси самим все в порядке ? http держит он ?
savva (2002-07-19 12:39:00) [38]>Wonder © (19.07.02 12:34)
ага..
любому вмешательству я тока рад :))
>Digitman © (19.07.02 12:33)
то есть мы приходим к выводу что перед отсылкой необходимо к тексту сообщения приплюсоввывать что-то.. такой вариант тоже не проходит - прибавляю тоже самое что и при коннекте..
savva (2002-07-19 12:35:00) [39]>сервер получает клиентский исх.поток
речь идет я так понял про прокси сервер?
что значит в состоянии?:)) осталось выбрать "образ"...
При возникновении события OnRead на сервере строка перво-наперво сохраняется в лог-файл... (Пока речь идет тока строках..) Если можно вклинится раньше такого способа - то я не знаю как.
Wonder (2002-07-19 12:34:00) [40]Извиняюсь за вмешательство :), а прокси-то какой? HTTP?