Go1.7.3一个收发消息的小接口

package transport

import (
    "encoding/binary"
    "errors"
    "io"
    "math"
    "sync"
)

const (
    sizeLen = 5 //设置消息多少字节大小,1<<4*8-1长度,最后一个字节用来做消息分割的,防止恶意链接
)

var (
    ErrLength = errors.New("message too large")
    ErrHeader = errors.New("message head error")
)

//添加数据头并发送
func SedMsg(w io.Writer, p []byte) error {
    msglen := len(p)
    if msglen > math.MaxUint32 {
        return ErrLength
    }
    var buf = make([]byte, sizeLen+msglen)
    binary.BigEndian.PutUint32(buf, uint32(msglen))
    copy(buf[sizeLen:], p)
    _, err := w.Write(buf)
    return err
}

//从数据流中根据头长度读取完整的消息
func RcvMsg(r io.Reader, lock sync.Locker) ([]byte, error) {
    lock.Lock()
    defer lock.Unlock()

    var header [sizeLen]byte
    if _, err := io.ReadFull(r, header[:]); err != nil {
        return nil, err
    }

    if header[sizeLen-1] == 0 {
        length := binary.BigEndian.Uint32(header[:])
        if length == 0 {
            return nil, nil
        }
        msg := make([]byte, int(length))
        if _, err := io.ReadFull(r, msg); err != nil {
            if err == io.EOF {
                err = io.ErrUnexpectedEOF
            }
            msg = msg[:0]
            return nil, err
        }
        return msg, nil
    }

    return nil, ErrHeader
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值