2013-10-02 1 views
3

루아 소켓을 사용하여 TCP IP를 통해 서버에 연결하는 독립형 lua 스크립트가 있습니다. 이 서버는 수신 호출을 사용하여 해당 서버의 데이터를 수신합니다. 그러나 Ctrl + C로 중지하려고하면 두 시나리오 중 하나가 발생합니다.루아 소켓은 Ctrl + C로 올바르게 멈출 수 없습니다.

- 현재 트래픽이없고 수신 대기 중이면 Ctrl + C는 적용되지 않습니다. 이 프로그램은 계속 실행되며 kill에 의해 종료되어야합니다.

트래픽이 - 만약, 프로그램은 아래의 출력과 오픈 여전히 소켓 서버가 다른 연결 수락하지으로 종료됩니다 : 나는 두 번째 시나리오를 해결하기 위해 PCALL을 사용하여 시도

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이 리턴하지 않으면, 프로세스는 여전히 오류를 발생시킵니다. 내 프로그램의

샘플은 다음과 같습니다 :

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

Lorenzo, Linux 사용 – elanamig

답변

2

이 상당히 변화 될 것입니다,하지만 당신은 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() 
관련 문제