mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
Some checks failed
Test / test (1.20, macos-13) (push) Has been cancelled
Test / test (1.20, macos-latest) (push) Has been cancelled
Test / test (1.20, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.20, ubuntu-latest) (push) Has been cancelled
Test / test (1.20, windows-latest) (push) Has been cancelled
Test / test (1.21, macos-13) (push) Has been cancelled
Test / test (1.21, macos-latest) (push) Has been cancelled
Test / test (1.21, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.21, ubuntu-latest) (push) Has been cancelled
Test / test (1.21, windows-latest) (push) Has been cancelled
Test / test (1.22, macos-13) (push) Has been cancelled
Test / test (1.22, macos-latest) (push) Has been cancelled
Test / test (1.22, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.22, ubuntu-latest) (push) Has been cancelled
Test / test (1.22, windows-latest) (push) Has been cancelled
Test / test (1.23, macos-13) (push) Has been cancelled
Test / test (1.23, macos-latest) (push) Has been cancelled
Test / test (1.23, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.23, ubuntu-latest) (push) Has been cancelled
Test / test (1.23, windows-latest) (push) Has been cancelled
Test / test (1.24, macos-13) (push) Has been cancelled
Test / test (1.24, macos-latest) (push) Has been cancelled
Test / test (1.24, ubuntu-24.04-arm) (push) Has been cancelled
Test / test (1.24, ubuntu-latest) (push) Has been cancelled
Test / test (1.24, windows-latest) (push) Has been cancelled
Trigger CMFA Update / trigger-CMFA-update (push) Has been cancelled
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
|
|
}
|