| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | package linker
import (
	"context"
	"hash/crc32"
	"net"
	"runtime"
	"strconv"
	"github.com/wpajqz/linker/codec"
)
var _ Context = new(ContextUdp)
type ContextUdp struct {
	defaultContext
	remote *net.UDPAddr
	Conn   *net.UDPConn
}
func NewContextUdp(conn *net.UDPConn, remote *net.UDPAddr, OperateType uint32, Sequence int64, Header, Body []byte, config Config) *ContextUdp {
	return &ContextUdp{
		defaultContext: defaultContext{
			config:      config,
			operateType: OperateType,
			sequence:    Sequence,
			Context:     context.Background(),
			Request:     struct{ Header, Body []byte }{Header: Header, Body: Body},
			body:        Body,
		},
		Conn:   conn,
		remote: remote,
	}
}
// 响应请求成功的数据包
func (c *ContextUdp) Success(body interface{}) {
	r, err := codec.NewCoder(c.config.ContentType)
	if err != nil {
		panic(err)
	}
	data, err := r.Encoder(body)
	if err != nil {
		panic(err)
	}
	p, err := NewPacket(c.operateType, c.sequence, c.Response.Header, data, c.config.PluginForPacketSender)
	if err != nil {
		panic(err)
	}
	c.Conn.WriteToUDP(p.Bytes(), c.remote)
	runtime.Goexit()
}
// 响应请求失败的数据包
func (c *ContextUdp) Error(code int, message string) {
	c.SetResponseProperty("code", strconv.Itoa(code))
	c.SetResponseProperty("message", message)
	p, err := NewPacket(c.operateType, c.sequence, c.Response.Header, nil, c.config.PluginForPacketSender)
	if err != nil {
		panic(err)
	}
	c.Conn.WriteToUDP(p.Bytes(), c.remote)
	runtime.Goexit()
}
// 向客户端发送数据
func (c *ContextUdp) Write(operator string, body interface{}) (int, error) {
	r, err := codec.NewCoder(c.config.ContentType)
	if err != nil {
		return 0, err
	}
	data, err := r.Encoder(body)
	if err != nil {
		return 0, err
	}
	p, err := NewPacket(crc32.ChecksumIEEE([]byte(operator)), 0, c.Response.Header, data, c.config.PluginForPacketSender)
	if err != nil {
		panic(err)
	}
	return c.Conn.WriteToUDP(p.Bytes(), c.remote)
}
func (c *ContextUdp) LocalAddr() string {
	return c.Conn.LocalAddr().String()
}
func (c *ContextUdp) RemoteAddr() string {
	return c.Conn.RemoteAddr().String()
}
 |