package core import ( "bytes" "encoding/binary" "encoding/json" "github.com/astaxie/beego/logs" "io" "net" "strings" ) func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) { buf := CopyBuff.Get() defer CopyBuff.Put(buf) for { nr, er := src.Read(buf) if nr > 0 { nw, ew := dst.Write(buf[0:nr]) if nw > 0 { written += int64(nw) } if ew != nil { err = ew break } if nr != nw { err = io.ErrShortWrite break } } if er != nil { err = er break } } return written, err } func SendInfo(conn net.Conn, t interface{}) (int, error) { /* The task info is formed as follows: +----+-----+---------+ |type| len | content | +----+---------------+ | 4 | 4 | ... | +----+---------------+ */ raw := bytes.NewBuffer([]byte{}) b, err := json.Marshal(t) if err != nil { return 0, err } lenBytes, err := GetLenBytes(b) if err != nil { return 0, err } binary.Write(raw, binary.LittleEndian, lenBytes) return conn.Write(raw.Bytes()) } // get the assembled amount data(len 4 and content) func GetLenBytes(buf []byte) (b []byte, err error) { raw := bytes.NewBuffer([]byte{}) if err = binary.Write(raw, binary.LittleEndian, int32(len(buf))); err != nil { return } if err = binary.Write(raw, binary.LittleEndian, buf); err != nil { return } b = raw.Bytes() return } func NewTcpListenerAndProcess(addr string, f func(c net.Conn), listener *net.Listener) error { var err error *listener, err = net.Listen("tcp", addr) if err != nil { return err } Accept(*listener, f) return nil } func Accept(l net.Listener, f func(c net.Conn)) { for { c, err := l.Accept() if err != nil { if strings.Contains(err.Error(), "use of closed network connection") { break } logs.Warn(err) continue } go f(c) } }