How to check a socket is closed or not in luasocket library?

风格不统一 提交于 2020-01-13 09:47:48

问题


I am writing a server using Lua programming language, and the network layer is based on LuaSocket.

And I cannot find any method to detect a socket is closed or not in its reference manual except by just try to read data from it(it will return nil and string 'close' when calling that).

My code looks like this:

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

回答1:


except by just try to read data from it (it will return nil and string 'close' when calling that).

I'm not aware of any other method. Why doesn't checking the result from reading a socket work for you?

You need to use settimeout to make the call non-blocking and check the error returned for closed (not close). You can read one byte and store it or you can try reading zero bytes.



来源:https://stackoverflow.com/questions/16054394/how-to-check-a-socket-is-closed-or-not-in-luasocket-library

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!