luasocket + copas error - попытка уступить через C-call границу - PullRequest
0 голосов
/ 04 декабря 2018

Я новичок в Lua и пытаюсь внедрить TCP-сервер и клиента в Openwrt, используя luasocket и copas .Цель состоит в том, чтобы заставить 3 программы взаимодействовать друг с другом через сокет в асинхронной сети.

Ниже приведен сценарий

local copas = require("copas")
local socket = require("socket")

local host = "localhost"
local port = 20000

local hostcl1 = "localhost"
local portcl1 = 20001

local hostcl2 = "localhost"
local portcl2 = 20002

local function echoHandler(skt)
    skt = copas.wrap(skt)
    while true do
        local data = skt:receive()
        print("data received:", data, "from:", skt:getsockname())
        if not data or data == nil then
            break
        end
    end
end

local function sendToNeighbor(host, port, data)
    skt = socket.connect(host, port)
    if (skt ~= nil) then
        skt = copas.wrap(skt)
        print("client connected to " ..host.. ":" ..port.. "...")
        copas.send(skt, data.."\n")
        print("data sent")
        skt:close()
        print("Closed!")
    else
        print("client failed to send to " ..host.. ":" ..port.. "...")
    end
end

local server = socket.bind(host, port)

copas.addserver(server, echoHandler, 0)

SendInterval = 10
SecBefore = os.date('%S')
SecSend = (SecBefore + SendInterval)%60

while true do
    copas.step(0)
    local Sec = os.date('%S')
    if ( tonumber(Sec) == SecSend ) then
        dataToClient1 = "Test1"
        dataToClient2 = "Test2"
        sendToNeighbor(hostcl1, portcl1, dataToClient1)
        sendToNeighbor(hostcl2, portcl2, dataToClient2)
        SecBefore = Sec
        SecSend = (SecBefore + SendInterval)%60
    end
end

В приведенном выше сценарии я использую 3 аналогичные программы в host = "localhost" и 3 различных порта (20000, 20001 и 20002).Я хочу, чтобы каждая программа слушала друг друга и посылала друг другу данные каждые 10 секунд.Проблема заключается в том, что каждый раз, когда программа отправляет данные с помощью функции copas.send, возникает эта ошибка.

luajit: /usr/local/share/lua/5.1/copas.lua:285: attempt to yield across C-call boundary

Я пытался использовать lua 5.1, lua 5.1 + CoCo и LuaJIT, и эта ошибка всегда возникает.Есть идеи, чтобы решить это?спасибо

...