の
local rset = {socket}
... later
...select(rset, nil, 0)
:それはオプションではありません場合は、あなたの代わりに一時的なものの静的なテーブルを読んで渡す必要はありませんこれらのリストのためのselect()
代わりの{}
にnil
を渡す考えますこの問題を処理するさまざまな方法です。どちらを選択するかは、どれくらいの仕事をしたいかによって決まります。 *
しかし、最初に、あなたがUDPかTCPを扱っているかどうかを明らかにしてください。 UDPソケットのための「基礎となるTCPスタック」はありません。また、UDPは、テキストや写真などの全データを送信するために使用する間違ったプロトコルです。それは信頼性の低いプロトコルなので、マネージソケットライブラリ(ENetなど)を使用している場合を除き、すべてのパケットを受信する保証はありません。
Lua51/LuaJIT + LuaSocket
ポーリングは唯一の方法です。
- ブロッキング:時間引数なしで
socket.select
を呼び出して、ソケットが読み込めるのを待ちます。
- ノンブロッキング:
0
というタイムアウト引数を使用してsocket.select
と呼び出し、読み込み中のソケットでsock:settimeout(0)
を使用してください。
これらを繰り返し呼び出します。 プログラムの他の部分が遅すぎることなく実行を続けることができるように、ノンブロッキング版にcoroutine schedulerを使用することをお勧めします。
Lua51/LuaJIT + LuaSocket + Lua Lanes上記方法として
同じ(推奨)が、ソケットが別のレーン(別のスレッドで軽量のLUA状態)に存在するLua Lanes(latest source)を用いました。これにより、ソケットからバッファにデータを即座に読み取ることができます。次に、lindaを使用して、処理のためにメインスレッドにデータを送信します。
これは、おそらくあなたの問題に対する最良の解決策です。
私はこの簡単な例を作成しました。利用可能なのはhereです。これはLuaのレーン3.4.0(GitHub repo)とパッチの当たっLuaSocket 2.0.2(source、patch、blog post re' patch)
あなたはそこから派生する場合は、間違いなく私のサンプルコードをリファクタリングすべきものの結果は、有望であるに依存しています。
LuaJIT + OS固有のソケット
あなたは少し自虐している場合は、最初からソケットライブラリを実装してみてください。 LuaJITのFFI libraryは、これを純粋なLuaから可能にします。ルアレーンもこれに役立ちます。
Windowsの場合は、William Adam's blogをご覧ください。彼はLuaJITとWindows開発で非常に興味深い冒険をしています。 Linuxとそれ以外の場合は、CのチュートリアルやLuaSocketのソースを見て、それらをLuaJIT FFI操作に変換してください。
(APIがそれを必要とする場合LuaJITはcallbacksをサポートしていますが、signficantパフォーマンスコストのLUAからCへのポーリングに比べてあります)
LuaJIT + ENET
ENetは素晴らしいライブラリです。これは、TCPとUDPの完璧な組み合わせを提供します。必要に応じて信頼性があり、そうでなければ信頼性がありません。また、LuaSocketのように、オペレーティングシステム固有の詳細を抽象化します。 Lua APIを使用してバインドするか、LuaJITのFFIを介して直接アクセスすることができます(推奨)。
*プンは意図的ではありません。
私はLuaが実際にコールバックを使用するシステムイベントを持つシングルスレッドシステムであることを認識しています。私はちょうどそれを見続ける代わりに利用可能なデータがあるときにコールバックを得ることを望んでいた。 – user4749
コールバックを受け取るためにコールバックを行っていた人には、コントロールを転送する必要があります。だからあなたがそれをしたときはいつでも、データがそこにあるかどうかを調べるだけです。 –
私は大きく反対します。 lua-evや別のイベントを使っても、ポーリングは行われません!Lua +の使用「Some Event Loop」は、非常に優れたパフォーマンスとメモリ占有量の少ない重要な作業のために、組み込み機器(node.jsが大きい)で生産性高く使用されています。状況によっては、これは完璧なマッチです。非常に低レベル(https://github.com/justincormack/ljsyscall)のOSで作業するのがとても簡単なモジュールがあります。 – lipp