2013-04-17 10 views
5

Piszę serwer za pomocą języka programowania Lua, a warstwa sieci jest oparta na LuaSocket.Jak sprawdzić, czy gniazdo jest zamknięte, czy nie w bibliotece luasocket?

Nie mogę znaleźć żadnej metody wykrycia, czy gniazdo jest zamknięte lub nie w podręczniku, z wyjątkiem próby odczytania z niego danych (zwróci zero i ciąg znaków "zamknij" podczas wywoływania tego).

Mój kod wygląda następująco:

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

Wywołanie 'server: settimeout' wewnątrz pętli' while while'. – hjpotter92

Odpowiedz

1

wyjątkiem prostu spróbować odczytać z niego dane (zwróci nil i napis „close” podczas wywoływania tego).

Nie jestem świadomy żadnej innej metody. Dlaczego nie sprawdza się sprawdzenie wyniku odczytu gniazda?

Musisz użyć funkcji rozliczania, aby wywołanie nie było blokowane i sprawdź błąd zwrócony dla closed (nie close). Możesz przeczytać jeden bajt i zapisać go lub możesz spróbować odczytać zero bajtów.

Powiązane problemy