2013-04-17 2 views
5

Ich schreibe einen Server mit Lua-Programmiersprache, und die Netzwerkebene basiert auf LuaSocket.Wie zu prüfen, ob ein Socket in der luasocket-Bibliothek geschlossen ist oder nicht?

Und ich kann keine Methode finden zu erkennen, dass ein Socket geschlossen ist oder nicht in seinem Referenzhandbuch außer durch nur versuchen, Daten von ihm zu lesen (es wird NULL zurückgeben und Zeichenfolge 'schließen', wenn sie aufrufen).

Mein Code sieht wie folgt aus:

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

Rufen Sie 'server: settimeout' in der 'while true'-Schleife auf. – hjpotter92

Antwort

1

außer von nur versuchen, Daten von ihm zu lesen (es null und String zurück ‚schließen‘ wenn Sie anrufen, dass).

Mir ist keine andere Methode bekannt. Warum funktioniert das Überprüfen des Ergebnisses beim Lesen einer Steckdose nicht für Sie?

Sie müssen settimeout verwenden, um den Aufruf nicht blockierend zu machen und den Fehler zu überprüfen, der für closed (nicht close) zurückgegeben wird. Sie können ein Byte lesen und speichern oder Sie können versuchen, null Bytes zu lesen.