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

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

Сокеты и слияние команд [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) 


Это кто?

Иди и ищи в конференции "Сети" и в "Начинающих".
Полно таких вопросов.
За тебя искать?


Наверх

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