3

ソケットの「選択」機能を使用して助けが必要です。

私のサーバーコードは次のようなものです:

while true do
    for _,server in pairs(servers) do
        local client = server:accept()

        client:settimeout(5)

        local line, err = client:receive()
        if not err then
            client:send(line .. "_SERVER_SIDE\n")
        else
            client:Send("___ERRORPC"..err)
        end

        client:close()
    end
end

しかし、今では、このような永久ループを作成する代わりに、select 関数を使用したいと考えています。

これを読む: http://w3.impa.br/~diego/software/luasocket/socket.html

私は以下のものと同様のものを使用できることを知っています:

socket.select(servers, nil, 5)

しかし、上記のコードでこれを使用する方法がわかりません。誰でも私を助けることができますか?

while true ステートメント内でこれを使用する必要がありますか?

読み取り操作 (最初のパラメーター) は、受け入れ/受信のみを行うことができることを意味します]? そして、秒パラメータは、送信しかできないことを意味しますか?

4

3 に答える 3

2

のドキュメントからselect:「accept の呼び出しの前にサーバー ソケットを使用して select を呼び出しても、accept がすぐに返されるとは限りません。settimeout メソッドを使用しないと、accept が永久にブロックされる可能性があります。」これはsettimeout、呼び出しの前に使用する必要があることを意味しますが、テーブルで操作acceptできる開いている接続のリストがあると仮定すると、次の方法で使用できます。serversselect

local canread = socket.select(servers, nil, 1)
for _,client in ipairs(canread) do
  local line, err = client:receive()
  if not err then
      client:send(line .. "_SERVER_SIDE\n")
  else
      client:send("___ERRORPC"..err)
  end
end

socket.select最大 1 秒間ブロックしますが、指定したリストに読み取り可能なソケットがある場合は、より早く戻ります。socket.select(servers, nil, 0);を使用すると、無期限にブロックできます。入力を待っている間に他の作業を行う必要がある場合は、短時間のブロックが役立ちます。

ipairsの代わりに使用するように更新さpairsれた戻り値テーブルは、数値とソケット自体の両方にキーが設定されているため、1 つのソケットから読み取ることができる場合、返される配列は のようになり{[1] = sock, [sock] = 1}ます。

于 2013-04-15T19:13:25.370 に答える