Skip to content

Commit

Permalink
Merge pull request #2 from LinuxSuRen/support-resend
Browse files Browse the repository at this point in the history
Support order insensitive of the sender or receiver
  • Loading branch information
LinuxSuRen authored Sep 1, 2022
2 parents fe42e1b + eb07ec3 commit 2b25187
Show file tree
Hide file tree
Showing 7 changed files with 520 additions and 315 deletions.
8 changes: 5 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ module github.com/linuxsuren/transfer

go 1.19

require (
github.com/spf13/cobra v1.5.0
github.com/stretchr/testify v1.8.0
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/cobra v1.5.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.4.0 // indirect
github.com/stretchr/testify v1.8.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
2 changes: 1 addition & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJ
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Expand Down
130 changes: 130 additions & 0 deletions header.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package main

import (
"fmt"
"net"
"os"
"path"
"runtime"
"strconv"
"strings"
)

type dataHeader struct {
length int // 20 bit
filename string // 100 bit
chrunk int // 10 bit
count int // 10 bit
index int // 10 bit
data []byte

remote *net.UDPAddr
}

func readHeader(conn *net.UDPConn) (header dataHeader, err error) {
message := make([]byte, 65507)
var rlen int
rlen, header.remote, err = conn.ReadFromUDP(message[:])
if err == nil {
if rlen <= 150 {
err = fmt.Errorf("invalid header format")
return
}

if header.length, err = strconv.Atoi(strings.TrimSpace(string(message[:20]))); err != nil {
return
}
header.filename = strings.TrimSpace(string(message[20:120]))
if header.chrunk, err = strconv.Atoi(strings.TrimSpace(string(message[120:130]))); err != nil {
return
}
if header.count, err = strconv.Atoi(strings.TrimSpace(string(message[130:140]))); err != nil {
return
}
if header.index, err = strconv.Atoi(strings.TrimSpace(string(message[140:150]))); err != nil {
return
}

header.data = message[150:rlen]
}
return
}

type headerBuilder struct {
file string

filename string
fileSize int64
chunk int
bufferCount int
}

// NewHeaderBuilder creates an instance of the headerBuilder
func NewHeaderBuilder(file string) *headerBuilder {
return &headerBuilder{
file: file,
}
}

func (h *headerBuilder) Build() (err error) {
var fi os.FileInfo
if fi, err = os.Stat(h.file); err != nil {
return
}

h.fileSize = fi.Size()
h.filename = path.Base(fi.Name())

switch runtime.GOOS {
case "darwin":
h.chunk = 500 // default value on darwin is 9216
default:
h.chunk = 60000
}

var (
index int
i, j int64
)
for i = 0; i < h.fileSize; index++ {
j = i + int64(h.chunk)
if j > h.fileSize {
j = h.fileSize
}
h.bufferCount = h.bufferCount + 1
i = j
}
return
}

// CreateHeader creates the header with index
func (h *headerBuilder) CreateHeader(index int, data []byte) []byte {
// length,filename,count,index
header := fmt.Sprintf("%s%s%s%s%s",
fillContainerWithNumber(int(h.GetFileSize()), 20),
fillContainer(h.GetFilename(), 100),
fillContainerWithNumber(h.GetChunk(), 10),
fillContainerWithNumber(h.GetBufferCount(), 10),
fillContainerWithNumber(index, 10))
return append([]byte(header), data...)
}

// GetChunk returns the chunk size
func (h *headerBuilder) GetChunk() int {
return h.chunk
}

// GetBufferCount returns the buffer count
func (h *headerBuilder) GetBufferCount() int {
return h.bufferCount
}

// GetFileSize returns the file size
func (h *headerBuilder) GetFileSize() int64 {
return h.fileSize
}

// GetFilename returns the file name
func (h *headerBuilder) GetFilename() string {
return h.filename
}
23 changes: 23 additions & 0 deletions header_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package main

import (
"github.com/stretchr/testify/assert"
"os"
"path"
"testing"
)

func TestHeaderBuilder(t *testing.T) {
file := path.Join(os.TempDir(), "fake")
err := os.WriteFile(file, []byte("hello"), 0600)
assert.Nil(t, err)
defer func() {
_ = os.RemoveAll(file)
}()

builder := NewHeaderBuilder(file)
assert.Nil(t, builder.Build())

data := builder.CreateHeader(1, []byte("hello"))
assert.Equal(t, []byte(" 5 fake 60000 1 1hello"), data)
}
Loading

0 comments on commit 2b25187

Please sign in to comment.