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