【问题标题】:Lua Socket cannot be properly stopped by Ctrl+CLua Socket 不能被 Ctrl+C 正确停止
【发布时间】:2014-01-14 01:37:57
【问题描述】:

我有一个独立的 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 并定期检查是否有新数据到达套接字来避免这种情况。睡觉的时候,应该可以用ctrl-c。
  • @jpjacobs 没有帮助,但感谢您的想法:(

标签: sockets exception lua luasocket


【解决方案1】:

这将是一个很大的变化,但您可以使用lua-ev。它允许添加信号处理程序,这正是对 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()

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2020-02-29
    • 2020-07-08
    相关资源
    最近更新 更多