utils.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package core
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/json"
  6. "github.com/astaxie/beego/logs"
  7. "io"
  8. "net"
  9. "strings"
  10. )
  11. func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
  12. buf := CopyBuff.Get()
  13. defer CopyBuff.Put(buf)
  14. for {
  15. nr, er := src.Read(buf)
  16. if nr > 0 {
  17. nw, ew := dst.Write(buf[0:nr])
  18. if nw > 0 {
  19. written += int64(nw)
  20. }
  21. if ew != nil {
  22. err = ew
  23. break
  24. }
  25. if nr != nw {
  26. err = io.ErrShortWrite
  27. break
  28. }
  29. }
  30. if er != nil {
  31. err = er
  32. break
  33. }
  34. }
  35. return written, err
  36. }
  37. func SendInfo(conn net.Conn, t interface{}) (int, error) {
  38. /*
  39. The task info is formed as follows:
  40. +----+-----+---------+
  41. |type| len | content |
  42. +----+---------------+
  43. | 4 | 4 | ... |
  44. +----+---------------+
  45. */
  46. raw := bytes.NewBuffer([]byte{})
  47. b, err := json.Marshal(t)
  48. if err != nil {
  49. return 0, err
  50. }
  51. lenBytes, err := GetLenBytes(b)
  52. if err != nil {
  53. return 0, err
  54. }
  55. binary.Write(raw, binary.LittleEndian, lenBytes)
  56. return conn.Write(raw.Bytes())
  57. }
  58. // get the assembled amount data(len 4 and content)
  59. func GetLenBytes(buf []byte) (b []byte, err error) {
  60. raw := bytes.NewBuffer([]byte{})
  61. if err = binary.Write(raw, binary.LittleEndian, int32(len(buf))); err != nil {
  62. return
  63. }
  64. if err = binary.Write(raw, binary.LittleEndian, buf); err != nil {
  65. return
  66. }
  67. b = raw.Bytes()
  68. return
  69. }
  70. func NewTcpListenerAndProcess(addr string, f func(c net.Conn), listener *net.Listener) error {
  71. var err error
  72. *listener, err = net.Listen("tcp", addr)
  73. if err != nil {
  74. return err
  75. }
  76. Accept(*listener, f)
  77. return nil
  78. }
  79. func Accept(l net.Listener, f func(c net.Conn)) {
  80. for {
  81. c, err := l.Accept()
  82. if err != nil {
  83. if strings.Contains(err.Error(), "use of closed network connection") {
  84. break
  85. }
  86. logs.Warn(err)
  87. continue
  88. }
  89. go f(c)
  90. }
  91. }