xugu_buffer.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package xugu
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. )
  7. var (
  8. ErrBusyBuffer = errors.New("busy buffer")
  9. )
  10. type buffer struct {
  11. buf []byte // buf 是一个字节缓冲区,长度和容量相等。
  12. conn net.Conn
  13. idx int64
  14. length int
  15. timeout time.Duration
  16. }
  17. // newBuffer 分配并返回一个新的缓冲区。
  18. func newBuffer(nc net.Conn) buffer {
  19. return buffer{
  20. buf: make([]byte, 2048),
  21. conn: nc,
  22. }
  23. }
  24. func (b *buffer) peekChar() byte {
  25. if b.idx > int64(len(b.buf[b.idx:b.length])) {
  26. b.readNext(1, false)
  27. b.idx-- //peekchar 只查看当前字符,不移动指针,但是readNext会移动指针,所以需要-1
  28. }
  29. ret := b.buf[b.idx]
  30. return ret
  31. }
  32. func (b *buffer) reset() {
  33. b.idx = 0
  34. b.length = 0
  35. b.buf = make([]byte, 2048)
  36. }
  37. func (b *buffer) readNext(need int, reverse bool) ([]byte, error) {
  38. if need == 0 {
  39. return nil, nil
  40. }
  41. //长度不够返回
  42. if len(b.buf[b.idx:b.length]) < need {
  43. buffer := make([]byte, need+1)
  44. b.buf = append(b.buf[:b.length], buffer...)
  45. n, err := b.conn.Read(b.buf[b.length:])
  46. if err != nil {
  47. // if err == io.EOF {
  48. // }
  49. return nil, err
  50. }
  51. b.length += n
  52. for b.length-int(b.idx) < need {
  53. n, err := b.conn.Read(b.buf[b.length:])
  54. if err != nil {
  55. // if err == io.EOF {
  56. // }
  57. return nil, err
  58. }
  59. //nTmp += n
  60. b.length += n
  61. }
  62. }
  63. offset := b.idx
  64. b.idx += int64(need)
  65. if GlobalIsBig {
  66. reverse = false
  67. }
  68. if reverse {
  69. tmp := reverseBytes(b.buf[offset:b.idx])
  70. return tmp, nil
  71. } else {
  72. return b.buf[offset:b.idx], nil
  73. }
  74. }