Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

Определение размера отправленых данных через TSocket   Найти похожие ветки 

 
Del   (2008-02-07 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 ©   (2008-02-08 04:41) [1]

пакеты слепляет это нормально...
никаких "пауз"! Протокол на таймаутах работать нормально не может... Вводи в протокол разделитель - например перевод строки...
и вообще протокал в студию... и если его нет - горе тебе т.к. ReceiveText работает до поры до времени, а патом огребешь


 
Slym ©   (2008-02-08 04:43) [2]

и что тебе мешает сделать на сервере тоже самое что и на клиенте?
принципиальной разницы нет...


 
Slym ©   (2008-02-08 04:45) [3]

И вообще хотя бы по этому сайту поискал - примеры тут есть например http://delphimaster.net/view/6-1202118907/


 
ketmar ©   (2008-02-08 05:14) [4]

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

---
Understanding is not required. Only obedience.


 
Del   (2008-02-13 00:49) [5]


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

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

> И вообще хотя бы по этому сайту поискал - примеры тут есть
> например http://delphimaster.net/view/6-1202118907/

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

Спасибо за содержательные ответы.


 
Anatoly Podgoretsky ©   (2008-02-13 00:52) [6]

> Del  (13.02.2008 00:49:05)  [5]

Вот когда не найдешь, вот тогда на форум.
Форум не является справочником.


 
Slym ©   (2008-02-13 04:33) [7]

Del   (13.02.08 0:49) [5]
Там  немного другая проблема, есл ипочитать поподробней.

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

протокол должен иметь заголовок:
1. быть с фиксированным по размеру заголовком
2. быть с динамическим размером, но с фиксированным по размеру предзаголовком с указанием длинны загаловка...
3. быть с динамическим размером, но со внятным разделителем в конце...
То же самое относится к "целевым" данным... либо указание длинны в заголовке, либо внятный разделитель  - который не встретится в теле сообщения, а при наличии бинарных данных это имеет определенную сложность


 
Del   (2008-02-13 20:51) [8]

Спасибо, теперь понятнее. Будем посмотреть, будем порешать.


 
DiamondShark ©   (2008-02-19 16:17) [9]


> Del   (13.02.08 20:51) [8]

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

Вот из-за таких халявщиков, как ты, и пропадает желание отвечать на всякий чих.



Страницы: 1 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
8-1194642408
Blind Guardian
2007-11-10 00:06
2009.05.31
Класс для чтения данных о полигонах 3Д сцен, сделанных в 3ds max


15-1238193839
KilkennyCat
2009-03-28 01:43
2009.05.31
Проект "Библиотека"


2-1239880524
mefodiy
2009-04-16 15:15
2009.05.31
"Белая форма"


2-1240206152
FEV
2009-04-20 09:42
2009.05.31
Получить код клавиш


3-1222062150
Юрий Катунов
2008-09-22 09:42
2009.05.31
Сортировка в DBGrid