天天看點

c語言的tlv協定編解碼函數,基于C語言的TLV格式協定快速解析方法與流程

技術特征:

1.基于C語言的TLV格式協定快速解析方法,其特征在于,在客戶機上設有編譯器和解析器,在伺服器上也設有編譯器和解析器,進而使客戶機和伺服器都同時具備編碼能力和解碼能力;客戶機和伺服器通過網絡通道socket長連結子產品實作客戶機和伺服器之間的互相資料交換;在傳輸層對TCP/IP傳輸協定進行封裝,然後采用資料對象tlv格式的資料流來傳輸2G網絡的資料,進而實作客戶機和伺服器之間的快速資料交換;

在解析器内設有能把一段TLV格式的資料反序列化成一個struet類型的TLV資料解析接口;TLV資料解析接口把一段TLV格式的資料反序列化成一個struct類型的過程如下:

在解析TLV格式的資料時加入面向對象的概念,通過将一個結構體目标的指針作為“對象”傳入TLV資料解析接口,利用TLV資料解析接口的UnpackTlvBuff解析函數順序解析出所有的TLV資料段;在解析完每一段TLV資料時,利用回調函數回調出相應的TLV資料段的類型tag、長度length、值value以及“對象”,回調函數中再針對不同的“對象”作相應的資料指派,若該TAG對應的是一個基本資料類型參數則直接指派,若該tag對應的是一個結構體對象則再次利用UnpackTlvBuff解析函數解析出結構體對象内部的TLV資料的值value,同時傳入新的“對象”以區分目标,重複以上步驟直至解析完成;這樣一個解析回調函數就能完成整個多層嵌套的結構體“對象”的解析過程,進而實作多層嵌套的複雜的TLV格式協定的資料快速解析。

2.根據權利要求1所述的一種基于C語言的TLV格式協定快速解析方法,特征在于,(2.1)在客戶機或伺服器的發射端,對傳輸的資料對象進行編碼,将編碼後資料對象對應的資料類型轉換成資料流;

(2.2)在客戶機或伺服器的接收端,将接受的資料對象對應的資料流轉化為資料類型,對資料類型進行解碼得到對應的資料對象;

(2.3)TLV格式是一種可變格式,其中,T是類型tag的縮寫,L是長度length的縮寫,V是值value的縮寫,一個基本的資料元包括TLV這三個域,tag唯一辨別該資料元,tag的長度為4個位元組,length的長度為2個位元組,value域的長度由length來指定,value就是資料本身;

(2.3.1)TLV格式資料對象的編碼方法如下:

a1)将類型tag用htonl轉換為網絡位元組順序,指針偏移+4;

a2)将長度length用htonl轉換為網絡位元組順序,指針偏移+4;

a3)若值value資料類型為int、char、short,則将其轉換為網絡位元組順序,指針偏移+4;

a4)若值value資料類型為字元串類型,寫進後,指針偏移+length+R,其中R為修正參數,R取自然數;

當值value資料類型隻有一個字元串類型時,則在寫進這個字元串類型後,修正參數R取0;

當值value資料類型連續出現2n(n為正整數)個字元串類型時,則在寫進第N個字元串類型後,修正參數R取2;

當值value資料類型連續出現2n+1(n為正整數)個字元串類型時,則在寫進第N個字元串類型後,修正參數R取3;

a5)接着再繼續處理後面的tlv;

(2.3.2)TLV格式資料對象的解碼方法如下:

b1)讀取tag用ntohl轉換為主機位元組序得到類型,指針偏移+4

b2)讀取lengh用ntohl轉換為主機位元組序得到長度;指針偏移+4

b3)根據得到的長度讀取value,若value資料類型為int、char、short,用ntohl轉換為主機位元組序,指針偏移+4;

b4)若值value資料類型為字元串類型,寫進後,指針偏移+length+R,其中R為修正參數,R取自然數;

當值value資料類型隻有一個字元串類型時,則在寫進這個字元串類型後,修正參數R取0;

當值value資料類型連續出現2n(n為正整數)個字元串類型時,則在寫進第N個字元串類型後,修正參數R取2;

當值value資料類型連續出現2n+1(n為正整數)個字元串類型時,則在寫進第N個字元串類型後,修正參數R取3;

b5)接着再繼續處理後面的tlv。

3.根據權利要求1所述的一種基于C語言的TLV格式協定快速解析方法,特征在于,網絡通道socket長連結子產品的建立和連接配接;

(3.1)客戶機端使用網絡通道socket長連結子產品與伺服器建立網絡連接配接;

(3.2)當資料發送完成後網絡通道socket長連結子產品的連結不斷開,一直保留到異常或者是程式退出為止才斷開;

(3.3)伺服器端建立socket長連結的一般步驟是:

structsockaddr_inaddr;定義一個ip位址;

(3.3.1)、建立一個socket,用函數socket();

(3.3.2)、設定socket屬性,用函數setsockopt();

(3.3.3)、綁定IP位址、端口等資訊到socket上,用函數bind();

(3.3.4)、開啟監聽,用函數listen();

(3.3.5)、接收用戶端上來的連接配接,用函數accept();

(3.3.6)、收發資料,用函數send()和recv(),或者read()和write();

(3.3.7)、關閉網絡連接配接;

(3.3.8)、關閉監聽;

(3.4)、用戶端建立socket長連結一般步驟是:

(3.4.1)、建立一個socket,用函數socket();

(3.4.2)、設定socket屬性,用函數setsockopt();

(3.4.3)、綁定TP位址、端口等資訊到socket上,用函數bind();

(3.4.4)、設定要連接配接的對方的IP位址和端口等屬性;

(3.4.5)、連接配接伺服器,用函數connect();

(3.4.6)、收發資料,用函數send()和recv(),或者read()和write();

(3.4.7)、關閉網絡連接配接。