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

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

Смесь бульдога с носорогом: моя версия :)) [D6, Win95/98, Win2k]


Страницы:   1 2 3

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("что нибудь");не приводят ни к какому результату. Причем со стороны сервера такие вещи проходят - клиент получает сообщения и прекрасно их может читать :)

тут мне напрашивается вопрос - а не надо ли перед посылкой сообщения от клиента серверу к тексту припысать какую либо еще информацию? Может прокси сервер прикрывает соединение (хотя это наврядли - сообщение-то от сервера приходят) !?!


Digitman   (2002-07-19 12:33:00) [41]

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


Digitman   (2002-07-19 12:30:00) [42]

Значит, все идет к тому, что нарушен-таки протокол логического инф.обмена ... сервер получает клиентский исх.поток, не может его интерпретировать его содержимое как корректное с т.з. протокола и попросту игнорирует его, не отвечая клиенту ... и вот отсутствие ответа ты и воспринимаешь якобы как "глюки" в транспорте ...

Убедиться каким-либо образом в факте события FD_READ на серверной стороне ты в состоянии ?


savva   (2002-07-19 12:24:00) [43]

ctNonBlocking


Digitman   (2002-07-19 12:21:00) [44]

клиент-то у тебя ctNonBlocking или ctBlocking ? Это важно с т.з. логики возбуждения событий


savva   (2002-07-19 12:21:00) [45]

причем посылка заголовку прокси серверу в момент коннекта (OnConneсted) не меняет картины...


savva   (2002-07-19 12:10:00) [46]

ясно..


Digitman   (2002-07-19 12:09:00) [47]

Пардон, ошибочка :
... фрагмент хэлпа с описанием к сетевому событию FD_WRITE


savva   (2002-07-19 12:09:00) [48]

при использовании SendText - точка останова сработала 1 раз - при коннекте..
а когда возникает событие OnWrite, при каких условиях?


Digitman   (2002-07-19 12:07:00) [49]

Вот фрагмент хэлпа с описанием к сетевому событию FD_READ :

The FD_WRITE event is handled slightly differently. An FD_WRITE message is posted when a socket is first connected with connect/WSAConnect (after FD_CONNECT, if also registered) or accepted with accept/WSAAccept, and then after a send operation fails with WSAEWOULDBLOCK and buffer space becomes available. Therefore, an application can assume that sends are possible starting from the first FD_WRITE message and lasting until a send returns WSAEWOULDBLOCK. After such a failure the application will be notified that sends are again possible with an FD_WRITE message.


Digitman   (2002-07-19 11:57:00) [50]

А OnWrite(), по-твоему, чем отличается от OnConnect() ?

OnWrite() следует сразу за OnConnect() и говорит лишь о доступности буфера гнезда к записи в него данных, которые ты собираешься передавать.

Собственно, криминала здесь нет никакого, можно и OnWrite() пользоваться как фактом коннекта, но оно может возникать и неоднократно. Как минимум, это ты не учитываешь, imho. Т.е. в какой-то момент времени в очередном событии OnWrite() ты пошлешь серверу вовсе не то, что он ожидает в соответствии с протоколом http , и сервер просто "заткнется", не понимая тебя. Что, похоже, у тебя и происходит ...

Не исключена ситуация с потенциальным нарушением протокола инф.обмена.

Убедись, что OnWrite() вызывается неоднократно.


savva   (2002-07-19 11:42:00) [51]

ведь событие OnConnect возникает при присоединении с прокси серверу..


savva   (2002-07-19 11:41:00) [52]

ага


Digitman   (2002-07-19 11:27:00) [53]

Т.е., факт успешного установления коннекта ты фиксируешь по событию OnWrite(), и в этом же событии передаешь первый запрос к серверу. Так ?


Страницы:   1 2 3

Наверх

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