NetMsg為TDEngine傳輸數據的數據結構
數據組成
包頭
數據的前12位為包頭
前4位為數據包的長度,供數據讀取的時候獲取讀取的長度
接下來2位為seq_fd,客戶端與網關服通訊時會保證包序是正常的,即下一個包的seq是符合標准的,防止作弊重復發送包,在網關服與邏輯服通訊時seq_fd表示網關服接受客戶端的fd值。邏輯服根據seq_fd值來獲取用數據包的來源用戶。
其它字段為預留字段,后續可能有加密字段
包數據
包數據的第一個元素存儲的是一個str的值,也就是數據包的名稱,可根據數據包的名稱獲取有幾個參數,參數的類型為何種類型,用以數據驗證。
接下來為若干個數據值,數據為小端結構
數據值解析
讀取字段
首先讀取字段頭,字段頭為兩個16進制的值,第一個16進制為index,第二個16進制對應類型的pattern
若為map類型的數據,第一個index用來解析對應的key的字符串值,對於其它類型index固定為0,不作解析
第二個pattern類型則表示下一個值的數據類型,程序會根據pattern值進行下一步值的解析
類型解析
若類型為u8,i8,則會讀取后面1個字節做為值
若類型為u16,i16,則會讀取后面2個字節做為值
若類型為u32,i32,則會讀取后面4個字節做為值
若類型為float,則會讀取后面4個字節做為i32值,然后把這個值除以1000得出float的值,float沒有用內存直接做轉換,只保留了3位的精度,若精度要求高的請勿使用此類型,可在打包的時候轉成字符串,解析的時候做相應的解析
若類型為str,raw,則后面2個字節為字符串的長度,再根據長度讀取相應的字節做為字符串的值
若類型為map
- 遍歷字段頭,若頭為nil類型,則表示讀完map,退出循環,跳到5
- 根據字段頭,讀取相應的類型
- 根據字段頭的index,從配置中讀取相應的key,若配置中不存在key,則繼續執行1
- 把key和相應的值存到HashMap,繼續執行1
- 數據成功讀取
若類型為數組類型
- 得出對應的子類型,如u8[]對應的子類型為u8
- 遍歷讀取字段的值,若讀取到的類型為None,退出循環,跳到4
- 把讀取到的值存在Vector,繼續執行1
- 數據成功讀取
至此,數據解析完成