mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-26 16:57:08 +00:00
fix: vless packetaddr not working
This commit is contained in:
57
transport/vless/packet.go
Normal file
57
transport/vless/packet.go
Normal file
@@ -0,0 +1,57 @@
|
||||
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
|
||||
}
|
||||
@@ -51,6 +51,10 @@ func (c *Client) StreamConn(conn net.Conn, dst *DstAddr) (net.Conn, error) {
|
||||
return newConn(conn, c, dst)
|
||||
}
|
||||
|
||||
func (c *Client) PacketConn(conn net.Conn, rAddr net.Addr) net.PacketConn {
|
||||
return &PacketConn{conn, rAddr}
|
||||
}
|
||||
|
||||
// NewClient return Client instance
|
||||
func NewClient(uuidStr string, addons *Addons) (*Client, error) {
|
||||
uid, err := utils.UUIDMap(uuidStr)
|
||||
|
||||
Reference in New Issue
Block a user