2013-04-17 7 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

Вызов 'server: settimeout' внутри цикла while while. – hjpotter92

ответ

1

кроме просто пытаются считывать данные из него (он возвращает ноль и строку «закрыть» при вызове этого).

Я не знаю ни одного другого метода. Почему не проверяет результат от чтения сокета для вас?

Вам необходимо использовать setimeout для того, чтобы сделать вызов неблокирующим и проверить ошибку, возвращенную для closed (не close). Вы можете прочитать один байт и сохранить его, или вы можете попробовать прочитать нулевые байты.

Смежные вопросы