lua拡張ライブラリlpackの使用ガイドラインについて


  • 最近luasocketを研究し、luaを使用したすべての拡張ライブラリで軽量レベルのフレームワークを実現し、いくつかのツール、簡単なゲームサーバ、およびcocos 2 dxでネットワークライブラリとして使用する準備をしています.
  • 完備したネットワークライブラリは必然的に粘着パケット、半パケットの問題に直面し、luasocketも例外ではない.ネットワーク部分はluaにあるため、プロトコルの制定とbuffの解析には適切な方案がなく、C++でインタフェースをカプセル化したくない.後にネット上でいくつかの資料を調べ、luaにもバイナリパッケージの拡張ライブラリ--lpackがある.それを用いてbuff解析を行い,粘着バッグ,半バッグの問題を解決することにした.
  • まずlpackのソースコードをダウンロードする必要があります.アドレスはlpackのダウンロードアドレスで、それから解凍して、中にlpackがあります.cとmakefileファイル.
  • は次にlpackをコンパイルし、lpack 1をコンパイルして初期化し、lpackをコンパイルする2つの方法がある.cホストプログラムのソースコードに追加し、luaを初期化する場所で初期化関数:
    luaopen_pack(lua_state);
    を呼び出し、lpackをdll(so)にコンパイルし、luaで:
    require("lpack")
  • を呼び出す.
  • その後、lpackのインタフェースについて説明すると、lpack拡張ライブラリは2つのインタフェース、pack、unpackを提供しています.しかし、マクロ(USE_GLOBALS)を使用して制御する2つの呼び出し方法があり、1つ目はグローバルインタフェース(pack/unpack)を使用し、もう1つはstringの空間に2つのインタフェースを挿入する(string.pack/string.unpack).
  • lpackの具体的な使い方1、パッケージインタフェースpackの使用、グローバル名前はlua自身の関数unpackを混同しやすくstringを使用する.packはよくて、ソースコードを修正して関数名を修正することもできます.
    --luapack         
    local _ss = luapack(">P", "  asd")
    
    local _ss2 = luapack(">h", 500)
    _ss = _ss.._ss2
    print(_ss, #_ss)
    
    --    
      asd        9
      asd       11
    、パケット解除インタフェースunpackの使用
    --luaunpack         
    --    1
    local ne, value = luaunpack(_ss, ">P")
    print(ne, value)
    
    _ss = string.sub(_ss, ne, #_ss)
    local ne, value = luaunpack(_ss, ">h")
    print(ne, value)
    
    --    
    10        asd
    3       500
    
    --    2
    local ne, value1, value2 = luaunpack(_ss, ">Ph")
    print(ne, value, value2)
    
    --    
    12        asd 500
  • パッケージ変数タイプ定義
        #define OP_ZSTRING  'z'     //    
        #define OP_BSTRING  'p'     //    2^8    
        #define OP_WSTRING  'P'     //    2^16    
        #define OP_SSTRING  'a'     //    2^32/64    */
        #define OP_STRING   'A'     //       
        #define OP_FLOAT    'f'     /* float */
        #define OP_DOUBLE   'd'     /* double */
        #define OP_NUMBER   'n'     /* Lua number */
        #define OP_CHAR     'c'     /* char */
        #define OP_BYTE     'b'     /* byte = unsigned char */
        #define OP_SHORT    'h'     /* short */
        #define OP_USHORT   'H'     /* unsigned short */
        #define OP_INT      'i'     /* int */
        #define OP_UINT     'I'     /* unsigned int */
        #define OP_LONG     'l'     /* long */
        #define OP_ULONG    'L'     /* unsigned long */
  • パッケージバイト順は、以下の3種類の
  • に分けられる.
        #define OP_LITTLEENDIAN '     /* little endian */
        #define OP_BIGENDIAN    '>'     /* big endian */
        #define OP_NATIVE       '='     /* native endian */
  • よし、ここまでlpackをどのように使用するかはよく知られており、次にlpackの特性設計buffを利用してネットワークバイトストリームを解析することができる.再度ツッコミを入れて、このエディタはインデントを交換していないで使いにくいですね!!