go tcp 服务器,如何解包超大数据包

1次阅读

共计 844 个字符,预计需要花费 3 分钟才能阅读完成。

如题,据说论坛日经月经都是 TCP 粘包?

参考了某论坛源码, 直接贴链接不会被封号吧
某 csdn Golang 实现之 TCP 长连接 ——- 服务端和客户端

/article/details/131402492

其中的解包核心代码

// 如果消息体超过 4096(默认长度)
var pack []byte
if length > 4096 {
pack = make([]byte, 0, int(length-1))
readableLength := length – 1
for {
if readableLength < 4096 {slice := make([]byte, readableLength) _, err = reader.Read(slice) pack = append(pack, slice...) break } slice := make([]byte, int32(reader.Buffered())) _, err = reader.Read(slice) pack = append(pack, slice...) // 更新可读长度 readableLength = readableLength - int32(len(slice)) } // buffer 返回缓冲中现有的可读的字节数,2+length+1 表示帧类型 + 数据长度 + 帧尾 } else if length <4096 && int32(reader.Buffered()) < length-1 { // 退回已读取的帧头 reader.UnreadByte() return Msg{Type: 1}, errors.New("数据长度不足") } else { // 读取剩余帧内容 pack = make([]byte, int(length-1)) _, err = reader.Read(pack) if err != nil {return Msg{Type: 1}, err } }

由于本人发送的消息体达到 2w,进入第一个循环,打印出 len(slice),除了第一次有数据,后面 slice 长度全是 0,后面这个 pack 一直循环中,读取不到更多数据

求解?数据哪里去了,怎样能取出?

正文完
 0