1

LuaSocketsを介してネットワーク(500KB)から大きなバイナリデータを取得するアプリがあります。(この部分はまだ実装していません)。私が知っていることに基づいて、このデータはある種の文字列、テーブル、または配列に格納されます。

このデータの処理を複雑にする必要があります。これには、既存の実績のあるANSI-C Libがあり、データをCに渡す必要があります。私が見たアプローチでは、通常、コールスタックでデータを渡しますが、これは機能しません。データサイズのせいで私にとっては。

既存のANSI-Clibは、データとサイズへのポインターを想定しています。このAPIを新しいAPIでラップすることもできます。この場合、データをバイト単位で除外し、最後に全体のサイズが確立されたら、実際のAPIを呼び出します。ただし、これは、LuaからC関数を大量に呼び出すことを意味し、パフォーマンスが必要なため、好ましくありません。 。

この大きなデータをCに渡す最良の方法は何ですか?(ファイルへの書き込みとファイル名の受け渡しを検討しましたが、これは好ましくありません。ダイレクトメモリパスが本当に必要です)

4

3 に答える 3

7

LuaSocket がデータを文字列として提供すると仮定すると、それは非常に単純です。

C アプリケーションには、Lua から直接文字列が渡されます。つまり、Lua スタック上にあります。lua_tolstring文字列とそのサイズを取得するために使用します。これにより、Lua が所有するメモリへのポインタが返されます (したがって、Lua がガベージ コレクションを実行するのを防ぐために、Lua スタックまたはレジストリまたは使用中のどこかに残っていることを確認する必要があります)。次に、その文字列とサイズを選択した API に渡します。

于 2012-10-21T15:36:38.777 に答える
2

私の意見では、Lua スタック サイズを気にする必要はありません。Lua スタックのすべての要素ではないにしても、ほとんどの要素に実際にヒープが割り当てられます。luasocket を使用している場合、受け取ったバイナリ データはすでに Lua 文字列 (socket:receive の戻り値だと思います) として利用できるので、余計な割り当てはしていません! Lua スタックは、実際にはある種の参照を渡す可能性が高いため、コピーは行われないか、非常に安価です。あなたの C lib をインターフェースするには、次のことができます。これを行うにはいくつかの方法がありますが、かなりスリムな C API のように見えるので、追加のバインディング ライブラリ (luabind など) なしで行います。

lua-cjson ソースhttp://www.kyne.com.au/~mark/software/lua-cjson-manual.htmlをご覧ください。これは C バインディングの良い例です。

于 2012-10-21T15:36:18.533 に答える
1

私があなたの場合であれば、luasocket をスキップして、C/C++ ソケット ライブラリを使用するだけです。

とにかく処理は C/C++ で行われるため、luasocket を使用するとソケット処理が (少し) 簡素化されますが、受信データと C/C++ バイナリ データ処理ライブラリとの間のインターフェイスが (大幅に) 複雑になります。

C/C++ ソケット ライブラリを使用すると、ソケットの処理が少し難しくなりますが (それほどではありません)、処理ライブラリへのデータ転送は簡単になります。

于 2012-10-23T10:31:11.713 に答える