1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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)
- }
- }
|