我有一个独立的lua脚本,它使用lua套接字通过TCP IP连接到服务器。它使用接收调用从该服务器接收数据。但是,当我尝试使用Ctrl + C停止它时,它会发生以下两种情况之一:
- 如果当前没有流量且接收正在等待,则Ctrl + C将无效。该程序将继续运行,并且必须由kill终止。
- 如果有流量,程序将以下面的打印输出退出,并且套接字仍然打开,并且服务器不接受另一个连接:
lua: luaSocketTest.lua:15: interrupted!
stack traceback:
[C]: in function 'receive'
luaSocketTest.lua:15: in function 'doWork'
luaSocketTest.lua:22: in main chunk
[C]: ?
我尝试使用pcall来解决第二种情况,但没有成功。 pcall没有返回,该过程仍然会抛出错误。
我的计划样本如下:
local socket = require ("socket")
local ip = "localhost"
local port = 5003
function doWork ()
print ("Starting socket: "..ip..":"..port)
client = assert(socket.connect(ip, port))
print ("Socket Accepted")
client:send("TEST TEST")
while 1 do
local byte, err = client:receive (1)
if not err then
print (byte)
end
end
end
while 1 do
local status = pcall(doWork())
print ("EXITED PCALL WITH STATUS: "..tostring(status))
if not status then client:close() end
end
答案 0 :(得分:2)
这将是一个很大的改变,但你可以使用lua-ev。它允许添加Signal处理程序,这正是对ctrl-c做出反应所需的。
local socket = require'socket'
-- make connect and send in blocking mode
local client = socket.connect(ip,port)
client:send('TEST TEST')
-- make client non-blocking
client:settimeout(0)
ev.IO.new(function()
repeat
local data,err,part = client:receive(10000)
print('received',data or part)
until err
end,client:getfd(),ev.READ):start(ev.Loop.default)
local ev = require'ev'
local SIGINT = 2
ev.Signal.new(function()
print('SIGINT received')
end,SIGINT):start(ev.Loop.default)
ev.Loop.default:loop()