reader.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package singbridge
  2. import (
  3. "time"
  4. "github.com/sagernet/sing/common"
  5. "github.com/sagernet/sing/common/bufio"
  6. N "github.com/sagernet/sing/common/network"
  7. "github.com/xtls/xray-core/common/buf"
  8. "github.com/xtls/xray-core/common/net"
  9. )
  10. var (
  11. _ buf.Reader = (*Conn)(nil)
  12. _ buf.TimeoutReader = (*Conn)(nil)
  13. _ buf.Writer = (*Conn)(nil)
  14. _ buf.Reader = (*PacketConn)(nil)
  15. _ buf.TimeoutReader = (*PacketConn)(nil)
  16. _ buf.Writer = (*PacketConn)(nil)
  17. )
  18. type Conn struct {
  19. net.Conn
  20. writer N.VectorisedWriter
  21. }
  22. func NewConn(conn net.Conn) *Conn {
  23. writer, _ := bufio.CreateVectorisedWriter(conn)
  24. return &Conn{
  25. Conn: conn,
  26. writer: writer,
  27. }
  28. }
  29. func (c *Conn) ReadMultiBuffer() (buf.MultiBuffer, error) {
  30. buffer, err := buf.ReadBuffer(c.Conn)
  31. if err != nil {
  32. return nil, err
  33. }
  34. return buf.MultiBuffer{buffer}, nil
  35. }
  36. func (c *Conn) ReadMultiBufferTimeout(duration time.Duration) (buf.MultiBuffer, error) {
  37. err := c.SetReadDeadline(time.Now().Add(duration))
  38. if err != nil {
  39. return nil, err
  40. }
  41. defer c.SetReadDeadline(time.Time{})
  42. return c.ReadMultiBuffer()
  43. }
  44. func (c *Conn) WriteMultiBuffer(bufferList buf.MultiBuffer) error {
  45. defer buf.ReleaseMulti(bufferList)
  46. if c.writer != nil {
  47. bytesList := make([][]byte, len(bufferList))
  48. for i, buffer := range bufferList {
  49. bytesList[i] = buffer.Bytes()
  50. }
  51. return common.Error(bufio.WriteVectorised(c.writer, bytesList))
  52. }
  53. // Since this conn is only used by tun, we don't force buffer writes to merge.
  54. for _, buffer := range bufferList {
  55. _, err := c.Conn.Write(buffer.Bytes())
  56. if err != nil {
  57. return err
  58. }
  59. }
  60. return nil
  61. }
  62. type PacketConn struct {
  63. net.Conn
  64. destination net.Destination
  65. }
  66. func (c *PacketConn) ReadMultiBuffer() (buf.MultiBuffer, error) {
  67. buffer, err := buf.ReadBuffer(c.Conn)
  68. if err != nil {
  69. return nil, err
  70. }
  71. buffer.UDP = &c.destination
  72. return buf.MultiBuffer{buffer}, nil
  73. }
  74. func (c *PacketConn) ReadMultiBufferTimeout(duration time.Duration) (buf.MultiBuffer, error) {
  75. err := c.SetReadDeadline(time.Now().Add(duration))
  76. if err != nil {
  77. return nil, err
  78. }
  79. defer c.SetReadDeadline(time.Time{})
  80. return c.ReadMultiBuffer()
  81. }
  82. func (c *PacketConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
  83. mb, err := buf.WriteMultiBuffer(c.Conn, mb)
  84. buf.ReleaseMulti(mb)
  85. return err
  86. }