加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

套接字 – 如何在luasocket库中检查套接字是否已关闭?

发布时间:2020-12-14 21:49:52 所属栏目:大数据 来源:网络整理
导读:我正在使用Lua编程语言编写服务器,网络层基于 LuaSocket. 我在参考手册中找不到任何方法来检测套接字是否已关闭,只是尝试从中读取数据(在调用时它将返回nil和字符串’close’). 我的代码看起来像这样: local socket = require 'socket'local server = socke
我正在使用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

解决方法

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

我不知道任何其他方法.为什么不检查读取套接字的结果?

您需要使用settimeout使调用无阻塞,并检查为关闭(不关闭)返回的错误.您可以读取一个字节并存储它,或者您可以尝试读取零字节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读