从TCP读取数据包长度时获取垃圾值

时间:2020-08-06 10:57:06

标签: go tcp byte

问题

我正在使用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)

    }
}

0 个答案:

没有答案