169 похожих чатов

Здравствуйте, коллеги! Начинаю изучать применение lua в различных железках ))


Прошу помощи в правильной организации telnet-соединения!!
Суть в чём, две железки должны общаться передавая короткие команды раз в 10..15 минут. Помимо сообщений о текущем состоянии необходимо изредка (40..60 сек) отправлять дополнительные запросы.
Напрашивается простая схема типа:

local socket = require("socket")
local host = hostIP
local port = 23
local tcp = assert(socket.tcp())
tcp:connect(host, port)
---
while tcp do
local res, err = tcp:receive()
dosomething(res, err)
local command = GetComm()
tcp:send(command..'\r\n')
end

И вот тут возникает засада ((
Пока сообщения идут с маленьким перерывам, всё ок. А как только перерыв между сообщениями увеличивается до нескольких минут, всё, ждём пока что-либо не будет принято...
Подскажите, плз, какие есть способы преодолеть это?

7 ответов

13 просмотров

Вам для начала нужно выставлять тайм-аут сокета при получении данных. Начните с документации luasocket на settimeout. А потом менять цикл обработки.

A-G Автор вопроса
🐅🤦‍♂️ Денис
Вам для начала нужно выставлять тайм-аут сокета пр...

Пробовал так: ... tcp:connect(host, port) tcp:settimeout(5) ... После этого соединение рвётся.

Сокет работает в двух режимах: с бесконечной блокировкой и с таймаутом. С блокировкой - сокет блокирует соединение пока не примет что-нибудь, и tcp:receive() без аргументов ждёт разрыва соединения. Чтобы принять строку с разделителем \r\n — используй tcp:receive("*l"). Второй вариант — сокеты с таймаутом, там если ничего не пришло по таймеру — соединение отпускает, и может идти дальше, например проверять другие соединения.

A G
Пробовал так: ... tcp:connect(host, port) tcp:sett...

Соединение не рвётся. Просто тебе нужно сделать цикл tcp:receive(), когда что-то придёт — оно тебе обязательно скажет, и в цикле ты можешь делать что-то ещё помимо сетевого соединения.

A G
Пробовал так: ... tcp:connect(host, port) tcp:sett...

local socket = require("socket") local host = hostIP local port = 23 local tcp = assert(socket.tcp()) tcp:settimeout(0) local status = tcp:connect(host, port) --- while status ~= 'closed' do -- команды telnet однострочные, -- поэтому "*l", т.е. line local data data, status = tcp:receive("*l") if data then dosomething(data, status) end local command = GetComm() if command then tcp:send(command..'\r\n') end socket.sleep(0.03) end

A-G Автор вопроса
Snusmumriken
local socket = require("socket") local host = host...

Отчитываюсь об испытаниях ) За три недели круглосуточной работы сбоев практически не возникло! Со стороны "сервера" соединение завершалось раз пятнадцать (сбой по питанию), и клиент успешно открывал его заново. Однако три раза пришлось вручную перезапускать, так как ответы переставали приходить. Ввёл тестовый запрос по ответу на который оцениваем "живое" ли наше соединение.

A G
Отчитываюсь об испытаниях ) За три недели круглосу...

Да, пинговать коннект отдельным текстом крайне желательно.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта