Чтение символа новой строки из сокета в Delphi - PullRequest
2 голосов
/ 28 апреля 2011

Я работаю над программой на Delphi, которая должна соответствовать стандартному протоколу ADC . Этот протокол указывает, что каждая строка заканчивается символом новой строки (# 10 # 13 ИЛИ sLineBreak). Проблема в том, что символ новой строки, похоже, не переживает поездки с сервера в программу. Чтение данных из сокета, кажется, просто дает все это одной большой строкой. Я думал, что это как-то связано с тем, как программа отображала отладочные сообщения (объекту TMemo), но Pos (sLineBreak, Buf) всегда возвращает 0 (то есть не может найти строку).

Мой код:

procedure OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  //read all the data from the socket
  while Socket.ReceiveLength > 0 do
    Buf := Buf + Socket.ReceiveText;

  //use only complete lines
  while Pos(sLineBreak, Buf) > 0 do begin
    //parsing stuff
  end;
end;

Кроме того, серверу не нужно отправлять команды на разных этапах, он может отправлять их все сразу с символами новой строки в них, следовательно, необходимо прочитать весь сокет, а затем пройти его, а не принимать один команда на чтение сокета.

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

Спецификация протокола гласит: «новая строка (кодовая точка 0x0a) завершает каждое сообщение». Это один персонаж. В синтаксисе Delphi это #10 или #$a.

Обычное значение для sLineBreak в Windows - #13#10 - сначала идет возврат каретки, затем перевод строки. Последовательность #10#13 не является разрывом строки на любой платформе, о которой я знаю.

Все отображается как одна строка в элементе управления заметкой, потому что вы получаете только символы новой строки, без возврата каретки, и TMemo ожидает, что оба символа заканчивают строку. Это так же, как если бы вы загрузили текстовый файл в стиле Unix в Блокнот.

3 голосов
/ 28 апреля 2011

Хм, на странице, на которую вы ссылаетесь, в синтаксисе сообщения четко указано, что новая строка представляет собой один символ:

eol ::= #x0a

, а sLineBreak - это два символа в Windows, как вы утверждаете.

...