(對(duì)不起,長(zhǎng)問(wèn)題?。┪易罱恢痹趪L試使用 Go 而不是 C++ 作為我作為副項(xiàng)目工作的游戲服務(wù)器模擬器,并質(zhì)疑我是否正在以合理的 Go 術(shù)語(yǔ)實(shí)現(xiàn)它。正如您所料,服務(wù)器通過(guò)發(fā)送遵守特定協(xié)議規(guī)范的原始數(shù)據(jù)包 (TCP) 與一個(gè)或多個(gè)游戲客戶端進(jìn)行通信。相關(guān)部分是這樣的:接收?qǐng)?bào)頭 -> 解密 -> 接收字節(jié),直到達(dá)到報(bào)頭長(zhǎng)度 -> 解密數(shù)據(jù)包的其余部分 -> 分派給處理程序 -> 解碼數(shù)據(jù)包 -> 必要時(shí)處理 -> 發(fā)送響應(yīng)該協(xié)議是根據(jù)字節(jié)以小端順序定義的,因此在我的 C++ 實(shí)現(xiàn)中,數(shù)據(jù)包標(biāo)頭如下所示(我知道,它僅適用于 LE 機(jī)器):struct pkt_header { uint16_t length; uint16_t type; uint32_t flags;};在recv() 'ing 并解密此標(biāo)頭后,我將提取字段:// 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在處理程序本身中,我可以將上述頭結(jié)構(gòu)嵌套在其他數(shù)據(jù)包結(jié)構(gòu)定義中,并將它們轉(zhuǎn)換為byte[]緩沖區(qū)數(shù)組,以便直接訪問(wèn)字段。從我讀到的內(nèi)容來(lái)看,結(jié)構(gòu)對(duì)齊(不出所料)在 Go 中是困難/不可能的,并且非常不鼓勵(lì)。不知道還能做什么,我寫(xiě)了這個(gè)函數(shù)來(lái)從一個(gè)任意的 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 新手,非常歡迎關(guān)于我如何更有效地實(shí)現(xiàn)這一點(diǎn)的反饋。到目前為止,它運(yùn)行良好,但現(xiàn)在我面臨著如何做相反的挑戰(zhàn):從 []byte->Struct (例如,[C8 00 03 00 00 01 00 00]到 Header { length = C8,大小 = 03,標(biāo)志 = 0100 }我是否需要實(shí)現(xiàn)與此相反的方法,或者是否有更好的方法將字節(jié)數(shù)組轉(zhuǎn)換為任意結(jié)構(gòu)(反之亦然,而不是我的函數(shù))?請(qǐng)讓我知道是否有任何額外的澄清會(huì)有所幫助。
- 1 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報(bào)
0/150
提交
取消