亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 go 中處理來自網絡的原始字節

在 go 中處理來自網絡的原始字節

Go
元芳怎么了 2021-09-10 17:29:01
(對不起,長問題!)我最近一直在嘗試使用 Go 而不是 C++ 作為我作為副項目工作的游戲服務器模擬器,并質疑我是否正在以合理的 Go 術語實現它。正如您所料,服務器通過發送遵守特定協議規范的原始數據包 (TCP) 與一個或多個游戲客戶端進行通信。相關部分是這樣的:接收報頭 -> 解密 -> 接收字節,直到達到報頭長度 -> 解密數據包的其余部分 -> 分派給處理程序 -> 解碼數據包 -> 必要時處理 -> 發送響應該協議是根據字節以小端順序定義的,因此在我的 C++ 實現中,數據包標頭如下所示(我知道,它僅適用于 LE 機器):struct pkt_header {    uint16_t length;    uint16_t type;    uint32_t flags;};在recv() 'ing 并解密此標頭后,我將提取字段:// client->recv_buffer is of type u_char[1024]header = (pkt_header*) client->recv_buffer;if (client->recv_size < header->length) {    // Recv some more}// Decrypt and so on在處理程序本身中,我可以將上述頭結構嵌套在其他數據包結構定義中,并將它們轉換為byte[]緩沖區數組,以便直接訪問字段。從我讀到的內容來看,結構對齊(不出所料)在 Go 中是困難/不可能的,并且非常不鼓勵。不知道還能做什么,我寫了這個函數來從一個任意的 Struct -> []byte:// Serializes the fields of a struct to an array of bytes in the order in which the fields are// declared. Calls panic() if data is not a struct or pointer to struct.func StructToBytes(data interface{}) []byte {    val := reflect.ValueOf(data)    valKind := val.Kind()    if valKind == reflect.Ptr {        val = reflect.ValueOf(data).Elem()        valKind = val.Kind()    }作為 Go 新手,非常歡迎關于我如何更有效地實現這一點的反饋。到目前為止,它運行良好,但現在我面臨著如何做相反的挑戰:從 []byte->Struct (例如,[C8 00 03 00 00 01 00 00]到 Header { length = C8,大小 = 03,標志 = 0100 }我是否需要實現與此相反的方法,或者是否有更好的方法將字節數組轉換為任意結構(反之亦然,而不是我的函數)?請讓我知道是否有任何額外的澄清會有所幫助。
查看完整描述

1 回答

  • 1 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號