Fixed several Bugs and added Bitmap for LostPackets
This commit is contained in:
@@ -7,8 +7,9 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/kelindar/bitmap"
|
||||
)
|
||||
|
||||
func SendPacket(pck *common.Packet, key [32]byte, conn *net.UDPConn) {
|
||||
@@ -19,7 +20,7 @@ func SendPacket(pck *common.Packet, key [32]byte, conn *net.UDPConn) {
|
||||
}
|
||||
|
||||
func ReceivePacket(key [32]byte, conn *net.UDPConn) common.Packet {
|
||||
bytes := make([]byte, common.PacketSize+common.SecureHeaderSize)
|
||||
bytes := make([]byte, common.PacketSize)
|
||||
_, _, err := conn.ReadFrom(bytes)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@@ -29,6 +30,7 @@ func ReceivePacket(key [32]byte, conn *net.UDPConn) common.Packet {
|
||||
pck, err := secPck.ExtractPacket(key)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(bytes)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@@ -114,9 +116,10 @@ func GetFile(path string) {
|
||||
ackPck := common.NewAck(&pck)
|
||||
SendPacket(ackPck, key, conn)
|
||||
|
||||
recvPackets := make([]uint32, 0)
|
||||
var endPacket common.Packet
|
||||
|
||||
var recvPackets bitmap.Bitmap
|
||||
|
||||
for {
|
||||
pck := ReceivePacket(key, conn)
|
||||
if pck.Flag == common.End {
|
||||
@@ -128,10 +131,9 @@ func GetFile(path string) {
|
||||
continue
|
||||
}
|
||||
|
||||
recvPackets = append(recvPackets, pck.Sync)
|
||||
recvPackets.Set(pck.Sync)
|
||||
|
||||
offset := (int64(pck.Sync) - int64(ackPck.Sync+1)) * (common.PacketSize - int64(common.HeaderSize))
|
||||
// fmt.Printf("Sync: %v, Offset: %v\n", pck.Sync, offset)
|
||||
offset := (int64(pck.Sync) - int64(ackPck.Sync+1)) * int64(common.MaxDataSize)
|
||||
|
||||
_, err = file.WriteAt(pck.Data, offset)
|
||||
if err != nil {
|
||||
@@ -139,20 +141,24 @@ func GetFile(path string) {
|
||||
}
|
||||
}
|
||||
|
||||
sort.Slice(recvPackets, func(i, j int) bool {
|
||||
pckI := recvPackets[i]
|
||||
pckJ := recvPackets[j]
|
||||
return pckI < pckJ
|
||||
})
|
||||
|
||||
lostPackets := make([]uint32, 0)
|
||||
|
||||
for i := ackPck.Sync + 1; i < endPacket.Sync; i++ {
|
||||
if b, _ := contains(recvPackets, i); !b {
|
||||
lostPackets = append(lostPackets, i)
|
||||
}
|
||||
var reverse bitmap.Bitmap
|
||||
reverse.Grow(endPacket.Sync)
|
||||
reverse.Ones()
|
||||
|
||||
for i := 0; i <= int(ackPck.Sync); i++ {
|
||||
recvPackets.Set(uint32(i))
|
||||
}
|
||||
|
||||
recvPackets.Xor(reverse)
|
||||
|
||||
recvPackets.Range(func(x uint32) {
|
||||
if x < endPacket.Sync {
|
||||
lostPackets = append(lostPackets, x)
|
||||
}
|
||||
})
|
||||
|
||||
for _, i := range lostPackets {
|
||||
fmt.Println(i)
|
||||
}
|
||||
@@ -177,7 +183,7 @@ func GetFile(path string) {
|
||||
continue
|
||||
}
|
||||
|
||||
offset := (int64(pck.Sync) - int64(ackPck.Sync+1)) * (common.PacketSize - int64(common.HeaderSize))
|
||||
offset := (int64(pck.Sync) - int64(ackPck.Sync+1)) * int64(common.MaxDataSize)
|
||||
// fmt.Printf("Sync: %v, Offset: %v\n", pck.sync, offset)
|
||||
|
||||
_, err = file.WriteAt(pck.Data, offset)
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
module client
|
||||
|
||||
go 1.21.1
|
||||
go 1.21.1
|
||||
|
||||
require github.com/kelindar/bitmap v1.5.2
|
||||
|
||||
require (
|
||||
github.com/kelindar/simd v1.1.2 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e // indirect
|
||||
)
|
||||
|
||||
8
internal/client/go.sum
Normal file
8
internal/client/go.sum
Normal file
@@ -0,0 +1,8 @@
|
||||
github.com/kelindar/bitmap v1.5.2 h1:XwX7CTvJtetQZ64zrOkApoZZHBJRkjE23NfqUALA/HE=
|
||||
github.com/kelindar/bitmap v1.5.2/go.mod h1:j3qZjxH9s4OtvsnFTP2bmPkjqil9Y2xQlxPYHexasEA=
|
||||
github.com/kelindar/simd v1.1.2 h1:KduKb+M9cMY2HIH8S/cdJyD+5n5EGgq+Aeeleos55To=
|
||||
github.com/kelindar/simd v1.1.2/go.mod h1:inq4DFudC7W8L5fhxoeZflLRNpWSs0GNx6MlWFvuvr0=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e h1:CsOuNlbOuf0mzxJIefr6Q4uAUetRUwZE4qt7VfzP+xo=
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
Reference in New Issue
Block a user