Конференция "Сети" » Определение размера отправленых данных через TSocket [WinXP]
 
  • Del (07.02.08 21:35) [0]
    Доброе время суток. Столкнулся со слдующей проблемой.
    Есть программа, которая организовывает передачу фалов по сети. Собственно -чат, с доп. функцией передачи. Сама передача работает на ура, однако возникает проблема с отображением размера передаваемого файла.
    На стороне клиента проресс принятого файла выводится через стандартный компонент ProgressBar, а также в поле Edit.
    Возникает вопрос - как отобразить колличество отправленной на данный момент информации на стороне сервера.
    Собственно попытался снять показания progressbar`a на стороне клиента и передать их на сервер (варварский способ, конечно, а что делать?:() следующим путём:
    На первый принятый байт у клиента включается таймер (пережиток попытки отправлять прогресс по времени), далее следующий код:

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Timer1.Enabled:=false;
    If ProgressBAr1.Position>1 Then begin
    ClientSocket3.Socket.SendText(IntToStr(ProgressBar1.Position));
    end else ClientSocket3.Socket.SendText('0');
    end;

    procedure TForm1.ServerSocket3ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
    Edit1.Text:='';
    Edit1.Text:=Socket.ReceiveText;
    Socket.SendText('ok');
    end;

    procedure TForm1.ClientSocket3Read(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
             If Socket.ReceiveText='ok' Then
    Begin If ProgressBar1.Position<100 Then
    Socket.SendText(IntToStr(ProgressBar1.Position)); end;
    end;



    Так вот. В поле Edit1 всё попадает путём... НО!
    после второй посылочки начинает писать вместо 2, потом 3, потом 4 и т.д. 2, 23, 234, 345, 3445 и в таком духе.
    Возникает впечатление, что Сокет не успевает очистить полученную информацию из своего буфера и шлёпает её подряд. Ставил паузы. Долгие. Не помогает.
    Прошу помочь. Если не трудно.
  • Slym © (08.02.08 04:41) [1]
    пакеты слепляет это нормально...
    никаких "пауз"! Протокол на таймаутах работать нормально не может... Вводи в протокол разделитель - например перевод строки...
    и вообще протокал в студию... и если его нет - горе тебе т.к. ReceiveText работает до поры до времени, а патом огребешь
  • Slym © (08.02.08 04:43) [2]
    и что тебе мешает сделать на сервере тоже самое что и на клиенте?
    принципиальной разницы нет...
  • Slym © (08.02.08 04:45) [3]
    И вообще хотя бы по этому сайту поискал - примеры тут есть например http://pda.delphimaster.net/?id=1202118907&n=4
  • ketmar © (08.02.08 05:14) [4]
    да это всё фигня, круто замешаная на непонимании работы TCP. смысл распинаться? автору читать надо. много и вдумчиво.

    ---
    Understanding is not required. Only obedience.
  • Del (13.02.08 00:49) [5]

    > да это всё фигня, круто замешаная на непонимании работы
    > TCP. смысл распинаться? автору читать надо. много и вдумчиво.
    >

    Да знаю я как работают сетевые протоколы. Я не знаю, как с ними в Дельфи работать. А если на все вопросы отсылать читать, то зачем форум тогда вообще? Если перерыть всю литературу, то найти можно всё.

    > И вообще хотя бы по этому сайту поискал - примеры тут есть
    > например http://pda.delphimaster.net/?id=1202118907&n=4

    Там  немного другая проблема, есл ипочитать поподробней.

    Спасибо за содержательные ответы.
  • Anatoly Podgoretsky © (13.02.08 00:52) [6]
    > Del  (13.02.2008 00:49:05)  [5]

    Вот когда не найдешь, вот тогда на форум.
    Форум не является справочником.
  • Slym © (13.02.08 04:33) [7]
    Del   (13.02.08 0:49) [5]
    Там  немного другая проблема, есл ипочитать поподробней.

    Проблема аналогичная твоей: нет правлильного протокола...
    ориентация протокола (в твоем случае) на то что один SendText вызовет
    один

    ReceiveText ошибочна!

    протокол должен иметь заголовок:
    1. быть с фиксированным по размеру заголовком
    2. быть с динамическим размером, но с фиксированным по размеру предзаголовком с указанием длинны загаловка...
    3. быть с динамическим размером, но со внятным разделителем в конце...
    То же самое относится к "целевым" данным... либо указание длинны в заголовке, либо внятный разделитель  - который не встретится в теле сообщения, а при наличии бинарных данных это имеет определенную сложность
  • Del (13.02.08 20:51) [8]
    Спасибо, теперь понятнее. Будем посмотреть, будем порешать.
  • DiamondShark © (19.02.08 16:17) [9]

    > Del   (13.02.08 20:51) [8]

    А зачем тогда врал: "Да знаю я как работают сетевые протоколы"?

    Вот из-за таких халявщиков, как ты, и пропадает желание отвечать на всякий чих.
 
Конференция "Сети" » Определение размера отправленых данных через TSocket [WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]