tcp.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package hub
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "net"
  6. "github.com/v2ray/v2ray-core/common/log"
  7. v2net "github.com/v2ray/v2ray-core/common/net"
  8. )
  9. var (
  10. ErrorClosedConnection = errors.New("Connection already closed.")
  11. )
  12. type TCPHub struct {
  13. listener net.Listener
  14. connCallback ConnectionHandler
  15. accepting bool
  16. }
  17. func ListenTCP(address v2net.Address, port v2net.Port, callback ConnectionHandler, tlsConfig *tls.Config) (*TCPHub, error) {
  18. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  19. IP: address.IP(),
  20. Port: int(port),
  21. Zone: "",
  22. })
  23. if err != nil {
  24. return nil, err
  25. }
  26. var hub *TCPHub
  27. if tlsConfig != nil {
  28. tlsListener := tls.NewListener(listener, tlsConfig)
  29. hub = &TCPHub{
  30. listener: tlsListener,
  31. connCallback: callback,
  32. }
  33. } else {
  34. hub = &TCPHub{
  35. listener: listener,
  36. connCallback: callback,
  37. }
  38. }
  39. go hub.start()
  40. return hub, nil
  41. }
  42. func (this *TCPHub) Close() {
  43. this.accepting = false
  44. this.listener.Close()
  45. this.listener = nil
  46. }
  47. func (this *TCPHub) start() {
  48. this.accepting = true
  49. for this.accepting {
  50. conn, err := this.listener.Accept()
  51. if err != nil {
  52. if this.accepting {
  53. log.Warning("Listener: Failed to accept new TCP connection: ", err)
  54. }
  55. continue
  56. }
  57. go this.connCallback(&Connection{
  58. conn: conn,
  59. listener: this,
  60. })
  61. }
  62. }
  63. func (this *TCPHub) recycle(conn *net.TCPConn) {
  64. }