Как проверить, потерял ли неблокирующий клиент luasocket свое соединение? - PullRequest
0 голосов
/ 16 сентября 2018

Я пишу 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.

1 Ответ

0 голосов
/ 19 февраля 2019

Я тоже пытался решить эту проблему.Я обнаружил, что очень маленькое значение settimeout () по-прежнему возвращает ошибку, которую вы можете использовать, но не удерживает программу вообще.

Я использую local Data, Error = Client:settimeout(0.0001)

...