monodest.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package udp
  2. import (
  3. "github.com/v2fly/v2ray-core/v5/common/buf"
  4. "github.com/v2fly/v2ray-core/v5/common/net"
  5. "github.com/v2fly/v2ray-core/v5/transport/internet"
  6. )
  7. func NewMonoDestUDPConn(conn internet.AbstractPacketConn, addr net.Addr) *MonoDestUDPConn {
  8. return &MonoDestUDPConn{
  9. AbstractPacketConn: conn,
  10. dest: addr,
  11. }
  12. }
  13. type MonoDestUDPConn struct {
  14. internet.AbstractPacketConn
  15. dest net.Addr
  16. }
  17. func (m *MonoDestUDPConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
  18. buffer := buf.New()
  19. buffer.Extend(2048)
  20. nBytes, _, err := m.AbstractPacketConn.ReadFrom(buffer.Bytes())
  21. if err != nil {
  22. buffer.Release()
  23. return nil, err
  24. }
  25. buffer.Resize(0, int32(nBytes))
  26. return buf.MultiBuffer{buffer}, nil
  27. }
  28. func (m *MonoDestUDPConn) WriteMultiBuffer(buffer buf.MultiBuffer) error {
  29. for _, b := range buffer {
  30. _, err := m.AbstractPacketConn.WriteTo(b.Bytes(), m.dest)
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. buf.ReleaseMulti(buffer)
  36. return nil
  37. }
  38. func (m *MonoDestUDPConn) Read(p []byte) (n int, err error) {
  39. n, _, err = m.AbstractPacketConn.ReadFrom(p)
  40. return
  41. }
  42. func (m *MonoDestUDPConn) Write(p []byte) (n int, err error) {
  43. return m.AbstractPacketConn.WriteTo(p, m.dest)
  44. }