Я пишу Lua-скрипт для OBS, который непрерывно получает данные из ProPresenter (другой программы) по TCP-соединению. Я использую библиотеку LuaSocket, чтобы установить соединение, и я получаю данные, как и ожидалось.
Проблема в том, что когда я закрываю ProPresenter, я не могу заставить свой сценарий зарегистрировать, что соединение закрыто, в то время как я устанавливаю тайм-аут luasocket в 0 (чтобы это было неблокирующее соединение). Мне нужно, чтобы скрипт постоянно блокировался, иначе он приведет к остановке всех OBS и падению частоты кадров ниже 1 ...
Однако, если я установлю тайм-аут, например. Через 1 секунду luasocket регистрирует, что соединение закрывается без проблем, и, согласно этому примеру, оно должно работать, когда время ожидания равно 0. Но, по-видимому, это не так, и я подозреваю, что это потому, что в примере используется более старая версия Luasocket, и что новейшая версия могла измениться.
Вот мой код:
Не регистрирует, что соединение закрыто из-за тайм-аута:
function recv_and_process_data()
local data
data, err, partial = s:receive()
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--doesn't get here because of timeout...
--inform script that the connection has closed
elseif err == "timeout" then
--goes here as soon as ProPresenter is closed
print(err .. " partial: " .. partial)
end
end
Регистрируется при закрытии соединения, но останавливает OBS:
function recv_and_process_data()
local data
s:settimeout(1) --timeout set to 1 second
data, err, partial = s:receive()
s:settimeout(0)
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--goes here when ProPresenter is closed
--inform script that the connection has closed
elseif err == "timeout" then
print(err .. " partial: " .. partial)
end
end
Это тоже не работает (как подсказывает здесь ):
function recv_and_process_data()
local data
data, err, partial = s:receive(0)
if err == "closed" then
print(err .. " partial: " .. partial)
end
end
Если я не могу заставить это работать, я думаю, что я должен попытаться повторно соединиться, чтобы видеть, все еще работает ли сервер ProPresenters.