Текущий архив: 2004.02.17;
Скачать: CL | DM;
Вниз
Длина принятых данных Найти похожие ветки
← →
Андреев (2003-12-13 14:12) [0]В клиенте в обработчике нажатия кнопки стоит
ClientSocket.Socket.SendText("Text");
На сервере контролируем длину принятого сообщения
l:=Length(Socket.RecieveText);
Нажимаем на кнопку - получаем l=4.
Но если нажимать очень быстро то получаем 8 а то и 12.
Как это лечить?
(Реально используется не кнопка, а построчная пересылка данных по 5символов)
← →
Digitman © (2003-12-13 14:25) [1]
> Как это лечить?
что "лечить"-то ? в этом нет ничего "больного" - так и должно быть
← →
Polevi © (2003-12-13 18:41) [2]предваряй данные размером данных
считывай размер, затем колво байт = размеру
← →
Андреев (2003-12-14 10:33) [3]Если я буду посылать сначала длину данных то будет ещё большее нагромождение в Length(RecieveText). Скорость поступления данных для передачи на сервер я не могу регулировать.
Надо сделать чтоб данные не слипались.
← →
Digitman © (2003-12-14 11:40) [4]
> то будет ещё большее нагромождение
кто вообще заставляет тебя использовать ReceiveText() ?
есть еще метод ReceiveBuf(), который , собственно, и вызывается внутри метода ReceiveText() !
> Скорость поступления данных для передачи на сервер я не
> могу регулировать.
глупости.
если, к примеру, в соответствии с ПИО, ожидается поступление данных типа Integer (4 байта), то в событии OnRead() считывай не более 4-х байт. Получил меньше ? Буферизуй то что получил и жди след.события OnRead(), в котором будешь пытаться прочитать-буферизовать недостающие до Integer-размера число байт... и так до тех пор пока не будут прияты все 4 байта
> Надо сделать чтоб данные не слипались
именно для этого в ПИО и следует предусмотреть префикс размера и/или символы-разделители структурных пакетов
← →
Андреев (2003-12-14 20:02) [5]RecieveBuf() я тоже пробовал. Всёравно слипается также.
Ещё проблема- сервер как бы не знает сколько байт ожидается.
← →
Digitman © (2003-12-15 08:50) [6]
> Всёравно слипается также
да что значит "слипается" ?!
TCP - протокол поточный !!
кто тебе вообще сказал, что каждый SendText() на стороне передатчика будет соответствовать отдельному ReceiveText() на стороне приемника ? нет и не может быть такого соответствия при поточном протоколе !
> сервер как бы не знает сколько байт ожидается
если клиент ему об этом не сообщит, то, разумеется, знать не будет !
← →
Андреев (2003-12-15 18:28) [7]Тогда поставим вопрос так.
Через порт RS232 приходят данные( команды запроса) их надо переправить на устройство которое подключено к RS232 на другом компьютере. Потом принять ответ.
Это возможно реализовать?
Когда приходит единичный запрос - всё работает.
Но запросы приходят с частотой примерно блоков в секунду. И запросы слипаются...
← →
savva © (2003-12-15 18:48) [8]я повторю слова Digitman , но все таки...
Ты болки, приходящий в COM-порт разделять умеешь?
Если да, то делаешь так: перед посылкой пакет посылай число 4 байта (я думаю тебе хватит) указывающие на размер посылаемого пакета. На принимающей стороне принимаешь 4 байта ( !! ни больше не меньше:)), получаешь ожидаемый размер данных. Затем читаешь ровно столько сколько надо и так до бесконечности:) Если по каким либо причинам к тебе пришло меньше, чем "должно было" запоминай сколько не прочитал, чтобы именно столько прочитать в следующем шаге цикла..
Все это упрощено сильно..
ЗЫ. из струи воды ведром сложно забрать кубометр.. так же и у тебя. Как вариант можешь использовать строго регламетрированные структуры для отсылки и получения - но все равно тебе придется обрабатывать количество прочитанных/непрочитанных байтиков..
Страницы: 1 вся ветка
Текущий архив: 2004.02.17;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.038 c