tcp.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2016 fatedier, fatedier@gmail.com
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package net
  15. import (
  16. "fmt"
  17. "net"
  18. "github.com/fatedier/frp/utils/log"
  19. )
  20. type TcpListener struct {
  21. net.Addr
  22. listener net.Listener
  23. accept chan Conn
  24. closeFlag bool
  25. log.Logger
  26. }
  27. func ListenTcp(bindAddr string, bindPort int) (l *TcpListener, err error) {
  28. tcpAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", bindAddr, bindPort))
  29. if err != nil {
  30. return l, err
  31. }
  32. listener, err := net.ListenTCP("tcp", tcpAddr)
  33. if err != nil {
  34. return l, err
  35. }
  36. l = &TcpListener{
  37. Addr: listener.Addr(),
  38. listener: listener,
  39. accept: make(chan Conn),
  40. closeFlag: false,
  41. Logger: log.NewPrefixLogger(""),
  42. }
  43. go func() {
  44. for {
  45. conn, err := listener.AcceptTCP()
  46. if err != nil {
  47. if l.closeFlag {
  48. close(l.accept)
  49. return
  50. }
  51. continue
  52. }
  53. c := NewTcpConn(conn)
  54. l.accept <- c
  55. }
  56. }()
  57. return l, err
  58. }
  59. // Wait util get one new connection or listener is closed
  60. // if listener is closed, err returned.
  61. func (l *TcpListener) Accept() (Conn, error) {
  62. conn, ok := <-l.accept
  63. if !ok {
  64. return conn, fmt.Errorf("channel for tcp listener closed")
  65. }
  66. return conn, nil
  67. }
  68. func (l *TcpListener) Close() error {
  69. if !l.closeFlag {
  70. l.closeFlag = true
  71. l.listener.Close()
  72. }
  73. return nil
  74. }
  75. // Wrap for TCPConn.
  76. type TcpConn struct {
  77. net.Conn
  78. log.Logger
  79. }
  80. func NewTcpConn(conn net.Conn) (c *TcpConn) {
  81. c = &TcpConn{
  82. Conn: conn,
  83. Logger: log.NewPrefixLogger(""),
  84. }
  85. return
  86. }
  87. func ConnectTcpServer(addr string) (c Conn, err error) {
  88. servertAddr, err := net.ResolveTCPAddr("tcp", addr)
  89. if err != nil {
  90. return
  91. }
  92. conn, err := net.DialTCP("tcp", nil, servertAddr)
  93. if err != nil {
  94. return
  95. }
  96. c = NewTcpConn(conn)
  97. return
  98. }