connection.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package tcp
  2. import (
  3. "io"
  4. "net"
  5. "sync"
  6. "time"
  7. "v2ray.com/core/transport/internet/internal"
  8. )
  9. type Connection struct {
  10. sync.RWMutex
  11. id internal.ConnectionID
  12. reusable bool
  13. conn net.Conn
  14. listener internal.ConnectionRecyler
  15. config *Config
  16. }
  17. func NewConnection(id internal.ConnectionID, conn net.Conn, manager internal.ConnectionRecyler, config *Config) *Connection {
  18. return &Connection{
  19. id: id,
  20. conn: conn,
  21. listener: manager,
  22. reusable: config.IsConnectionReuse(),
  23. config: config,
  24. }
  25. }
  26. func (v *Connection) Read(b []byte) (int, error) {
  27. conn := v.underlyingConn()
  28. if conn == nil {
  29. return 0, io.EOF
  30. }
  31. return conn.Read(b)
  32. }
  33. func (v *Connection) Write(b []byte) (int, error) {
  34. conn := v.underlyingConn()
  35. if conn == nil {
  36. return 0, io.ErrClosedPipe
  37. }
  38. return conn.Write(b)
  39. }
  40. func (v *Connection) Close() error {
  41. if v == nil {
  42. return io.ErrClosedPipe
  43. }
  44. v.Lock()
  45. defer v.Unlock()
  46. if v.conn == nil {
  47. return io.ErrClosedPipe
  48. }
  49. if v.Reusable() {
  50. v.listener.Put(v.id, v.conn)
  51. return nil
  52. }
  53. err := v.conn.Close()
  54. v.conn = nil
  55. return err
  56. }
  57. func (v *Connection) LocalAddr() net.Addr {
  58. conn := v.underlyingConn()
  59. if conn == nil {
  60. return nil
  61. }
  62. return conn.LocalAddr()
  63. }
  64. func (v *Connection) RemoteAddr() net.Addr {
  65. conn := v.underlyingConn()
  66. if conn == nil {
  67. return nil
  68. }
  69. return conn.RemoteAddr()
  70. }
  71. func (v *Connection) SetDeadline(t time.Time) error {
  72. conn := v.underlyingConn()
  73. if conn == nil {
  74. return nil
  75. }
  76. return conn.SetDeadline(t)
  77. }
  78. func (v *Connection) SetReadDeadline(t time.Time) error {
  79. conn := v.underlyingConn()
  80. if conn == nil {
  81. return nil
  82. }
  83. return conn.SetReadDeadline(t)
  84. }
  85. func (v *Connection) SetWriteDeadline(t time.Time) error {
  86. conn := v.underlyingConn()
  87. if conn == nil {
  88. return nil
  89. }
  90. return conn.SetWriteDeadline(t)
  91. }
  92. func (v *Connection) SetReusable(reusable bool) {
  93. if v == nil {
  94. return
  95. }
  96. v.reusable = reusable
  97. }
  98. func (v *Connection) Reusable() bool {
  99. if v == nil {
  100. return false
  101. }
  102. return v.config.IsConnectionReuse() && v.reusable
  103. }
  104. func (v *Connection) SysFd() (int, error) {
  105. conn := v.underlyingConn()
  106. if conn == nil {
  107. return 0, io.ErrClosedPipe
  108. }
  109. return internal.GetSysFd(conn)
  110. }
  111. func (v *Connection) underlyingConn() net.Conn {
  112. if v == nil {
  113. return nil
  114. }
  115. v.RLock()
  116. defer v.RUnlock()
  117. return v.conn
  118. }