-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.go
More file actions
114 lines (92 loc) · 2.04 KB
/
server.go
File metadata and controls
114 lines (92 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package main
import (
"bytes"
"encoding/binary"
"fmt"
"net"
"os"
)
const (
CONN_HOST = "localhost"
FILE_PORT = "8080"
LATENCY_PORT = "8081"
FILE_ADDR = CONN_HOST + ":" + FILE_PORT
LATENCY_ADDR = CONN_HOST + ":" + LATENCY_PORT
MAX_PACKET_SIZE = 1400
HEADER_SIZE = 8
)
func main() {
go listenForFileTransfer()
latency_conn, err := net.ListenPacket("udp", LATENCY_ADDR)
if err != nil {
fmt.Println("Error: ", err)
os.Exit(1)
}
defer latency_conn.Close()
buffer := make([]byte, MAX_PACKET_SIZE)
for {
n, addr, err := latency_conn.ReadFrom(buffer)
if err != nil {
if err.Error() != "EOF" {
fmt.Println("Error: ", err)
}
break
}
message := string(buffer[:n])
// check if message is a request for latency
if len(message) >= 4 && message[:4] == "lmb:" {
// reply back
_, err = latency_conn.WriteTo([]byte("lme"), addr)
}
}
}
func listenForFileTransfer() {
latency_conn, err := net.ListenPacket("udp", FILE_ADDR)
if err != nil {
fmt.Println("Error: ", err)
os.Exit(1)
}
defer latency_conn.Close()
receivedPackets := make(map[uint64][]byte)
buffer := make([]byte, MAX_PACKET_SIZE)
for {
n, _, err := latency_conn.ReadFrom(buffer)
if err != nil {
if err.Error() != "EOF" {
fmt.Println("Error: ", err)
}
break
}
// process file packet
sequenceNumber := bytesToInt(buffer[:HEADER_SIZE])
data := buffer[HEADER_SIZE:n]
receivedPackets[sequenceNumber] = data
if len(receivedPackets) == 1 {
go writeFile(receivedPackets)
}
}
}
func writeFile(receivedPackets map[uint64][]byte) {
file, err := os.Create("server_storage/01 - Angel Attack.mkv")
if err != nil {
fmt.Println("Error: ", err)
os.Exit(1)
}
defer file.Close()
sequenceNumber := uint64(0)
for {
if data, ok := receivedPackets[sequenceNumber]; ok {
file.Write(data)
delete(receivedPackets, sequenceNumber)
sequenceNumber++
} else {
break
}
}
}
func bytesToInt(b []byte) uint64 {
buf := bytes.NewBuffer(b)
var n uint64
binary.Read(buf, binary.BigEndian, &n)
return n
}