main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "bufio"
  4. "encoding/hex"
  5. "fmt"
  6. "github.com/songgao/packets/ethernet"
  7. "github.com/songgao/water"
  8. "log"
  9. "net"
  10. "os"
  11. "os/exec"
  12. "strings"
  13. "time"
  14. )
  15. var (
  16. self = net.ParseIP(os.Args[2])
  17. mask = net.IPv4Mask(255, 255, 255, 0)
  18. )
  19. var ifce, _ = water.New(water.Config{
  20. DeviceType: water.TAP,
  21. })
  22. var RCV_B = 0
  23. var TXT_B = 0
  24. func main() {
  25. //for stat only
  26. go func() {
  27. for {
  28. log.Println("Total reciving: ", RCV_B, ", Total transmitting: ", TXT_B)
  29. time.Sleep(5 * time.Second)
  30. }
  31. }()
  32. //create http server
  33. go func() {
  34. fmt.Println("Launching server...")
  35. // listen on all interfaces
  36. ln, _ := net.Listen("tcp", ":8081")
  37. // accept connection on port
  38. conn, _ := ln.Accept()
  39. // run loop forever (or until ctrl-c)
  40. for {
  41. // will listen for message to process ending in newline (\n)
  42. message, _ := bufio.NewReader(conn).ReadString('\n')
  43. // output message received
  44. //fmt.Print("RECV<<", string(message))
  45. RCV_B += len(string(message))
  46. data, err := hex.DecodeString(strings.ReplaceAll("\n", "", string(message)))
  47. if err != nil {
  48. //log.Println(err)
  49. }
  50. //log.Println("RECV<<", data)
  51. ifce.Write(data)
  52. }
  53. }()
  54. //declare server
  55. // connect to server
  56. conns, _ := net.Dial("tcp", os.Args[1]+":8081")
  57. var frame ethernet.Frame
  58. setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
  59. for {
  60. frame.Resize(1500)
  61. n, err := ifce.Read([]byte(frame))
  62. if err != nil {
  63. log.Fatal(err)
  64. }
  65. frame = frame[:n]
  66. //log.Println("TRSV>>", hex.EncodeToString(frame))
  67. TXT_B += len(hex.EncodeToString(frame))
  68. /*
  69. log.Printf("Dst: %s\n", frame.Destination())
  70. log.Printf("Src: %s\n", frame.Source())
  71. log.Printf("Ethertype: % x\n", frame.Ethertype())
  72. log.Printf("Payload: % x\n", frame.Payload())
  73. log.Printf("HEX: % x\n", frame)
  74. */
  75. fmt.Fprintf(conns, hex.EncodeToString(frame)+"\n")
  76. /*
  77. a := hex.EncodeToString(frame)
  78. resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
  79. if err != nil {
  80. fmt.Println(err)
  81. } else {
  82. defer resp.Body.Close()
  83. }
  84. */
  85. }
  86. }
  87. func setupIfce(ipNet net.IPNet, dev string) {
  88. sargs := fmt.Sprintf("interface ip set address name=REPLACE_ME source=static addr=REPLACE_ME mask=REPLACE_ME gateway=none")
  89. args := strings.Split(sargs, " ")
  90. args[4] = fmt.Sprintf("name=%s", dev)
  91. args[6] = fmt.Sprintf("addr=%s", ipNet.IP)
  92. args[7] = fmt.Sprintf("mask=%d.%d.%d.%d", ipNet.Mask[0], ipNet.Mask[1], ipNet.Mask[2], ipNet.Mask[3])
  93. cmd := exec.Command("netsh", args...)
  94. if err := cmd.Run(); err != nil {
  95. log.Println(err)
  96. }
  97. }