【发布时间】:2012-11-04 14:50:53
【问题描述】:
我正在开发一个小 Lua 应用程序(在 Lua for 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 for Windows 附带的通道版本是古老的 (luaforwindows) 并且不适用于套接字,但最新版本可能吗? (车道 2.0.4 与最近的 3.xx)
我真的不知道如何更新我拥有的车道版本,否则我现在已经尝试过了,所以。如果那是我可能要去的地方或者有更明显的事情我做错了,我会很感激任何建议。
编辑: 我继续通过 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:
好吧,我正在编辑它以供将来参考:)
据我所知,没有修补 luasocket 就无法使用带有套接字的通道。有关更多信息,请参阅讨论here;但简而言之(正如德科的回答中所解释的那样):车道不适用于用户数据。 luasocket 不提供任何其他访问套接字/套接字信息的方式。
我不想修补 luasocket,就像我宁愿使用车道一样,我会继续坚持使用 copas 或 couroutines。
谢谢大家!
【问题讨论】: