6

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
4

1 に答える 1

2

それからデータを読み取ろうとすることを除いて(それを呼び出すと、nilと文字列「close」が返されます)。

私は他の方法を知りません。ソケットを読み取った結果をチェックできないのはなぜですか?

settimeout を使用して呼び出しをノンブロッキングにし、closed(not close) に対して返されたエラーを確認する必要があります。1 バイトを読み取って保存することも、0 バイトの読み取りを試みることもできます。

于 2013-04-18T03:42:51.810 に答える