mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-27 09:17:12 +00:00
58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
package vless
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
"net"
|
|
|
|
"github.com/metacubex/mihomo/common/pool"
|
|
)
|
|
|
|
type PacketConn struct {
|
|
net.Conn
|
|
rAddr net.Addr
|
|
}
|
|
|
|
func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) {
|
|
err := binary.Write(c.Conn, binary.BigEndian, uint16(len(b)))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return c.Conn.Write(b)
|
|
}
|
|
|
|
func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) {
|
|
var length uint16
|
|
err := binary.Read(c.Conn, binary.BigEndian, &length)
|
|
if err != nil {
|
|
return 0, nil, err
|
|
}
|
|
if len(b) < int(length) {
|
|
return 0, nil, io.ErrShortBuffer
|
|
}
|
|
n, err := io.ReadFull(c.Conn, b[:length])
|
|
return n, c.rAddr, err
|
|
}
|
|
|
|
func (c *PacketConn) WaitReadFrom() (data []byte, put func(), addr net.Addr, err error) {
|
|
var length uint16
|
|
err = binary.Read(c.Conn, binary.BigEndian, &length)
|
|
if err != nil {
|
|
return
|
|
}
|
|
readBuf := pool.Get(int(length))
|
|
put = func() {
|
|
_ = pool.Put(readBuf)
|
|
}
|
|
n, err := io.ReadFull(c.Conn, readBuf)
|
|
if err != nil {
|
|
put()
|
|
put = nil
|
|
return
|
|
}
|
|
data = readBuf[:n]
|
|
addr = c.rAddr
|
|
return
|
|
}
|