如题,据说论坛日经月经都是 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 一直循环中,读取不到更多数据
求解?数据哪里去了,怎样能取出?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.