![]() |
| ||
|
|
Новости |
Поиск |
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("что нибудь");не приводят ни к какому результату. Причем со стороны сервера такие вещи проходят - клиент получает сообщения и прекрасно их может читать :)
тут мне напрашивается вопрос - а не надо ли перед посылкой сообщения от клиента серверу к тексту припысать какую либо еще информацию? Может прокси сервер прикрывает соединение (хотя это наврядли - сообщение-то от сервера приходят) !?!
savva (2002-07-19 14:46:00) [1]все.. ладно, я убег...
всем удачи!
savva (2002-07-19 14:41:00) [2]как такового дисконекта от прокси сервера нет. Я так понимаю, что если они (прокси сервер и клиент) находятся в одной сети, то при закрытии соединения прокси сервером должно генерироваться событие дисконнекта?
Digitman (2002-07-19 14:38:00) [3]для ЛВС эти "грабли" - по барабану) ... это твой клиент будет на них наступать регулярно : если нечетко представляешь себе последовательность событий, клиент будет получать дисконнект по "непонятной" причине, если вообще не "упадет" в самый критичный момент ... а грамотно написанному чат-серверу на проблемы твоего клиента начхать : он либо молчать будет либо отключать кл.транспорт, чуть что некорректно или невовремя его клиент спросит ...
savva (2002-07-19 14:31:00) [4]:)) уже поменял... были сомнения, но ошибок не было в работе в ЛВС
Digitman (2002-07-19 14:28:00) [5]Все из той же "оперы" - нарушение или игнорирование ПИО )))
Так что TCP-транспорт у твоего клиента ни при чем здесь - работает как положено.
Кстати, подожди ... )
Вот есть момент один .. когда-нить наступишь на грабли :
// открываем соединение
ClientSocket1.Active:=true;
mess_str:=HTTP_POST+Content //(***)
Что будет, если вот это
procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Постим данные при коннекте
Socket.SendText(mess_str);
mess_str:="";
end;
выполнится раньше, чем (***) ?
На основании чего ты уверен, что ожидаемая тобой последовательность никогда не нарушится ?
Digitman (2002-07-19 14:22:00) [6]получается, что чат-сервер использует HTTP/1.0 и в ответ на Keep Alive попросту закрывает коннект по собственной инициативе.
О чем тебе WinRoute и сообщает в логе.
savva (2002-07-19 14:21:00) [7]допустим...
но есть ли пример заголовка такой чтобы прокси не закрывал соединение? (наглость второе счастье..)
savva (2002-07-19 14:17:00) [8]даа...
Владимир и Сергей, спасибо Вам за проявленное участие к моему вопросу. Но вопрос остается не решенным, я скорее всего не смогу более принимать учатие в беседе на протяжение отпуска. Точнее сказать, эпизодично у меня будет возможность в инет выйти, но скорее всего эта ветка уползет вниз...
Проблема осталась, но времени ее решать пока нету...
PS. Если вдруг по какой либо случайности найдется один из вариантов решение - дайте мне знать по e-mail... Если конечно трудно не будет...
PSS. ща вынужден убежать, но в понедельник постараюсь заглянуть...
Digitman (2002-07-19 14:17:00) [9]>savva
Видимо, дальше можно и не продолжать)
Володя тебе привел конкретный аргумент по использованию токена Keep Alive
В ответ на несуразицу с Keep Alive ты и получаешь от своего WinRoute "Connection: close"
savva (2002-07-19 14:16:00) [10]не ясно я значит разъяснял...
savva (2002-07-19 14:14:00) [11]аг :))
Digitman (2002-07-19 14:10:00) [12]Итак,
WinRoute - на одной из машин в твоей же ЛВС (возможно, на той же машине, которая является сервером доступа к провайдеру).
Чат-клиент (приложение, использующее TClientSocket) - в той же ЛВС, коннект к чат-серверу может осуществлять как непосредственно через интерфейс провайдера, так и через WinRoute
Чат-сервер - Win32-париложение, предоставляющее Web-сервис на 3000-м порту где-то в глоб.сети на некоем хосте
Так ?
Wonder (2002-07-19 13:58:00) [13]Так вот скажи своему админу, что этого в стандарте нету :)
The following describes the original HTTP/1.0 form of persistent
connections.
When it connects to an origin server, an HTTP client MAY send the Keep-Alive connection-token in addition to the Persist connection-token:
Connection: Keep-Alive
An HTTP/1.0 server would then respond with the Keep-Alive connection token and the client may proceed with an HTTP/1.0 (or Keep-Alive)persistent connection.
An HTTP/1.1 server may also establish persistent connections with HTTP/1.0 clients upon receipt of a Keep-Alive connection token.
However, a persistent connection with an HTTP/1.0 client cannot make use of the chunked transfer-coding, and therefore MUST use a Content-Length for marking the ending boundary of each message.
A client MUST NOT send the Keep-Alive connection token to a proxy server as HTTP/1.0 proxy servers do not obey the rules of HTTP/1.1 for parsing the Connection header field.
savva (2002-07-19 13:57:00) [14]вот где собака порылась:)))
мы говорим о Chat-клиенте на протоколе HTTP и сервере не моей сети (но это признак не обязателен, в принципе к программе серверу будет доступ и из локальной сети). Исполнение сервера - не скрипт. Win32 приложение...
Грубо говоря - чат из примеров Делфи по сокетам, тока расширенный до возможности работать через HTTP proxy
Digitman (2002-07-19 13:51:00) [15]Блин, ничего не пойму)
Что есть "мой сервер" ? Мы говорим об отладке HttpChat-клиента или некоего (не твоего и не в твоей ЛВС) Web-сервера, на котором размещен скрипт твоего же чат-движка?
savva (2002-07-19 13:46:00) [16]в поддержку того, что соединение все таки существует - прокси сервер закрывает через 10 минут (время простоя) соединение...
вполне возвможно что это тока соединение с прокси сервером..
savva (2002-07-19 13:41:00) [17]>Digitman © (19.07.02 13:38)
а вот это уже выше моих знаний...
"Connection: close" - это приходит моему серверу от прокси
"Connection: Keep-Alive: on" - это посылает коиент прокси серверу..
savva (2002-07-19 13:40:00) [18]>Wonder © (19.07.02 13:31)
это совет нашего веб-мастера-админа :)) если честно, то я с трудом представляю зачем это, но если ему верить, то так прокси должен оставлять соединение :)))
>Digitman © (19.07.02 13:35)
прошу прощения.
один порт. конечно сервер никуда не лезет :)) просто я сказал это в такой форме чтоб было понятно что ему ничего не мешает видеть прокси сервер клиента напрямую... (как бы опять не запутать..)
Digitman (2002-07-19 13:38:00) [19]и вот это еще :
Connection: close
как это сочетается с твоим
Connection: Keep-Alive: on
?
Digitman (2002-07-19 13:35:00) [20]"есть сервер слушает 1 порт"
один порт ? или первый ? ну почему так трудно написать недвусмысленно-то ?
Какой сервер ? Web-сервер ? Зачем ему куда-то "лезть" ? Клиент в Интернет "лезет" к Web-серверу через цепочку прокси (твой WinRoute да еще, может быть - прокси провайдера) ...
Вот это поясни ...