![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты и слияние команд [D7, XP]
Снова я © (2007-08-11 14:34:00)Как избежать слияния отправляемого и принимаемого текста через TSocketServer(Client).SendText(RecieveText) в асинхронном режиме? Пока реализовал отправку с сервера с задержкой (50 мс), но даже так, особенно через интернет (тем более если у пользователя модем :)) на стороне клиента иногда команды сливаются в одну строку. Как собсно этого избежать и при этом использовать неблокирующее соединение (использование некого символа как терминатора команды не канает ибо после него может придти незавершенный кусок следующей команды). Желательно алгоритм.
Двигатель внешнего сгорания (2007-08-12 00:20:00) [1]
> > Двигатель внешнего сгорания (12.08.2007 00:02:05) [5]Почему
> "только 0a", чем только 0d не устраивает или другое любое
> значение. В таблице ASCII нет символа конец строки.
Как стандарты окончания строки в Windows- и Unix-системах ...
Anatoly Podgoretsky (2007-08-12 00:07:00) [2]> Двигатель внешнего сгорания (12.08.2007 00:02:05) [5]
Почему "только 0a", чем только 0d не устраивает или другое любое значение. В таблице ASCII нет символа конец строки.
Двигатель внешнего сгорания (2007-08-12 00:02:00) [3]
> Снова я (11.08.07 16:56) [3]
> От вас недождесси :) Придется пользоваться вариантом с терминатором
> строки :) Он конечно не является элегантным и оптимизированным
> но вполне справляется с задачей приема команд от сервера
> и их выполнения когда когда за раз может прилететь или кусок
> предыдущей команды или несколько команд в строке.Каждая
> команда заканчивается символом '<'. Обьявлена глобальная
> переменная currentCmd.
Для передачи текста стандартное решение использовать терминатором символы 0d0a, либо только 0a.
Anatoly Podgoretsky (2007-08-11 17:26:00) [4]> Снова я (11.08.2007 16:56:03) [3]
Невозможно с помощью клавиатуры сгенерировать только код символа #0
Все остальные 255 (для ANSI) возможно
Снова я (2007-08-11 16:56:00) [5]От вас недождесси :) Придется пользоваться вариантом с терминатором строки :) Он конечно не является элегантным и оптимизированным но вполне справляется с задачей приема команд от сервера и их выполнения когда когда за раз может прилететь или кусок предыдущей команды или несколько команд в строке.
Каждая команда заканчивается символом '<'. Обьявлена глобальная переменная 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 а только сгенерировать в программе? Для символа, завершающего команду.
Снова я (2007-08-11 15:47:00) [6]Поискал но тщетно... Могли бы и ссылочку дать :)
Двигатель внешнего сгорания (2007-08-11 14:40:00) [7]
> Снова я (11.08.07 14:34)
Это кто?
Иди и ищи в конференции "Сети" и в "Начинающих".
Полно таких вопросов.
За тебя искать?