| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package inbound
- import (
- "github.com/v2fly/v2ray-core/v5/common/buf"
- "github.com/v2fly/v2ray-core/v5/common/signal/done"
- "io"
- "net"
- )
- func newUDPConnAdaptor(conn net.Conn, done *done.Instance) net.Conn {
- return &udpConnAdp{
- Conn: conn,
- reader: buf.NewPacketReader(conn),
- cachedMultiBuffer: nil,
- finished: done,
- }
- }
- type udpConnAdp struct {
- net.Conn
- reader buf.Reader
- cachedMultiBuffer buf.MultiBuffer
- finished *done.Instance
- }
- func (u *udpConnAdp) Read(p []byte) (n int, err error) {
- if u.cachedMultiBuffer.IsEmpty() {
- u.cachedMultiBuffer, err = u.reader.ReadMultiBuffer()
- if err != nil {
- return 0, newError("unable to read from connection").Base(err)
- }
- }
- var buffer *buf.Buffer
- u.cachedMultiBuffer, buffer = buf.SplitFirst(u.cachedMultiBuffer)
- defer buffer.Release()
- n = copy(p, buffer.Bytes())
- if n != int(buffer.Len()) {
- return 0, io.ErrShortBuffer
- }
- return n, nil
- }
- func (u *udpConnAdp) Close() error {
- u.finished.Close()
- return u.Conn.Close()
- }
|