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

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

Длина принятых данных [D5, Win95/98]


Андреев ©   (2003-12-13 14:12:00) 

В клиенте в обработчике нажатия кнопки стоит
ClientSocket.Socket.SendText("Text");

На сервере контролируем длину принятого сообщения
l:=Length(Socket.RecieveText);

Нажимаем на кнопку - получаем l=4.
Но если нажимать очень быстро то получаем 8 а то и 12.
Как это лечить?
(Реально используется не кнопка, а построчная пересылка данных по 5символов)


savva   (2003-12-15 18:48:00) [1]

я повторю слова Digitman , но все таки...
Ты болки, приходящий в COM-порт разделять умеешь?

Если да, то делаешь так: перед посылкой пакет посылай число 4 байта (я думаю тебе хватит) указывающие на размер посылаемого пакета. На принимающей стороне принимаешь 4 байта ( !!ни больше не меньше:)), получаешь ожидаемый размер данных. Затем читаешь ровно столько сколько надо и так до бесконечности:) Если по каким либо причинам к тебе пришло меньше, чем "должно было" запоминай сколько не прочитал, чтобы именно столько прочитать в следующем шаге цикла..

Все это упрощено сильно..

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


Андреев   (2003-12-15 18:28:00) [2]

Тогда поставим вопрос так.
Через порт RS232 приходят данные( команды запроса) их надо переправить на устройство которое подключено к RS232 на другом компьютере. Потом принять ответ.
Это возможно реализовать?
Когда приходит единичный запрос - всё работает.
Но запросы приходят с частотой примерно блоков в секунду. И запросы слипаются...


Digitman   (2003-12-15 08:50:00) [3]


> Всёравно слипается также


да что значит "слипается" ?!
TCP - протокол поточный !!

кто тебе вообще сказал, что каждый SendText() на стороне передатчика будет соответствовать отдельному ReceiveText() на стороне приемника ? нет и не может быть такого соответствия при поточном протоколе !


> сервер как бы не знает сколько байт ожидается


если клиент ему об этом не сообщит, то, разумеется, знать не будет !


Андреев   (2003-12-14 20:02:00) [4]

RecieveBuf() я тоже пробовал. Всёравно слипается также.
Ещё проблема- сервер как бы не знает сколько байт ожидается.


Digitman   (2003-12-14 11:40:00) [5]


> то будет ещё большее нагромождение


кто вообще заставляет тебя использовать ReceiveText() ?
есть еще метод ReceiveBuf(), который , собственно, и вызывается внутри метода ReceiveText() !


> Скорость поступления данных для передачи на сервер я не
> могу регулировать.


глупости.

если, к примеру, в соответствии с ПИО, ожидается поступление данных типа Integer (4 байта), то в событии OnRead() считывай не более 4-х байт. Получил меньше ? Буферизуй то что получил и жди след.события OnRead(), в котором будешь пытаться прочитать-буферизовать недостающие до Integer-размера число байт... и так до тех пор пока не будут прияты все 4 байта


> Надо сделать чтоб данные не слипались


именно для этого в ПИО и следует предусмотреть префикс размера и/или символы-разделители структурных пакетов


Андреев   (2003-12-14 10:33:00) [6]

Если я буду посылать сначала длину данных то будет ещё большее нагромождение в Length(RecieveText). Скорость поступления данных для передачи на сервер я не могу регулировать.
Надо сделать чтоб данные не слипались.


Polevi   (2003-12-13 18:41:00) [7]

предваряй данные размером данных
считывай размер, затем колво байт = размеру


Digitman   (2003-12-13 14:25:00) [8]


> Как это лечить?


что "лечить"-то ? в этом нет ничего "больного" - так и должно быть


Наверх

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