首页 > 解决方案 > 从 TCP 读取数据包长度时获取垃圾值

问题描述

问题

我正在使用 tcp 发送数据包,前 8 个字节包含接收它时的实际数据包长度,在某些时候它得到错误的数据包长度,导致以下错误“切片超出范围”,因为接收到的数据包长度是方式更大,但使用 TCP Dump 我可以看到它正在接收正确的数据包大小。

客户端 TCP 代码

package main

import (
        "fmt"
        "net"
        "ByteBuffer"
        "log"
        "sync"
)

func main() {

        conn, err := net.Dial("tcp", "192.168.90.116:8300")

        if err != nil {
                fmt.Println(err)
                return
        }
        
        byteBuffer := ByteBuffer.Buffer{
                Endian:"big",
        }

        msg := "Hello World"

        totalByteLen := len(msg)  

        byteBuffer.PutLong(totalByteLen)

        byteBuffer.Put([]byte(msg))

        log.Println(byteBuffer.Array())

        for i:=0;i<1000000000000;i++{

              go write(conn, byteBuffer.Array()) 
        }
}

var lck = &sync.Mutex{}

func write(conn net.Conn, data []byte){

    lck.Lock()
    _, err := conn.Write(data)
    lck.Unlock()

    if err != nil{

        return
    }
}

服务器 TCP 代码

func HandleRequest(conn net.Conn){

    defer conn.Close()

    for {

        // creating a 8 byte buffer array

        sizeBuf := make([]byte, 8)

        // reading from tcp sockets

        _, err := conn.Read(sizeBuf)

        // converting the packet size to int64

        packetSize := int64(binary.BigEndian.Uint64(sizeBuf))

        log.Println(packetSize)

        if packetSize < 0 {

            continue
        }

        // reading more bytes from tcp pipe of packetSize length

        /*

            Here it catches error as the packet size is incorrect but it throws error after receiving aroung 4-5K messages.
        */

        completePacket := make([]byte, packetSize)

        _, err = conn.Read(completePacket)

        // checking error type

        if err == io.EOF{

            break

        }

        if err != nil{

            break

        }

        fmt.Println(completePacket)

    }
}

标签: gotcpbyte

解决方案


推荐阅读