Прошу помощи в правильной организации 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
И вот тут возникает засада ((
Пока сообщения идут с маленьким перерывам, всё ок. А как только перерыв между сообщениями увеличивается до нескольких минут, всё, ждём пока что-либо не будет принято...
Подскажите, плз, какие есть способы преодолеть это?
Вам для начала нужно выставлять тайм-аут сокета при получении данных. Начните с документации luasocket на settimeout. А потом менять цикл обработки.
Пробовал так: ... tcp:connect(host, port) tcp:settimeout(5) ... После этого соединение рвётся.
Сокет работает в двух режимах: с бесконечной блокировкой и с таймаутом. С блокировкой - сокет блокирует соединение пока не примет что-нибудь, и tcp:receive() без аргументов ждёт разрыва соединения. Чтобы принять строку с разделителем \r\n — используй tcp:receive("*l"). Второй вариант — сокеты с таймаутом, там если ничего не пришло по таймеру — соединение отпускает, и может идти дальше, например проверять другие соединения.
Соединение не рвётся. Просто тебе нужно сделать цикл tcp:receive(), когда что-то придёт — оно тебе обязательно скажет, и в цикле ты можешь делать что-то ещё помимо сетевого соединения.
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
Отчитываюсь об испытаниях ) За три недели круглосуточной работы сбоев практически не возникло! Со стороны "сервера" соединение завершалось раз пятнадцать (сбой по питанию), и клиент успешно открывал его заново. Однако три раза пришлось вручную перезапускать, так как ответы переставали приходить. Ввёл тестовый запрос по ответу на который оцениваем "живое" ли наше соединение.
Да, пинговать коннект отдельным текстом крайне желательно.
Обсуждают сегодня