2013-04-17 11 views
5

Sto scrivendo un server utilizzando il linguaggio di programmazione Lua e il livello di rete è basato su LuaSocket.Come verificare che un socket sia chiuso o meno nella libreria luasocket?

E non riesco a trovare alcun metodo per rilevare che un socket è chiuso o non nel suo manuale di riferimento tranne che semplicemente prova a leggere i dati da esso (restituirà nil e stringa 'close' quando lo chiamerai).

Il mio codice è simile al seguente:

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

Chiama 'server: settimeout' all'interno del ciclo' while true'. – hjpotter92

risposta

1

se non cercano solo di leggere i dati da esso (tornerà nil e stringa 'vicino' quando si chiama così).

Non sono a conoscenza di nessun altro metodo. Perché il controllo del risultato della lettura di un socket non funziona?

È necessario utilizzare settimeout per rendere la chiamata non bloccante e controllare l'errore restituito per closed (non close). Puoi leggere un byte e memorizzarlo oppure puoi provare a leggere zero byte.

Problemi correlati