Я новичок в 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, и эта ошибка всегда возникает.Есть идеи, чтобы решить это?спасибо