我有一个自定义的Lua解释器可执行文件,内置了一些基本的套接字功能。它不是Luasocket,而且由于我想在这里使用Luasocket而已,但我做不到(所以请不要提出它作为答案)。
我正在使用的套接字API依赖于异步闭包来表示网络操作已完成。因此,在下面的代码中,socketConnect()
立即返回,然后onConnect()
在连接完成时稍后调用。
local function onConnect(cookie, err, sock)
print("Connected!")
end
local function connect(host, port)
local success, err = socketConnect(host, port, onConnect)
print("Connecting...")
end
所以,这是问题。我想使connect()
功能块直到onConnect()
调用闭包。我在Lua刚很新,但是我希望协程在这里可能会有所帮助?
编辑:这是我尝试使用协程制作功能块的尝试:
local connected = false
local function onConnect(cookie, err, sock)
print("Connected!")
connected = true
end
local coroConnect = coroutine.create(
function()
local success, err = socketConnect(m_sHost, m_nPort, onConnect);
while not connected do
coroutine.yield()
end
end
)
local function connect(sHost, nPort)
m_sHost = sHost
m_nPort = nPort
while not coroutine.status(coroConnect) ~= "dead" do
coroutine.resume(coroConnect)
print("Connecting...")
end
end
如果您想使用协程,可以使用以下方法(或让您知道如何尝试):
-- this should really be a socket property, but good enough for this example
local connected
local function onConnect(cookie, err, sock)
print("Connected!")
connected = true
end
local function connect(host, port)
connected = false
local success, err = socketConnect(host, port, onConnect)
while not connected do
coroutine.yield()
end
print("Connecting...")
end
如果现在从connect
函数创建协程并继续调用该协程coroutine.resume
直到完成(coroutine.status
该协程将返回“死”),您将获得所需的结果。显然,您可以将该while
循环移入socketConnect
函数本身,这将使它从用户角度是同步的,因为onConnect
在执行之前它不会返回任何内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句