go - 从 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)
}
}
解决方案
推荐阅读
- git - 在变基期间解决所有“由他们更改”或“由他们删除”
- apache - Docker 没有此服务器的权限
- android - 所有 com.android.support 库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃)。找到版本 28.0.0,
- database - Microsoft Access VBA - IF 语句总是计算 Else 表达式
- visual-studio-code - 文件夹和工作区有什么区别?
- r - 如何在 R 中使用 ES(边缘选择)以及如何解释从中获得的结果
- salesforce - Visualforce 页面按案例类别显示案例计数,单击每个类别时,我想获得案例的详细视图。如何?
- javascript - 如何根据 Javascript 中的键进行排序和配对
- ruby-on-rails - 不同的日期格式和一种语言环境
- c++ - (C++) 继承时删除子类后如何删除基类?