Guest User

Untitled

a guest
Jan 24th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "encoding/hex"
  6. "flag"
  7. "fmt"
  8. "io"
  9. "log"
  10. "net"
  11. )
  12.  
  13. var localAddr *string = flag.String("l", "localhost:9999", "local address")
  14. var remoteAddr *string = flag.String("r", "localhost:80", "remote address")
  15.  
  16. func proxyConn(conn *net.TCPConn) {
  17. rAddr, err := net.ResolveTCPAddr("tcp", *remoteAddr)
  18. if err != nil {
  19. panic(err)
  20. }
  21.  
  22. rConn, err := net.DialTCP("tcp", nil, rAddr)
  23. if err != nil {
  24. panic(err)
  25. }
  26. defer rConn.Close()
  27.  
  28. buf := &bytes.Buffer{}
  29. for {
  30. data := make([]byte, 256)
  31. n, err := conn.Read(data)
  32. if err != nil {
  33. panic(err)
  34. }
  35. buf.Write(data[:n])
  36. if data[0] == 13 && data[1] == 10 {
  37. break
  38. }
  39. }
  40.  
  41. if _, err := rConn.Write(buf.Bytes()); err != nil {
  42. panic(err)
  43. }
  44. log.Printf("sent:\n%v", hex.Dump(buf.Bytes()))
  45.  
  46. data := make([]byte, 1024)
  47. n, err := rConn.Read(data)
  48. if err != nil {
  49. if err != io.EOF {
  50. panic(err)
  51. } else {
  52. log.Printf("received err: %v", err)
  53. }
  54. }
  55. log.Printf("received:\n%v", hex.Dump(data[:n]))
  56. }
  57.  
  58. func handleConn(in <-chan *net.TCPConn, out chan<- *net.TCPConn) {
  59. for conn := range in {
  60. proxyConn(conn)
  61. out <- conn
  62. }
  63. }
  64.  
  65. func closeConn(in <-chan *net.TCPConn) {
  66. for conn := range in {
  67. conn.Close()
  68. }
  69. }
  70.  
  71. func main() {
  72. flag.Parse()
  73.  
  74. fmt.Printf("Listening: %v\nProxying: %v\n\n", *localAddr, *remoteAddr)
  75.  
  76. addr, err := net.ResolveTCPAddr("tcp", *localAddr)
  77. if err != nil {
  78. panic(err)
  79. }
  80.  
  81. listener, err := net.ListenTCP("tcp", addr)
  82. if err != nil {
  83. panic(err)
  84. }
  85.  
  86. pending, complete := make(chan *net.TCPConn), make(chan *net.TCPConn)
  87.  
  88. for i := 0; i < 5; i++ {
  89. go handleConn(pending, complete)
  90. }
  91. go closeConn(complete)
  92.  
  93. for {
  94. conn, err := listener.AcceptTCP()
  95. if err != nil {
  96. panic(err)
  97. }
  98. pending <- conn
  99. }
  100. }
Add Comment
Please, Sign In to add comment