Текущий архив: 2007.09.02;
Скачать: CL | DM;
Вниз
Сокеты и слияние команд Найти похожие ветки
← →
Снова я (2007-08-11 14:34) [0]Как избежать слияния отправляемого и принимаемого текста через TSocketServer(Client).SendText(RecieveText) в асинхронном режиме? Пока реализовал отправку с сервера с задержкой (50 мс), но даже так, особенно через интернет (тем более если у пользователя модем :)) на стороне клиента иногда команды сливаются в одну строку. Как собсно этого избежать и при этом использовать неблокирующее соединение (использование некого символа как терминатора команды не канает ибо после него может придти незавершенный кусок следующей команды). Желательно алгоритм.
← →
Двигатель внешнего сгорания (2007-08-11 14:40) [1]
> Снова я (11.08.07 14:34)
Это кто?
Иди и ищи в конференции "Сети" и в "Начинающих".
Полно таких вопросов.
За тебя искать?
← →
Снова я (2007-08-11 15:47) [2]Поискал но тщетно... Могли бы и ссылочку дать :)
← →
Снова я (2007-08-11 16:56) [3]От вас недождесси :) Придется пользоваться вариантом с терминатором строки :) Он конечно не является элегантным и оптимизированным но вполне справляется с задачей приема команд от сервера и их выполнения когда когда за раз может прилететь или кусок предыдущей команды или несколько команд в строке.
Каждая команда заканчивается символом "<". Обьявлена глобальная переменная currentCmd.
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s: String;
i: Word;
recieving: Boolean;
begin
s := Socket.ReceiveText;
recieving := false;
for i:=1 to length(s) do begin
recieving := true;
if s[i] = "<" then begin // конец команды
recieving := false;
Execute(currentCmd);
currentCmd := "";
end
if recieving then currentCmd := currentCmd+s[i];
end;
end;
В связи с этим еще вопрос. Какой код символа который невозможно явно (или через Alt) напечатать скажем в TEdit а только сгенерировать в программе? Для символа, завершающего команду.
← →
Anatoly Podgoretsky © (2007-08-11 17:26) [4]> Снова я (11.08.2007 16:56:03) [3]
Невозможно с помощью клавиатуры сгенерировать только код символа #0
Все остальные 255 (для ANSI) возможно
← →
Двигатель внешнего сгорания (2007-08-12 00:02) [5]
> Снова я (11.08.07 16:56) [3]
> От вас недождесси :) Придется пользоваться вариантом с терминатором
> строки :) Он конечно не является элегантным и оптимизированным
> но вполне справляется с задачей приема команд от сервера
> и их выполнения когда когда за раз может прилететь или кусок
> предыдущей команды или несколько команд в строке.Каждая
> команда заканчивается символом "<". Обьявлена глобальная
> переменная currentCmd.
Для передачи текста стандартное решение использовать терминатором символы 0d0a, либо только 0a.
← →
Anatoly Podgoretsky © (2007-08-12 00:07) [6]> Двигатель внешнего сгорания (12.08.2007 00:02:05) [5]
Почему "только 0a", чем только 0d не устраивает или другое любое значение. В таблице ASCII нет символа конец строки.
← →
Двигатель внешнего сгорания (2007-08-12 00:20) [7]
> > Двигатель внешнего сгорания (12.08.2007 00:02:05) [5]Почему
> "только 0a", чем только 0d не устраивает или другое любое
> значение. В таблице ASCII нет символа конец строки.
Как стандарты окончания строки в Windows- и Unix-системах ...
Страницы: 1 вся ветка
Текущий архив: 2007.09.02;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.033 c