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

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

Go:高效處理通過 TCP 接收的碎片數據

Go:高效處理通過 TCP 接收的碎片數據

Go
收到一只叮咚 2021-07-29 13:01:30
我正在編寫一個小型 tcp 服務器,它只假設讀取數據、解析接收數據(動態長度幀)并處理這些幀??紤]以下代碼:func ClientHandler(conn net.Conn) {    buf := make([]byte, 4096)    n, err := conn.Read(buf)    if err != nil {        fmt.Println("Error reading:", err.Error())        return    }    fmt.Println("received ", n, " bytes of data =", string(buf))    handleData(buf)這幾乎是我代碼的本質。我將 X 個字節讀入一個空緩沖區,然后處理數據。問題發生在:一幀數據大于它試圖從 tcp 連接讀入的緩沖區。在這種情況下,在接收到其余數據之前,我無法處理數據(但是接收緩沖區已被先前的數據占用)。當緩沖區包含一個半幀的數據并且我需要處理第一幀時,同時保留不完整的幀以備后用...在這種情況下,我需要從緩沖區中刪除已處理的部分,然后移動不完整的部分框架的其余部分有空間。這兩種情況都可能需要重新分配和復制數據,這可能是一項代價高昂的操作?此外,除了擴展緩沖區之外,我對如何處理大于緩沖區的幀沒有任何想法……但是不斷增加的緩沖區可能會導致性能問題和拒絕服務。最后,但并非最不重要的是,我不知道 Golang 的標準庫是否足夠好,無法知道是否有任何明確構建的包來處理這些情況。所以我的問題是:是否有處理這些情況的最佳實踐?是否有任何 golang 包可以為我完成部分或大部分工作?謝謝你。
查看完整描述

1 回答

?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

字節切片應該支持非常優化的調整大小(即保留比需要更多的字節,如果可以的話不要復制,呈指數增長,復制代碼不是用 go 編寫的,而是運行時的一部分,等等)。

所以你可以使用append并查看它是如何工作的。

另一種更慣用的方法是使用bufio.Reader包裝連接,它會自動處理所有這些。我已經在我編寫的 tcp 服務器中使用了它,而且速度非???。你只需要:

r := bufio.NewReader(conn)

然后您可以讀取直到分隔符或給定數量的字節(如果您事先知道的話)。


查看完整回答
反對 回復 2021-08-02
  • 1 回答
  • 0 關注
  • 273 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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