@un_def

Lua, как осуществлять чтение данных из сокета без символа LF?

Есть сервер, который периодически посылает данные (команды) без символа перевода строки в конце, но использует при этом свой маркер (|). В perl'е я легко получаю эти данные построчно (то есть каждую команду отдельно) с помощью методов $socket->recv() или $socket->getline(). В lua аналогичный код ждёт данные до таймаута (использую блокирующий режим) и возвращает все полученные команды сразу в виде одной строки (команда1|команда2|команда3|…|).

Как я понял из мануала, luasocket обязательно ждёт LF в конце передаваемых данных. CR игнорируется (вырезается). В perl'е в таком случае можно изменить маркер конца строки (временно присвоив новое значение специальной переменной $/ или c помощью $socket->input_record_separator() — в моём случае на символ '|'.

Как быть в случае lua? Придумал только некрасивое решение — установить минимальный таймаут (1 секунду) и получать из сокета 'partial result' (по факту это будет несколько команд в одну строку, т.к. они отправляются с меньшим интервалом, и за секунду в буфере накапливается несколько).
  • Вопрос задан
  • 3083 просмотра
Пригласить эксперта
Ответы на вопрос 1
AterCattus
@AterCattus
Люблю быстрый backend
В luasocket вызов client:receive([pattern [, prefix]])
Pattern can be any of the following:
'*a': reads from the socket until the connection is closed. No end-of-line translation is performed;
'*l': reads a line of text from the socket. The line is terminated by a LF character (ASCII 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not included in the returned line. In fact, all CR characters are ignored by the pattern. This is the default pattern;
number: causes the method to read a specified number of bytes from the socket


Второй и третий варианты не подходят?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы