|
@@ -4,60 +4,65 @@ import (
|
|
|
"bufio"
|
|
|
"encoding/hex"
|
|
|
"fmt"
|
|
|
- "github.com/songgao/packets/ethernet"
|
|
|
- "github.com/songgao/water"
|
|
|
"log"
|
|
|
"net"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
"strings"
|
|
|
"time"
|
|
|
+
|
|
|
+ "github.com/songgao/packets/ethernet"
|
|
|
+ "github.com/songgao/water"
|
|
|
)
|
|
|
|
|
|
+//declare IP and subnet mask here
|
|
|
var (
|
|
|
self = net.ParseIP(os.Args[2])
|
|
|
mask = net.IPv4Mask(255, 255, 255, 0)
|
|
|
)
|
|
|
+
|
|
|
+//declare new interface here
|
|
|
var ifce, _ = water.New(water.Config{
|
|
|
DeviceType: water.TAP,
|
|
|
})
|
|
|
|
|
|
-var RCV_B = 0
|
|
|
-var TXT_B = 0
|
|
|
-var RCV_T = 0
|
|
|
-var TXT_T = 0
|
|
|
+var RCV_B = 0 //recived in byte
|
|
|
+var TXT_B = 0 //sent in byte
|
|
|
+var RCV_T = 0 //number of packet recived
|
|
|
+var TXT_T = 0 //number of packet sended
|
|
|
|
|
|
func main() {
|
|
|
//for stat only
|
|
|
go func() {
|
|
|
for {
|
|
|
+ //showing statistics here, every 5 seconds
|
|
|
log.Println("Total recived: ", ByteCountSI(RCV_B), ", Total transmited: ", ByteCountSI(TXT_B))
|
|
|
log.Println("Total recived: ", RCV_T, ", Total transmited: ", TXT_T)
|
|
|
time.Sleep(5 * time.Second)
|
|
|
}
|
|
|
}()
|
|
|
|
|
|
- //create http server
|
|
|
+ //create socket server
|
|
|
go func() {
|
|
|
- fmt.Println("Launching server...")
|
|
|
+ fmt.Println("Launching server...") //show debug message
|
|
|
// listen on all interfaces
|
|
|
- ln, _ := net.Listen("tcp", ":8081")
|
|
|
+ ln, _ := net.Listen("tcp", ":8081") //create new interface
|
|
|
// accept connection on port
|
|
|
- conn, _ := ln.Accept()
|
|
|
+ conn, _ := ln.Accept() //accept connections
|
|
|
// run loop forever (or until ctrl-c)
|
|
|
for {
|
|
|
// will listen for message to process ending in newline (\n)
|
|
|
message, _ := bufio.NewReader(conn).ReadString('\n')
|
|
|
// output message received
|
|
|
//fmt.Print("RECV<<", string(message))
|
|
|
- RCV_B += len(string(message))
|
|
|
- RCV_T++
|
|
|
- data, err := hex.DecodeString(strings.ReplaceAll("\n", "", string(message)))
|
|
|
+ RCV_B += len(string(message)) //for statistics
|
|
|
+ RCV_T++ //for statistics
|
|
|
+ data, err := hex.DecodeString(strings.ReplaceAll("\n", "", string(message))) //since data had \n, so replace it and convert to hex array
|
|
|
if err != nil {
|
|
|
//log.Println(err)
|
|
|
}
|
|
|
//log.Println("RECV<<", data)
|
|
|
- ifce.Write(data)
|
|
|
+ ifce.Write(data) //write to interface
|
|
|
}
|
|
|
}()
|
|
|
|
|
@@ -65,19 +70,19 @@ func main() {
|
|
|
// connect to server
|
|
|
conns, _ := net.Dial("tcp", os.Args[1]+":8081")
|
|
|
|
|
|
- var frame ethernet.Frame
|
|
|
- setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
|
|
|
+ var frame ethernet.Frame //declare frame
|
|
|
+ setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name()) //setup interface info
|
|
|
|
|
|
for {
|
|
|
- frame.Resize(1500)
|
|
|
- n, err := ifce.Read([]byte(frame))
|
|
|
+ frame.Resize(1500) //MTU = 1500
|
|
|
+ n, err := ifce.Read([]byte(frame)) //read from ifce
|
|
|
if err != nil {
|
|
|
log.Fatal(err)
|
|
|
}
|
|
|
- frame = frame[:n]
|
|
|
+ frame = frame[:n] //fconvert frame to usabele array
|
|
|
//log.Println("TRSV>>", hex.EncodeToString(frame))
|
|
|
- TXT_B += len(hex.EncodeToString(frame))
|
|
|
- TXT_T++
|
|
|
+ TXT_B += len(hex.EncodeToString(frame)) //for statistics
|
|
|
+ TXT_T++ //for statistics
|
|
|
/*
|
|
|
log.Printf("Dst: %s\n", frame.Destination())
|
|
|
log.Printf("Src: %s\n", frame.Source())
|
|
@@ -85,7 +90,7 @@ func main() {
|
|
|
log.Printf("Payload: % x\n", frame.Payload())
|
|
|
log.Printf("HEX: % x\n", frame)
|
|
|
*/
|
|
|
- fmt.Fprintf(conns, hex.EncodeToString(frame)+"\n")
|
|
|
+ fmt.Fprintf(conns, hex.EncodeToString(frame)+"\n") //send to server
|
|
|
/*
|
|
|
a := hex.EncodeToString(frame)
|
|
|
|