shadowsocks_2022.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package shadowsocks_2022
  2. import (
  3. "io"
  4. B "github.com/sagernet/sing/common/buf"
  5. M "github.com/sagernet/sing/common/metadata"
  6. "github.com/xtls/xray-core/common"
  7. "github.com/xtls/xray-core/common/buf"
  8. "github.com/xtls/xray-core/common/net"
  9. )
  10. //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
  11. func toDestination(socksaddr M.Socksaddr, network net.Network) net.Destination {
  12. if socksaddr.Family().IsFqdn() {
  13. return net.Destination{
  14. Network: network,
  15. Address: net.DomainAddress(socksaddr.Fqdn),
  16. Port: net.Port(socksaddr.Port),
  17. }
  18. } else {
  19. return net.Destination{
  20. Network: network,
  21. Address: net.IPAddress(socksaddr.Addr.AsSlice()),
  22. Port: net.Port(socksaddr.Port),
  23. }
  24. }
  25. }
  26. func toSocksaddr(destination net.Destination) M.Socksaddr {
  27. var addr M.Socksaddr
  28. switch destination.Address.Family() {
  29. case net.AddressFamilyDomain:
  30. addr.Fqdn = destination.Address.Domain()
  31. default:
  32. addr.Addr = M.AddrFromIP(destination.Address.IP())
  33. }
  34. addr.Port = uint16(destination.Port)
  35. return addr
  36. }
  37. type pipeConnWrapper struct {
  38. R io.Reader
  39. W buf.Writer
  40. net.Conn
  41. }
  42. func (w *pipeConnWrapper) Close() error {
  43. common.Interrupt(w.R)
  44. common.Interrupt(w.W)
  45. common.Close(w.Conn)
  46. return nil
  47. }
  48. func (w *pipeConnWrapper) Read(b []byte) (n int, err error) {
  49. return w.R.Read(b)
  50. }
  51. func (w *pipeConnWrapper) Write(p []byte) (n int, err error) {
  52. n = len(p)
  53. var mb buf.MultiBuffer
  54. pLen := len(p)
  55. for pLen > 0 {
  56. buffer := buf.New()
  57. if pLen > buf.Size {
  58. _, err = buffer.Write(p[:buf.Size])
  59. p = p[buf.Size:]
  60. } else {
  61. buffer.Write(p)
  62. }
  63. pLen -= int(buffer.Len())
  64. mb = append(mb, buffer)
  65. }
  66. err = w.W.WriteMultiBuffer(mb)
  67. if err != nil {
  68. n = 0
  69. buf.ReleaseMulti(mb)
  70. }
  71. return
  72. }
  73. type packetConnWrapper struct {
  74. buf.Reader
  75. buf.Writer
  76. net.Conn
  77. Dest net.Destination
  78. cached buf.MultiBuffer
  79. }
  80. func (w *packetConnWrapper) ReadPacket(buffer *B.Buffer) (M.Socksaddr, error) {
  81. if w.cached != nil {
  82. mb, bb := buf.SplitFirst(w.cached)
  83. if bb == nil {
  84. w.cached = nil
  85. } else {
  86. buffer.Write(bb.Bytes())
  87. w.cached = mb
  88. var destination net.Destination
  89. if bb.UDP != nil {
  90. destination = *bb.UDP
  91. } else {
  92. destination = w.Dest
  93. }
  94. bb.Release()
  95. return toSocksaddr(destination), nil
  96. }
  97. }
  98. mb, err := w.ReadMultiBuffer()
  99. if err != nil {
  100. return M.Socksaddr{}, err
  101. }
  102. nb, bb := buf.SplitFirst(mb)
  103. if bb == nil {
  104. return M.Socksaddr{}, nil
  105. } else {
  106. buffer.Write(bb.Bytes())
  107. w.cached = nb
  108. var destination net.Destination
  109. if bb.UDP != nil {
  110. destination = *bb.UDP
  111. } else {
  112. destination = w.Dest
  113. }
  114. bb.Release()
  115. return toSocksaddr(destination), nil
  116. }
  117. }
  118. func (w *packetConnWrapper) WritePacket(buffer *B.Buffer, destination M.Socksaddr) error {
  119. vBuf := buf.New()
  120. vBuf.Write(buffer.Bytes())
  121. endpoint := toDestination(destination, net.Network_UDP)
  122. vBuf.UDP = &endpoint
  123. return w.Writer.WriteMultiBuffer(buf.MultiBuffer{vBuf})
  124. }
  125. func (w *packetConnWrapper) Close() error {
  126. common.Interrupt(w.Reader)
  127. common.Close(w.Conn)
  128. buf.ReleaseMulti(w.cached)
  129. return nil
  130. }