mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-01-10 11:27:26 -05:00
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package udp
|
|
|
|
import (
|
|
"github.com/v2fly/v2ray-core/v5/common/buf"
|
|
"github.com/v2fly/v2ray-core/v5/common/net"
|
|
"github.com/v2fly/v2ray-core/v5/transport/internet"
|
|
)
|
|
|
|
func NewMonoDestUDPConn(conn internet.AbstractPacketConn, addr net.Addr) *MonoDestUDPConn {
|
|
return &MonoDestUDPConn{
|
|
AbstractPacketConn: conn,
|
|
dest: addr,
|
|
}
|
|
}
|
|
|
|
type MonoDestUDPConn struct {
|
|
internet.AbstractPacketConn
|
|
dest net.Addr
|
|
}
|
|
|
|
func (m *MonoDestUDPConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
|
buffer := buf.New()
|
|
buffer.Extend(2048)
|
|
nBytes, _, err := m.AbstractPacketConn.ReadFrom(buffer.Bytes())
|
|
if err != nil {
|
|
buffer.Release()
|
|
return nil, err
|
|
}
|
|
buffer.Resize(0, int32(nBytes))
|
|
return buf.MultiBuffer{buffer}, nil
|
|
}
|
|
|
|
func (m *MonoDestUDPConn) WriteMultiBuffer(buffer buf.MultiBuffer) error {
|
|
for _, b := range buffer {
|
|
_, err := m.AbstractPacketConn.WriteTo(b.Bytes(), m.dest)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
buf.ReleaseMulti(buffer)
|
|
return nil
|
|
}
|
|
|
|
func (m *MonoDestUDPConn) Read(p []byte) (n int, err error) {
|
|
n, _, err = m.AbstractPacketConn.ReadFrom(p)
|
|
return
|
|
}
|
|
|
|
func (m *MonoDestUDPConn) Write(p []byte) (n int, err error) {
|
|
return m.AbstractPacketConn.WriteTo(p, m.dest)
|
|
}
|