livego
livego copied to clipboard
发现一个小问题,怀疑是个bug。贴出来,作者麻烦看下哇 谢谢啦
conn.go文件
func (conn *Conn) Read(c *ChunkStream) error {
h, _ := conn.rw.ReadUintBE(1)
for {
// if err != nil {
// log.Println("read from conn error: ", err)
// return err
// }
format := h >> 6
csid := h & 0x3f
cs, ok := conn.chunks[csid]
if !ok {
cs = ChunkStream{}
conn.chunks[csid] = cs
}
cs.tmpFromat = format
cs.CSID = csid
err := cs.readChunk(conn.rw, conn.remoteChunkSize, conn.pool)
if err != nil {
return err
}
conn.chunks[csid] = cs
if cs.full() {
*c = cs
break
}
}
conn.handleControlMsg(c)
conn.ack(c.Length)
return nil
}
如果基本头base header不是一个字节,是不是应该把代码修改为:
func (conn *Conn) Read(c *ChunkStream) error {
for {
h, _ := conn.rw.ReadUintBE(1)
// if err != nil {
// log.Println("read from conn error: ", err)
// return err
// }
format := h >> 6
csid := h & 0x3f
cs, ok := conn.chunks[csid]
if !ok {
cs = ChunkStream{}
conn.chunks[csid] = cs
}
cs.tmpFromat = format
cs.CSID = csid
err := cs.readChunk(conn.rw, conn.remoteChunkSize, conn.pool)
if err != nil {
return err
}
if cs.CSID != csid {
delete(conn.chunks, csid)
}
conn.chunks[cs.CSID] = cs
if cs.full() {
*c = cs
break
}
}
conn.handleControlMsg(c)
conn.ack(c.Length)
return nil
}
感觉删除不是很好的办法, 万一之前确实也有一个chunk-stream-id是16,当前又接到一个csid==(16+64)的消息, 则会错误的删除掉之前的chunk-stream.
我觉得应该是,如果map里面没有找到这个chunk-stream-id 就暂时本地临时创建一个, 待完全读入chunk-stream-id后,再将此chunk-stream放到map里面去。
if !ok {
cs = ChunkStream{} // 实际,map读不到,理论上,cs也已经是初始化好的一个零值 struct 可以直接使用
// conn.chunks[csid] = cs // 此行不需要
}
实际读代码,其实后面做了chunk-stream-id 的处理:
func (chunkStream *ChunkStream) readChunk(r *ReadWriter, chunkSize uint32, pool *pool.Pool) error {
if chunkStream.remain != 0 && chunkStream.tmpFromat != 3 {
return fmt.Errorf("inlaid remin = %d", chunkStream.remain)
}
switch chunkStream.CSID {
case 0:
id, _ := r.ReadUintLE(1)
chunkStream.CSID = id + 64
case 1:
id, _ := r.ReadUintLE(2)
chunkStream.CSID = id + 64
}
switch chunkStream.tmpFromat {
case 0:
chunkStream.Format = chunkStream.tmpFromat
chunkStream.Timestamp, _ = r.ReadUintBE(3)
chunkStream.Length, _ = r.ReadUintBE(3)
chunkStream.TypeID, _ = r.ReadUintBE(1)
chunkStream.StreamID, _ = r.ReadUintLE(4)
if chunkStream.Timestamp == 0xffffff {
chunkStream.Timestamp, _ = r.ReadUintBE(4)
chunkStream.exted = true
} else {
chunkStream.exted = false
}
chunkStream.new(pool)
case 1:
chunkStream.Format = chunkStream.tmpFromat
timeStamp, _ := r.ReadUintBE(3)
chunkStream.Length, _ = r.ReadUintBE(3)
chunkStream.TypeID, _ = r.ReadUintBE(1)
if timeStamp == 0xffffff {
timeStamp, _ = r.ReadUintBE(4)
chunkStream.exted = true
} else {
chunkStream.exted = false
}
chunkStream.timeDelta = timeStamp
chunkStream.Timestamp += timeStamp
chunkStream.new(pool)
case 2:
chunkStream.Format = chunkStream.tmpFromat
timeStamp, _ := r.ReadUintBE(3)
if timeStamp == 0xffffff {
timeStamp, _ = r.ReadUintBE(4)
chunkStream.exted = true
} else {
chunkStream.exted = false
}
chunkStream.timeDelta = timeStamp
chunkStream.Timestamp += timeStamp
chunkStream.new(pool)
....
}