tcp.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package hub
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "net"
  6. "sync"
  7. "github.com/v2ray/v2ray-core/common/log"
  8. v2net "github.com/v2ray/v2ray-core/common/net"
  9. "github.com/v2ray/v2ray-core/proxy"
  10. "github.com/v2ray/v2ray-core/transport"
  11. )
  12. var (
  13. ErrorClosedConnection = errors.New("Connection already closed.")
  14. )
  15. type TCPHub struct {
  16. sync.Mutex
  17. listener net.Listener
  18. connCallback ConnectionHandler
  19. accepting bool
  20. }
  21. func ListenTCP(address v2net.Address, port v2net.Port, callback ConnectionHandler, tlsConfig *tls.Config) (*TCPHub, error) {
  22. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  23. IP: address.IP(),
  24. Port: int(port),
  25. Zone: "",
  26. })
  27. if err != nil {
  28. return nil, err
  29. }
  30. var hub *TCPHub
  31. if tlsConfig != nil {
  32. tlsListener := tls.NewListener(listener, tlsConfig)
  33. hub = &TCPHub{
  34. listener: tlsListener,
  35. connCallback: callback,
  36. }
  37. } else {
  38. hub = &TCPHub{
  39. listener: listener,
  40. connCallback: callback,
  41. }
  42. }
  43. go hub.start()
  44. return hub, nil
  45. }
  46. func ListenTCP6(address v2net.Address, port v2net.Port, callback ConnectionHandler, proxyMeta proxy.InboundHandlerMeta, tlsConfig *tls.Config) (*TCPHub, error) {
  47. if proxyMeta.KcpSupported && transport.IsKcpEnabled() {
  48. return nil, errors.New("ListenTCP6: Not Implemented")
  49. } else {
  50. return ListenTCP(address, port, callback, tlsConfig)
  51. }
  52. return nil, errors.New("ListenTCP6: Not Implemented")
  53. }
  54. func (this *TCPHub) Close() {
  55. this.accepting = false
  56. this.listener.Close()
  57. }
  58. func (this *TCPHub) start() {
  59. this.accepting = true
  60. for this.accepting {
  61. conn, err := this.listener.Accept()
  62. if err != nil {
  63. if this.accepting {
  64. log.Warning("Listener: Failed to accept new TCP connection: ", err)
  65. }
  66. continue
  67. }
  68. go this.connCallback(&Connection{
  69. dest: conn.RemoteAddr().String(),
  70. conn: conn,
  71. listener: this,
  72. })
  73. }
  74. }
  75. // @Private
  76. func (this *TCPHub) Recycle(dest string, conn net.Conn) {
  77. if this.accepting {
  78. go this.connCallback(&Connection{
  79. dest: dest,
  80. conn: conn,
  81. listener: this,
  82. })
  83. }
  84. }