LuaLanes и LuaSockets
я работаю над небольшим приложением Lua (под Lua для Windows, если это имеет значение), которое использует сокеты для связи с внешним миром. (LuaSocket)
И я'Я пытаюсь сделать несколько запросов параллельно. Поэтому я подумал, что LuaLanes - это путь. (Я'Я открыт для альтернатив, конечно, если естьЭто лучшее решение, но я бы предпочел не иметь дело с сопрограммами для этого.)
Что-то вроде этого:
server = assert (socket.bind ('*', 1234))
client = server : accept ()
-- set id to some unique value
allClients [id] = client
theLane = lanes.gen ("", laneTest) ( id )
print (theLane [1])
ГдеlaneTest
Функция определяется следующим образом:
function laneTest (id)
local client = allClients [id]
print ('peer: ', client:getpeername())
end
Моя проблема в том, что внутриlaneTest
функция, при запуске в качестве полосы движения, я получаю это прекрасное сообщение об ошибке:
попытка индексировать локальныйклиента (значение пользовательских данных)
(с линии)client:getpeername()
Так что я'я не уверен чтоздесь происходит? Линии несовместимы с розетками, или я делаю что-то очень неправильно?
Я думаю, может быть, что версия переулков, которая поставляется с Lua для Windows, является древней (luaforwindows) и не делаетработать с сокетами, но последняя версия может? (Дорожки 2.0.4 против более поздних 3.xx)
Я нея действительно не знаю, как перейти к обновлению версии Lanes Iу меня есть, иначе я бы попробовал это сейчас. Я'Буду признателен за любой совет, если этогде я мог бы быть или тамЧто-то более очевидное, что ямы сделали неправильно
редактировать: Я пошел дальше и установил дорожки через luarocks, и у меня возникла та же проблема с дорожками 3.1.6-1, что 'установлен как скала.
Редактировать 2: Пробовал это (и до сих пор не удалось)
require ('socket')
require ('lanes')
local allClients = {}
function theLane (id)
print ('the id:', id) -- correctly prints out the id passed to the function
local SOCKET = require ('socket')
local client = allClients [id]
print ('peer:', client:getpeername())
client : close ()
end
local server = assert (SOCKET.bind ('*', 1234))
local ip, port = server:getsockname ()
local laneFunc = lanes.gen('', theLane)
local client = server:accept ()
allClients [1] = client
local x = laneFunc (1)
print (x[1])
Это не утверждает:attempt to call global 'require' (a nil value)
Удалениеrequire ('socket')
Строка внутри функции и повторная попытка также проваливаются, говоря:attempt to index local 'client' (a userdata value)
Заранее извиняюсь за то, что упустил очевидное, но ... как вы получаете сокеты для работы с дорожками?
Изменить 3:
Ну яЯ редактирую это для дальнейшего использования :)
Насколько я могу судить,Нет возможности использовать дорожки с сокетами без исправления luasockets. Смотрите обсуждениеВот для больше об этом; но вкратце (и как объяснено в Деко 'ответ s): полосы не работают с пользовательскими данными. luasocket не предоставляет другого способа доступа к информации о сокетах / сокетах.
У меня нет желания исправлять luasocket так сильно, как я бы предпочел использовать полосы, яЯ собираюсь идти вперед и придерживаться Copas или Couroutines.
Спасибо всем!