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.

Спасибо всем!

Ответы на вопрос(2)

Ваш ответ на вопрос