Lua Socket无法通过Ctrl+C正确停止。

我有一个独立的lua脚本,使用lua sockets通过TCP IP连接到服务器。它使用receive调用从该服务器接收数据。它能工作,但是当我尝试用Ctrl+C停止它时,会发生以下两种情况之一:

-如果当前没有数据传输,而receive在等待,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
点赞
用户1358661
用户1358661

这将是一个相当大的改变,但你可以使用lua-ev。它允许添加 Signal 处理程序,这正是需要对 ctrl-c 作出反应所需的。

local socket = require'socket'
-- 将 connect 和 send 设置为阻塞模式
local client = socket.connect(ip,port)
client:send('TEST TEST')

-- 将 client 设置为非阻塞模式
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 信号')
end,SIGINT):start(ev.Loop.default)

ev.Loop.default:loop()
2013-11-05 22:40:38