私は、ソケットを使用して外の世界と通信する小さな Lua アプリ (Lua for Windows の下で、それが重要な場合) に取り組んでいます。(ルアソケット)
そして、いくつかのリクエストを並行して行おうとしています。だから私はLuaLanesが行くべき道だと思った. (もちろん、より良い解決策があれば代替案を受け入れますが、このためにコルーチンを処理したくないでしょう。)
このようなもの:
server = assert (socket.bind ('*', 1234))
client = server : accept ()
-- set id to some unique value
allClients [id] = client
theLane = lanes.gen ("", laneTest) ( id )
print (theLane [1])
関数laneTest
は次のように定義されます。
function laneTest (id)
local client = allClients [id]
print ('peer: ', client:getpeername())
end
私の問題は、laneTest
関数内でレーンとして実行すると、次のような素敵なエラー メッセージが表示されることです。
ローカルの「クライアント」(ユーザーデータ値) のインデックス作成を試みます
(ラインよりclient:getpeername()
)
だから..ここで何が起こっているのかわかりませんか? レーンはソケットと互換性がありませんか、それとも何か非常に間違っていますか?
Lua for Windows に同梱されているレーンのバージョンは古いもの ( luaforwindows ) であり、ソケットでは動作しない可能性があると思いますが、最新バージョンは可能でしょうか? (レーン 2.0.4 vs 最近の 3.xx)
持っている Lanes のバージョンを更新する方法がよくわかりません。それが私が向かっている可能性のある場所であるか、または私が間違ったことをしたことがより明らかな何かがある場合は、アドバイスをいただければ幸いです。
編集:先に進み、luarocksを介してレーンをインストールしましたが、ロックとしてインストールされたレーン3.1.6-1を使用して同じ問題を抱えています。
編集2 :これを試しました(それでも失敗しました):
require ('socket')
require ('lanes')
local allClients = {}
function theLane (id)
print ('the id:', id) -- correctly prints out the id passed to the function
local SOCKET = require ('socket')
local client = allClients [id]
print ('peer:', client:getpeername())
client : close ()
end
local server = assert (SOCKET.bind ('*', 1234))
local ip, port = server:getsockname ()
local laneFunc = lanes.gen('', theLane)
local client = server:accept ()
allClients [1] = client
local x = laneFunc (1)
print (x[1])
- これは主張に失敗します:
attempt to call global 'require' (a nil value)
- 関数内の行を削除して
require ('socket')
再試行しても、次のように言って失敗します。attempt to index local 'client' (a userdata value)
明らかなことを見逃してしまったことを前もってお詫びしますが... どうすればソケットをレーンで動作させることができますか?
編集3:
さて、私は将来の参考のためにこれを編集しています:)
私が知る限り、luasocket にパッチを当てずにレーンをソケットで使用する方法はありません。詳細については、こちらのディスカッションを参照してください。要するに(Decoの回答で説明されているように):レーンはユーザーデータでは機能しません。luasocket は、ソケット/ソケット情報にアクセスする他の方法を提供しません。
私は luasocket にパッチを当てたいとは思っていません。
皆さんありがとう!