From c240a53ca5867ed9c6154862664c0b69d2793dd6 Mon Sep 17 00:00:00 2001 From: Pin Date: Sun, 22 May 2022 16:00:27 -0400 Subject: [PATCH] updated client --- client/client.go | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/client/client.go b/client/client.go index 1419e6c..311edd9 100644 --- a/client/client.go +++ b/client/client.go @@ -1,10 +1,12 @@ package main import ( + "encoding/base64" "encoding/binary" "errors" "fmt" "net" + "strings" "time" "github.com/google/gopacket" @@ -18,16 +20,25 @@ func errCheck(err error) { return } -func listenDiscoverResponse() { +func listenDiscoverResponse(addrChan chan string, readyFlag chan int) { handle, err := pcap.OpenLive("any", int32(1600), true, pcap.BlockForever) errCheck(err) - handle.SetBPFFilter("udp and port 8850") + err = handle.SetBPFFilter("udp and port 8850") + errCheck(err) packets := gopacket.NewPacketSource(handle, handle.LinkType()).Packets() + readyFlag <- 1 + for pkt := range packets { - fmt.Printf("%s\n", pkt.NetworkLayer().NetworkFlow().Src()) + msg, err := base64.StdEncoding.DecodeString(string(pkt.ApplicationLayer().Payload())) + if err == nil { + if strings.Contains(string(msg), "clientapi") { + addrChan <- string(msg) + return + } + } } return @@ -45,7 +56,7 @@ func toMaxHost(n *net.IPNet) (net.IP, error) { return ip, nil } -func bcastAddresses() ([]string) { +func bcastAddresses() []string { var addrs []string = nil interfaceInfo, _ := net.Interfaces() for i := 0; i < len(interfaceInfo); i++ { @@ -68,9 +79,13 @@ func bcastAddresses() ([]string) { func main() { sendAddrs := bcastAddresses() - go listenDiscoverResponse() + addrChan := make(chan string) + readyFlag := make(chan int) - time.Sleep(1 * time.Second) + go listenDiscoverResponse(addrChan, readyFlag) + + // Wait for device to listen + <- readyFlag for i := 0; i < len(sendAddrs); i++ { remoteAddr := sendAddrs[i] + ":8888" @@ -80,9 +95,15 @@ func main() { errCheck(err) defer conn.Close() - _, err = conn.Write([]byte(conn.LocalAddr().String())) + _, err = conn.Write([]byte(conn.LocalAddr().String() + "here")) errCheck(err) } - time.Sleep(30 * time.Second) -} + // Listen timeout + select { + case returnMSG := <- addrChan: + fmt.Printf("Discovery Server: %s\n", strings.Fields(returnMSG)[1]) + case <- time.After(5 * time.Second): + fmt.Printf("Discovery Server not found\n") + } +}