reader.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. )
  15. type Conn struct {
  16. net.Conn
  17. writer N.VectorisedWriter
  18. }
  19. func NewConn(conn net.Conn) *Conn {
  20. writer, _ := bufio.CreateVectorisedWriter(conn)
  21. return &Conn{
  22. Conn: conn,
  23. writer: writer,
  24. }
  25. }
  26. func (c *Conn) ReadMultiBuffer() (buf.MultiBuffer, error) {
  27. buffer, err := buf.ReadBuffer(c.Conn)
  28. if err != nil {
  29. return nil, err
  30. }
  31. return buf.MultiBuffer{buffer}, nil
  32. }
  33. func (c *Conn) ReadMultiBufferTimeout(duration time.Duration) (buf.MultiBuffer, error) {
  34. err := c.SetReadDeadline(time.Now().Add(duration))
  35. if err != nil {
  36. return nil, err
  37. }
  38. defer c.SetReadDeadline(time.Time{})
  39. return c.ReadMultiBuffer()
  40. }
  41. func (c *Conn) WriteMultiBuffer(bufferList buf.MultiBuffer) error {
  42. defer buf.ReleaseMulti(bufferList)
  43. if c.writer != nil {
  44. bytesList := make([][]byte, len(bufferList))
  45. for i, buffer := range bufferList {
  46. bytesList[i] = buffer.Bytes()
  47. }
  48. return common.Error(bufio.WriteVectorised(c.writer, bytesList))
  49. }
  50. // Since this conn is only used by tun, we don't force buffer writes to merge.
  51. for _, buffer := range bufferList {
  52. _, err := c.Conn.Write(buffer.Bytes())
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }