Как правильно реализовать UDP listener на lua?

invilso.

Известный
Автор темы
252
89
Версия MoonLoader
.027.0-preview
У меня есть UDP сервер который пуляет в клиентов сообщениями, а клиенту нужно получать все (ну почти xD) сообщения.
Пробовал использоваться socket.udp и фукцию receive(udp) в бесконечном цикле, но игра почти стопорится если выставить таймаут больше 0.
А при таймауте в 0 сообщения lua клиентом не принимаются вообще.
Пробовал реализовать многопоточность через copas, не помогло.

В бесконечном цикле + в отдельном lua потоке:
asyncUdpRequest(true, function (dgram)
    if dgram then
        print(dgram)
    end
end)

Пробовал реализовать многопоточность через copas:
function asyncUdpRequest(req_type ,handler)
    -- start polling task
    if not copas.running then
        copas.running = true
        lua_thread.create(
            function()
                wait(0)
                while not copas.finished() do
                    local ok, err = copas.step(0)
                    if ok == nil then
                        error(err)
                    end
                    wait(0)
                end
                copas.running = false
            end
        )
    end
    -- do request
    if handler then
        return copas.addthread(
            function(req_type, data, h)
                copas.setErrorHandler(
                    function(err)
                        h(nil, err)
                    end
                )
                h(udpRequest(req_type, data))
            end,
            req_type,
            data,
            handler
        )
    else
        local results
        local thread =
            copas.addthread(
            function(req_type, data)
                copas.setErrorHandler(
                    function(err)
                        results = {nil, err}
                    end
                )
                results = table.pack(udpRequest(req_type, data))
            end,
            req_type,
            data
        )
        while coroutine.status(thread) ~= "dead" do
            wait(0)
        end
        return table.unpack(results)
    end
end

function udpRequest(req_type, data)
    if req_type then --listen
        udp:receive()
    else --send
        udp:send(data)
    end
end

Вот так я инициализировал udp приемник:
local socket = require "socket"

local host = "127.0.0.1"
local port = 7171

udp = socket.udp()
udp:setpeername(host, port)
udp:settimeout(1)
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,141
Примерно так же, как и здесь: