2013-10-02 26 views
3

我有一个独立的lua脚本,它使用lua套接字通过TCP IP连接到服务器。它使用接收呼叫从该服务器接收数据。但是,当我尝试使用Ctrl + C停止它时,会发生以下两种情况之一:Lua套接字无法通过Ctrl + C正确停止

- 如果当前没有流量并且接收正在等待,则Ctrl + C将不起作用。该计划将继续运行,并将不得不被终止。

- 如果有流量,该项目将与下面的打印输出,并与插座仍处于打开状态,并与服务器不接受另一个连接退出:

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

您正在使用哪种操作系统? –

+0

我认为这可以通过设置客户端超时为0,并定期检查新的数据到达套接字来避免。在睡眠期间,应该可以使用ctrl-c。 – jpjacobs

+0

洛伦佐,使用Linux – elanamig

回答

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() 
相关问题