243 lines
4.4 KiB
Go
243 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
)
|
|
|
|
const PacketSize = 504
|
|
|
|
// type packet struct {
|
|
// syn uint32
|
|
// // Flag
|
|
// len uint32
|
|
// data []byte
|
|
// }
|
|
|
|
// func (packet packet) ToBytes() []byte {
|
|
// arr := make([]byte, 4+4+len(packet.data))
|
|
// binary.LittleEndian.PutUint32(arr[0:4], packet.syn)
|
|
// binary.LittleEndian.PutUint32(arr[4:8], packet.len)
|
|
// for i := 0; i < len(packet.data); i++ {
|
|
// arr[8+i] = packet.data[i]
|
|
// }
|
|
// return arr
|
|
// }
|
|
|
|
// func makePacketFrombytes(bytes []byte) packet {
|
|
// syn := binary.LittleEndian.Uint32(bytes[0:4])
|
|
// len := binary.LittleEndian.Uint32(bytes[4:8])
|
|
// data := bytes[8:(8 + len)]
|
|
// return packet{syn: syn, len: len, data: data}
|
|
// }
|
|
|
|
// func check(e error) {
|
|
// if e != nil {
|
|
// panic(e)
|
|
// }
|
|
// }
|
|
|
|
// func sendFile(conn *net.UDPConn, addr *net.UDPAddr) {
|
|
// dat, err := os.ReadFile("testFile")
|
|
// check(err)
|
|
|
|
// offset := 0
|
|
// syn := 0
|
|
|
|
// for {
|
|
// fmt.Printf("Sending Syn %v to addr %v\n", syn, addr.IP.String())
|
|
// remaining := PacketSize
|
|
// if offset+PacketSize > len(dat) {
|
|
// remaining = len(dat) - offset
|
|
// }
|
|
|
|
// pck := packet{
|
|
// data: dat[offset : offset+remaining],
|
|
// len: uint32(remaining),
|
|
// syn: uint32(syn),
|
|
// }
|
|
|
|
// conn.WriteToUDP(pck.ToBytes(), addr)
|
|
|
|
// syn += 1
|
|
// offset = offset + remaining
|
|
|
|
// if offset >= len(dat) {
|
|
// break
|
|
// }
|
|
// }
|
|
|
|
// endPacket := packet{
|
|
// len: 0,
|
|
// syn: uint32(syn),
|
|
// }
|
|
|
|
// conn.WriteToUDP(endPacket.ToBytes(), addr)
|
|
// }
|
|
|
|
// func checkFileTest() {
|
|
// dat, err := os.ReadFile("testFile")
|
|
// check(err)
|
|
|
|
// offset := 0
|
|
// syn := 0
|
|
|
|
// for {
|
|
// remaining := PacketSize
|
|
// if offset+PacketSize > len(dat) {
|
|
// remaining = len(dat) - offset
|
|
// }
|
|
|
|
// pck := packet{
|
|
// data: dat[offset : offset+remaining],
|
|
// len: uint32(remaining),
|
|
// syn: uint32(syn),
|
|
// }
|
|
|
|
// str := hex.EncodeToString(pck.ToBytes())
|
|
// fmt.Println(pck)
|
|
// fmt.Println(str)
|
|
|
|
// // conn.WriteToUDP(pck.ToBytes(), addr)
|
|
|
|
// offset = offset + remaining
|
|
// syn += 1
|
|
|
|
// if offset >= len(dat) {
|
|
// break
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// func resend(conn *net.UDPConn, addr *net.UDPAddr, syn uint32) {
|
|
// dat, err := os.ReadFile("testFile")
|
|
// check(err)
|
|
|
|
// index := int((syn + 1) * PacketSize)
|
|
// remaining := PacketSize
|
|
// if index+PacketSize > len(dat) {
|
|
// remaining = len(dat) - index
|
|
// }
|
|
|
|
// pck := packet{
|
|
// data: dat[index : index+remaining],
|
|
// syn: syn,
|
|
// len: uint32(remaining),
|
|
// }
|
|
|
|
// conn.WriteToUDP(pck.ToBytes(), addr)
|
|
// }
|
|
|
|
// func server() {
|
|
// udpAddr, err := net.ResolveUDPAddr("udp", "0.0.0.0:13374")
|
|
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// os.Exit(1)
|
|
// }
|
|
|
|
// conn, err := net.ListenUDP("udp", udpAddr)
|
|
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// os.Exit(1)
|
|
// }
|
|
|
|
// for {
|
|
// var buf [PacketSize]byte
|
|
// _, addr, err := conn.ReadFromUDP(buf[0:])
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// return
|
|
// }
|
|
|
|
// pck := makePacketFrombytes(buf[0:])
|
|
|
|
// if pck.len == 0 {
|
|
// sendFile(conn, addr)
|
|
// } else {
|
|
// resend(conn, addr, pck.syn)
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// func client() {
|
|
// // Resolve the string address to a UDP address
|
|
// udpAddr, err := net.ResolveUDPAddr("udp", "0.0.0.0:13374")
|
|
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// os.Exit(1)
|
|
// }
|
|
|
|
// // Dial to the address with UDP
|
|
// conn, err := net.DialUDP("udp", nil, udpAddr)
|
|
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// os.Exit(1)
|
|
// }
|
|
|
|
// initPacket := packet{
|
|
// syn: 0,
|
|
// len: 0,
|
|
// }
|
|
|
|
// // Send a message to the server
|
|
// _, err = conn.Write(initPacket.ToBytes())
|
|
// fmt.Println("send...")
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// os.Exit(1)
|
|
// }
|
|
|
|
// bytes := make([]byte, 512)
|
|
// var syns []int
|
|
// var endSyn uint32 = 0
|
|
|
|
// for {
|
|
// _, _, err := conn.ReadFrom(bytes)
|
|
// check(err)
|
|
|
|
// pck := makePacketFrombytes(bytes)
|
|
|
|
// // if pck.syn != currSyn {
|
|
// // fmt.Println("Out of Sync")
|
|
// // r.PushFront(currSyn)
|
|
// // }
|
|
|
|
// syns = append(syns, int(pck.syn))
|
|
// fmt.Println(pck)
|
|
|
|
// // currSyn += 1
|
|
|
|
// if pck.len == 0 {
|
|
// endSyn = pck.syn
|
|
// break
|
|
// }
|
|
// }
|
|
|
|
// sort.Ints(syns)
|
|
// if len(syns) != int(endSyn+1) {
|
|
|
|
// }
|
|
|
|
// for i := 0; i < int(endSyn); i++ {
|
|
// if i < len(syns) {
|
|
// if syns[i] != i {
|
|
// fmt.Printf("Out of Sync on Packet %v\n", i)
|
|
// }
|
|
// } else {
|
|
// fmt.Printf("Out of Sync on Packet %v\n", i)
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
func main() {
|
|
if os.Args[1] == "server" {
|
|
server := New()
|
|
server.Serve()
|
|
} else {
|
|
GetFile(os.Args[2])
|
|
}
|
|
}
|