connAdp.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package inbound
  2. import (
  3. "io"
  4. "net"
  5. "github.com/v2fly/v2ray-core/v5/common/buf"
  6. "github.com/v2fly/v2ray-core/v5/common/signal/done"
  7. )
  8. func newUDPConnAdaptor(conn net.Conn, done *done.Instance) net.Conn {
  9. return &udpConnAdp{
  10. Conn: conn,
  11. reader: buf.NewPacketReader(conn),
  12. cachedMultiBuffer: nil,
  13. finished: done,
  14. }
  15. }
  16. type udpConnAdp struct {
  17. net.Conn
  18. reader buf.Reader
  19. cachedMultiBuffer buf.MultiBuffer
  20. finished *done.Instance
  21. }
  22. func (u *udpConnAdp) Read(p []byte) (n int, err error) {
  23. if u.cachedMultiBuffer.IsEmpty() {
  24. u.cachedMultiBuffer, err = u.reader.ReadMultiBuffer()
  25. if err != nil {
  26. return 0, newError("unable to read from connection").Base(err)
  27. }
  28. }
  29. var buffer *buf.Buffer
  30. u.cachedMultiBuffer, buffer = buf.SplitFirst(u.cachedMultiBuffer)
  31. defer buffer.Release()
  32. n = copy(p, buffer.Bytes())
  33. if n != int(buffer.Len()) {
  34. return 0, io.ErrShortBuffer
  35. }
  36. return n, nil
  37. }
  38. func (u *udpConnAdp) Close() error {
  39. u.finished.Close()
  40. return u.Conn.Close()
  41. }