104 lines
2.1 KiB
Go
104 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
//"encoding/base64"
|
|
"encoding/binary"
|
|
"fmt"
|
|
//"net"
|
|
|
|
//"strings"
|
|
"time"
|
|
|
|
"github.com/google/gopacket"
|
|
"github.com/google/gopacket/pcap"
|
|
|
|
"client/utils"
|
|
)
|
|
|
|
type SaprusHeaderPacket struct {
|
|
Type uint16
|
|
Length uint16
|
|
}
|
|
|
|
type SaprusFileTransfer struct {
|
|
Header SaprusHeaderPacket
|
|
Flag uint8
|
|
Sequence uint16
|
|
Checksum uint16
|
|
Payload []byte
|
|
}
|
|
|
|
func errCheck(err error) {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func createSaprusFileTransferPacket(payload []byte) SaprusFileTransfer {
|
|
var packet SaprusFileTransfer
|
|
|
|
packet.Header.Type = binary.BigEndian.Uint16([]byte{payload[0], payload[1]})
|
|
packet.Header.Length = binary.BigEndian.Uint16([]byte{payload[2], payload[3]})
|
|
|
|
packet.Flag = uint8(payload[4])
|
|
packet.Sequence = binary.BigEndian.Uint16([]byte{payload[5], payload[6]})
|
|
packet.Checksum = binary.BigEndian.Uint16([]byte{payload[7], payload[8]})
|
|
|
|
for i := uint16(0); i < packet.Header.Length - 5; i++ {
|
|
packet.Payload = append(packet.Payload, payload[i+9])
|
|
}
|
|
|
|
return packet
|
|
}
|
|
|
|
func listenDiscoverResponse(addrChan chan string, readyFlag chan int) {
|
|
finalMessage := ""
|
|
var pkt_data SaprusFileTransfer
|
|
handle, err := pcap.OpenLive("any", int32(1600), true, pcap.BlockForever)
|
|
errCheck(err)
|
|
|
|
err = handle.SetBPFFilter("udp and port 6767")
|
|
errCheck(err)
|
|
|
|
packets := gopacket.NewPacketSource(handle, handle.LinkType()).Packets()
|
|
|
|
readyFlag <- 1
|
|
|
|
for pkt := range packets {
|
|
pkt_data = createSaprusFileTransferPacket(pkt.ApplicationLayer().Payload())
|
|
finalMessage += string(pkt_data.Payload)
|
|
if pkt_data.Flag == 2 {
|
|
addrChan <- finalMessage
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
sendAddrs := []string{"255.255.255.255"}
|
|
|
|
addrChan := make(chan string)
|
|
readyFlag := make(chan int)
|
|
|
|
go listenDiscoverResponse(addrChan, readyFlag)
|
|
|
|
// Wait for device to listen
|
|
<- readyFlag
|
|
|
|
for i := 0; i < len(sendAddrs); i++ {
|
|
c := utils.SocketCall{}
|
|
|
|
c.SendData("hello")
|
|
}
|
|
|
|
// Listen timeout
|
|
select {
|
|
case returnMSG := <- addrChan:
|
|
fmt.Printf("%s\n", returnMSG)
|
|
case <- time.After(60 * time.Second):
|
|
fmt.Printf("error\n")
|
|
}
|
|
}
|