utils.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package core
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/json"
  6. "io"
  7. "net"
  8. )
  9. func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
  10. buf := CopyBuff.Get()
  11. defer CopyBuff.Put(buf)
  12. for {
  13. nr, er := src.Read(buf)
  14. if nr > 0 {
  15. nw, ew := dst.Write(buf[0:nr])
  16. if nw > 0 {
  17. written += int64(nw)
  18. }
  19. if ew != nil {
  20. err = ew
  21. break
  22. }
  23. if nr != nw {
  24. err = io.ErrShortWrite
  25. break
  26. }
  27. }
  28. if er != nil {
  29. err = er
  30. break
  31. }
  32. }
  33. return written, err
  34. }
  35. func SendInfo(conn net.Conn, t interface{}) (int, error) {
  36. /*
  37. The task info is formed as follows:
  38. +----+-----+---------+
  39. |type| len | content |
  40. +----+---------------+
  41. | 4 | 4 | ... |
  42. +----+---------------+
  43. */
  44. raw := bytes.NewBuffer([]byte{})
  45. b, err := json.Marshal(t)
  46. if err != nil {
  47. return 0, err
  48. }
  49. lenBytes, err := GetLenBytes(b)
  50. if err != nil {
  51. return 0, err
  52. }
  53. binary.Write(raw, binary.LittleEndian, lenBytes)
  54. return conn.Write(raw.Bytes())
  55. }
  56. // get the assembled amount data(len 4 and content)
  57. func GetLenBytes(buf []byte) (b []byte, err error) {
  58. raw := bytes.NewBuffer([]byte{})
  59. if err = binary.Write(raw, binary.LittleEndian, int32(len(buf))); err != nil {
  60. return
  61. }
  62. if err = binary.Write(raw, binary.LittleEndian, buf); err != nil {
  63. return
  64. }
  65. b = raw.Bytes()
  66. return
  67. }