Получение значения мусора при чтении длины пакета из TCP - PullRequest
0 голосов
/ 06 августа 2020

Проблема

Я отправляю пакет, используя 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)

    }
}
...