Guest User

Untitled

a guest
Dec 18th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. "io"
  7. "log"
  8. "net"
  9. "os"
  10. "time"
  11. )
  12.  
  13. func main() {
  14. var localAddrStr *string = flag.String("l", ":7071",
  15. "listen address. ':7971' will listen all ip")
  16. var remoteAddrStr *string = flag.String("r", "localhost:7070", "remote address")
  17. isPrintHelp := flag.Bool("h", false, "show usage info")
  18. flag.Parse()
  19.  
  20. if *isPrintHelp {
  21. fmt.Printf("Usage of %s:\n", os.Args[0])
  22. flag.PrintDefaults()
  23. os.Exit(1)
  24. }
  25.  
  26. localTCPAddr, err := net.ResolveTCPAddr("tcp", *localAddrStr)
  27. if localTCPAddr == nil {
  28. log.Fatalf("net.ResolveTCPAddr failed: %s", err)
  29. }
  30.  
  31. localListerner, err := net.ListenTCP("tcp", localTCPAddr)
  32. if localListerner == nil {
  33. log.Fatalf("portforward: %s", err)
  34. }
  35. log.Printf("forword tcp connections from: '%s', to: '%s'",
  36. *localAddrStr, *remoteAddrStr)
  37.  
  38. for {
  39. conn, err := localListerner.Accept()
  40. if conn == nil {
  41. log.Printf("accept failed: %s", err)
  42. time.Sleep(1)
  43. continue
  44. }
  45. go forward(conn, *remoteAddrStr)
  46. }
  47.  
  48. }
  49.  
  50. func forward(localConn net.Conn, remoteAddrStr string) {
  51. remoteConn, err := net.Dial("tcp", remoteAddrStr)
  52. if remoteConn == nil {
  53. log.Printf("remote dial failed: %s\n", err)
  54. localConn.Close()
  55. return
  56. }
  57. go func() {
  58. defer localConn.Close()
  59. io.Copy(localConn, remoteConn)
  60. }()
  61. go func() {
  62. defer remoteConn.Close()
  63. io.Copy(remoteConn, localConn)
  64. }()
  65. log.Printf("forward %s to %s", localConn.RemoteAddr(), remoteAddrStr)
  66. }
Add Comment
Please, Sign In to add comment