【问题标题】:How to check a socket is closed or not in luasocket library?如何检查 luasocket 库中的套接字是否关闭?
【发布时间】:2013-04-18 11:42:51
【问题描述】:

我正在使用Lua编程语言编写一个服务器,网络层基于LuaSocket

而且我在其参考手册中找不到任何方法来检测套接字是否关闭,除非尝试从中读取数据(调用时它将返回 nil 和字符串'close')。

我的代码如下所示:

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

【问题讨论】:

  • while true 循环内调用server:settimeout

标签: sockets tcp lua luasocket


【解决方案1】:

除了尝试从中读取数据(调用时它将返回 nil 和字符串 'close')。

我不知道任何其他方法。为什么检查读取套接字的结果对您不起作用?

您需要使用 settimeout 使调用非阻塞并检查返回的错误 closed(不是 close)。您可以读取一个字节并存储它,也可以尝试读取零字节。

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2010-11-26
    相关资源
    最近更新 更多