Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TidTCPClient, Не пойму в чём хитрость 
:(
    Опции темы
Vovkin
Дата 11.10.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Набросал на TidTCPServer и TidTCPClient программки.
И обнаружил очень непонятную работу клиентской части программы.
Вот код.
Код

procedure TFormAdmin.BtSyncClick(Sender: TObject);
begin
    while not bend do
    begin
        IdTCPClient.IOHandler.CheckForDataOnSource(1);

        if DataSize = 0 then
            if IdTCPClient.IOHandler.InputBuffer.Size >= SizeOf(integer) then
                DataSize := IdTCPClient.IOHandler.ReadInteger(false);

        if DataSize <> 0 then
            while IdTCPClient.IOHandler.InputBuffer.Size >= DataSize do
            begin
                IdTCPClient.IOHandler.ReadStream(TStream(MSGET), DataSize, false);

                Cultivation();

                DataSize := 0;
                if IdTCPClient.IOHandler.InputBuffer.Size >= SizeOf(integer) then
                    DataSize := IdTCPClient.IOHandler.ReadInteger(false)
                else
                    break;
            end;

        IdTCPClient.IOHandler.Write(TStream(MSPUT), cnt, false);

        Application.ProcessMessages;
    end;
end;


В общем здесь по кнопке зпускается цикл, постоянно ожидаются данные с сервера
и на него отправляются данные. Самое станное то, что если сервер закончил передачу
даных то этот цикл постоянно возвлащает по ReadStream последние данные,
которые принимались. При чём если убрать Write в цикле всё работает как надо.
Если сервер закончил передавать сообщения, то и здесь цикл не будет ничего
вычитавать (IdTCPClient.IOHandler.InputBuffer.Size = 0). Но если вставить Write
как в вышеприведённом тексте, то цикл начинает постоянно молотить
и возвращать последний принятый блок данных. Т.е. предположим IdTCPClient.IOHandler.InputBuffer.Size в начале
цикла был 100 после всех чтений стал 0, но стоит сделать после этого Write и CheckForDataOnSource(1).
Как IdTCPClient.IOHandler.InputBuffer.Size снова почему то равен размеру который был, т.е. 100
и по ReadStream возвращаются теже данные, хотя сервер больше ничего не передаёт.
Кто знает как внутренняя кухня инди работает?
Что здесь не правильно и как заставить это правильно работать?

Это сообщение отредактировал(а) Vovkin - 11.10.2007, 23:42
PM MAIL   Вверх
Vovkin
Дата 12.10.2007, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Ой. Уже разобрался.
Дело вот в чём. Если отправитель делает Write с числом байт 0.
То получатель проваливается с флагом наличия данных,
но объём данных возвращает от последнего не равного 0
сообщения.
У меня просто случайно получилось, что сервер вызывался
write с нулём байт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.