Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "flag"
  5. log "github.com/Sirupsen/logrus"
  6. "io"
  7. "net"
  8. )
  9.  
  10. var (
  11. localAddr = flag.String("local_server_addr", "localhost:9999", "local address")
  12. remoteAddr = flag.String("remote_server_addr", "localhost:10000", "remote address")
  13. debug = flag.Bool("debug", false, "Turns on debug mode")
  14. )
  15.  
  16. func proxyConn(conn *net.TCPConn, remoteConn *net.Conn) {
  17. errc := make(chan error, 2)
  18. copy := func(dst io.Writer, src io.Reader) {
  19. log.Debugf("Sending data from src %v to dst %v", src, dst)
  20. _, err := io.Copy(dst, src)
  21. errc <- err
  22. }
  23. go copy(conn, *remoteConn)
  24. go copy(*remoteConn, conn)
  25. <-errc
  26. }
  27.  
  28. func handleConn(in <-chan *net.TCPConn, out chan<- *net.TCPConn, remoteConn *net.Conn) {
  29. for conn := range in {
  30. log.Printf("Handling connection %v...", conn)
  31. proxyConn(conn, remoteConn)
  32. out <- conn
  33. }
  34. }
  35.  
  36. func closeConn(in <-chan *net.TCPConn) {
  37. for conn := range in {
  38. conn.Close()
  39. }
  40. }
  41.  
  42. func main() {
  43. flag.Parse()
  44. if *debug {
  45. log.SetLevel(log.DebugLevel)
  46. }
  47. log.Infof("Listening on port: %v", *localAddr)
  48. addr, err := net.ResolveTCPAddr("tcp", *localAddr)
  49. if err != nil {
  50. log.Fatalf("Error resolving TCP address: %v", err)
  51. }
  52. listener, err := net.ListenTCP("tcp", addr)
  53. if err != nil {
  54. log.Fatalf("Error creating TCP listener: %v", err)
  55. }
  56. log.Infof("Connecting to remote server %v", *remoteAddr)
  57. remoteServiceConn, err := net.Dial("tcp", *remoteAddr)
  58. if err != nil {
  59. log.Fatalf("net.Dial(%v) = _, %v", *remoteAddr, err)
  60. }
  61. defer remoteServiceConn.Close()
  62. pending, complete := make(chan *net.TCPConn), make(chan *net.TCPConn)
  63. for i := 0; i < 5; i++ {
  64. go handleConn(pending, complete, &remoteServiceConn)
  65. }
  66. go closeConn(complete)
  67. log.Info("Waiting for incoming connections...")
  68. for {
  69. conn, err := listener.AcceptTCP()
  70. log.Infof("Received incoming connection! %v", conn)
  71. if err != nil {
  72. log.Fatalf("Error accepting TCP connetion: %v", err)
  73. }
  74. pending <- conn
  75. }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement