1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package xugu
- import (
- "errors"
- "net"
- "time"
- )
- var (
- ErrBusyBuffer = errors.New("busy buffer")
- )
- type buffer struct {
- buf []byte // buf 是一个字节缓冲区,长度和容量相等。
- conn net.Conn
- idx int64
- length int
- timeout time.Duration
- }
- // newBuffer 分配并返回一个新的缓冲区。
- func newBuffer(nc net.Conn) buffer {
- return buffer{
- buf: make([]byte, 2048),
- conn: nc,
- }
- }
- func (b *buffer) peekChar() byte {
- if b.idx >= int64(len(b.buf[b.idx:b.length])) {
- b.readNext(1, false)
- b.idx-- //peekchar 只查看当前字符,不移动指针,但是readNext会移动指针,所以需要-1
- }
- ret := b.buf[b.idx]
- return ret
- }
- func (b *buffer) reset() {
- b.idx = 0
- b.length = 0
- b.buf = make([]byte, 2048)
- }
- func (b *buffer) readNext(need int, reverse bool) ([]byte, error) {
- if need == 0 {
- return nil, nil
- }
- //长度不够返回
- if len(b.buf[b.idx:b.length]) < need {
- buffer := make([]byte, need+1)
- b.buf = append(b.buf[:b.length], buffer...)
- n, err := b.conn.Read(b.buf[b.length:])
- if err != nil {
- // if err == io.EOF {
- // }
- return nil, err
- }
- b.length += n
- for b.length-int(b.idx) < need {
- n, err := b.conn.Read(b.buf[b.length:])
- if err != nil {
- // if err == io.EOF {
- // fmt.Println("End of data")
- // }
- return nil, err
- }
- //nTmp += n
- b.length += n
- }
- }
- offset := b.idx
- b.idx += int64(need)
- if GlobalIsBig {
- reverse = false
- }
- if reverse {
- tmp := reverseBytes(b.buf[offset:b.idx])
- return tmp, nil
- } else {
- return b.buf[offset:b.idx], nil
- }
- }
|