2013-04-17 18 views
5

我正在使用Lua編程語言編寫服務器,並且網絡層基於LuaSocket如何檢查套接字是否關閉或不在luasocket庫中?

而且我找不到任何方法來檢測插座在其參考手冊除非只是試圖從中讀取數據(它會返回零和字符串「關閉」調用時)關閉與否。

我的代碼如下所示:

local socket = require 'socket' 
local server = socket.tcp() 
local port = 9527 

server:bind('*', port) 
local status, errorMessage = server:listen() 
if status == 1 then 
    printf('Server is launched successfully on port %u', port) 
else 
    printf('Server listen failed, error message is %s', errorMessage) 
    return 
end 

local sockets = {server} 

while true do 
    local results = socket.select(sockets) 
    for _, sock in ipairs(results) do 
     if sock == server then 
      local s = server:accept() 

      callback('Connected', s) 
      table.insert(sockets, s) 

      printf('%s connected', s:getsockname()) 
     else 
      -- trying to detect socket is closed 
      if sock:isClosed() then 
       callback('Disconnected', sock) 

       for i, s in ipairs(sockets) do 
        if s == sock then 
         table.remove(sockets, i) 
         break 
        end 
       end 

       printf('%s disconnected', sock:getsockname()) 
      else 
       callback('ReadyRead', sock) 
      end 
     end 
    end 
end 
+0

在'while while true'循環內調用'server:settimeout'。 – hjpotter92

回答

1

除非只是試圖從中讀取數據(它會返回零和字符串「關閉」調用時)。

我不知道任何其他方法。爲什麼不檢查讀取套接字的結果爲你工作?

您需要使用settimeout使呼叫非阻塞並檢查返回的錯誤closed(而不是close)。您可以讀取一個字節並存儲它,或者您可以嘗試讀取零字節。

相關問題