Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TidTCPClient


Автор: Vovkin 11.10.2007, 23:40
Набросал на 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 12.10.2007, 00:12
Ой. Уже разобрался.
Дело вот в чём. Если отправитель делает Write с числом байт 0.
То получатель проваливается с флагом наличия данных,
но объём данных возвращает от последнего не равного 0
сообщения.
У меня просто случайно получилось, что сервер вызывался
write с нулём байт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)