Я работаю над небольшим приложением 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, которая у меня есть, иначе я бы уже пробовал это сейчас, так что. Я был бы признателен за любой совет, если бы я мог туда направиться или было что-то более очевидное, что я сделал неправильно.
Правка: я пошел дальше и установил полосы через 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. См. Обсуждение здесь, чтобы узнать об этом подробнее; но вкратце (и как объяснено в ответе Деко): полосы не работают с пользовательскими данными. luasocket не предоставляет никаких других способов доступа к информации о сокете / сокете.
У меня нет желания патчить luasocket, так как я предпочел бы использовать дорожки, я продолжаю и придерживаюсь копов или курсовых программ.
Спасибо всем!