Skip to content

Commit b5e77c7

Browse files
committed
Code tweaks and added concurrency and transaction requests
1 parent da111d0 commit b5e77c7

File tree

3 files changed

+137
-55
lines changed

3 files changed

+137
-55
lines changed

Receiver/Receiver_handler.go

Lines changed: 72 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,90 @@ import (
66
"log"
77
"net"
88
"os"
9+
"strings"
10+
"sync"
911
)
1012

11-
func StartReceiverServer(port string) {
12-
listener, err := net.Listen("tcp", ":"+port)
13-
if err != nil {
14-
log.Fatal(err)
15-
}
16-
defer listener.Close()
17-
conn, err := listener.Accept()
18-
if err != nil {
19-
log.Fatal(err)
20-
}
13+
const (
14+
machinename = "testreceiver"
15+
port = ":9080"
16+
network = "tcp"
17+
)
18+
19+
func ExtractDataFromMessage(message string) (string, string) {
20+
tmpMsg := strings.Split(message, ":")
21+
return tmpMsg[0], tmpMsg[1]
22+
}
23+
func receiveFile(conn net.Conn, filename string) {
2124
defer conn.Close()
22-
outfile, err := os.Create("./output")
25+
outfile, err := os.Create(filename)
2326
if err != nil {
24-
log.Fatal(err)
27+
log.Panic("Error creating file", err)
2528
}
2629
defer outfile.Close()
27-
2830
buffer := make([]byte, 1024)
2931
for {
30-
n, err := conn.Read(buffer)
32+
fileChunks, err := conn.Read(buffer)
3133
if err == io.EOF {
3234
break
3335
}
3436
if err != nil {
35-
log.Fatal(err)
37+
log.Panic("Cannot read from connection")
38+
}
39+
outfile.Write(buffer[:fileChunks])
40+
}
41+
fmt.Println("Received file successfully")
42+
}
43+
func handleConnection(conn net.Conn, wg *sync.WaitGroup) {
44+
defer conn.Close()
45+
var response []byte
46+
var responseStr string
47+
buffer := make([]byte, 1024)
48+
senderMsg, err := conn.Read(buffer)
49+
if err != nil {
50+
log.Println("Error reading from connection")
51+
return
52+
}
53+
requestMsg := string(buffer[:senderMsg])
54+
newFilename, senderAlias := ExtractDataFromMessage(requestMsg)
55+
fmt.Println("Do you want to receive file : " + newFilename + ", From: " + senderAlias + " : (Y/N)")
56+
fmt.Println("Response")
57+
fmt.Scanln(&responseStr)
58+
if err != nil {
59+
log.Panic("Cannot read response from user")
60+
}
61+
response = []byte(strings.ToUpper(responseStr))
62+
_, err = conn.Write(response)
63+
if err != nil {
64+
log.Panic("Error writing to connection")
65+
return
66+
}
67+
if responseStr == "N" {
68+
wg.Done()
69+
}
70+
receiveFile(conn, newFilename)
71+
wg.Done()
72+
}
73+
func StartReceiveServer() {
74+
server, err := net.Listen(network, port)
75+
if err != nil {
76+
log.Panic("Cannot start server", err)
77+
return
78+
}
79+
defer server.Close()
80+
fmt.Println("Receiver listening on 9080, CTRL+C to stop server")
81+
var conn net.Conn
82+
var wg sync.WaitGroup
83+
for {
84+
wg.Add(1)
85+
fmt.Println("Waiting for connection...")
86+
conn, err = server.Accept()
87+
if err != nil {
88+
log.Panic("Error accepting connection", err)
89+
continue
3690
}
37-
outfile.Write(buffer[:n])
91+
fmt.Println("----------File transfer----------")
92+
go handleConnection(conn, &wg)
93+
wg.Wait()
3894
}
39-
fmt.Println("File received successfully")
4095
}

Sender/Sender_handler.go

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,76 @@
11
package Sender
22

33
import (
4-
"errors"
4+
"fmt"
55
"io"
66
"log"
77
"net"
88
"os"
99
)
1010

11-
func SendFileToIP(filepath string, receiverIP string) error {
12-
var err error
13-
file, err := os.Open(filepath)
14-
if err != nil {
15-
return errors.New("Error opening file: " + err.Error())
16-
}
11+
const (
12+
machinename = "testsender"
13+
network = "tcp"
14+
)
15+
16+
func sendFile(conn net.Conn, filename string) {
17+
defer conn.Close()
18+
fileBuffer := make([]byte, 1024)
19+
file, err := os.Open(filename)
1720
defer file.Close()
18-
connection, err := net.Dial("tcp", receiverIP)
1921
if err != nil {
20-
return errors.New("Error establishing a connection ")
22+
log.Fatal(err)
2123
}
22-
defer connection.Close()
23-
buffer := make([]byte, 1024)
2424
for {
25-
n, err := file.Read(buffer)
25+
chunks, err := file.Read(fileBuffer)
2626
if err == io.EOF {
2727
break
2828
}
2929
if err != nil {
30-
log.Println("Error reading file: " + err.Error())
31-
os.Exit(1)
30+
log.Fatal(err)
3231
}
33-
_, err = connection.Write(buffer[:n])
32+
_, err = conn.Write(fileBuffer[:chunks])
3433
if err != nil {
35-
return err
34+
log.Fatal(err)
35+
return
3636
}
3737
}
38-
return nil
38+
fmt.Println("Sent successfully to remote")
39+
}
40+
func responseListener(conn net.Conn) (string, net.Conn) {
41+
buffer := make([]byte, 1024)
42+
n, err := conn.Read(buffer)
43+
if err != nil {
44+
log.Println(err.Error())
45+
}
46+
return string(buffer[:n]), conn
47+
}
48+
49+
var requestMessage []byte
50+
51+
func SendToRemoteMachine(filename string, remoteIP string) {
52+
receiverIP := remoteIP + ":9080"
53+
conn, err := net.Dial(network, receiverIP)
54+
if err != nil {
55+
log.Println(err)
56+
}
57+
defer conn.Close()
58+
reqString := filename + ":" + machinename
59+
requestMessage = []byte(reqString)
60+
_, err = conn.Write(requestMessage)
61+
if err != nil {
62+
log.Fatal(err.Error())
63+
}
64+
responseText, establishedConn := responseListener(conn)
65+
switch responseText {
66+
case "Y":
67+
sendFile(establishedConn, filename)
68+
os.Exit(0)
69+
case "N":
70+
fmt.Println("Transfer request denied")
71+
os.Exit(0)
72+
default:
73+
fmt.Println("Invalid response: Switching to default (Stop transfer)")
74+
os.Exit(0)
75+
}
3976
}

main.go

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,21 @@ import (
55
"os"
66
"portage/Receiver"
77
"portage/Sender"
8+
"strings"
89
)
910

10-
const defaultPort = "8756"
11-
1211
func main() {
13-
switch os.Args[1] {
14-
case "-s":
15-
var filepath = os.Args[2]
12+
var modes = strings.ToUpper(os.Args[1])
13+
switch modes {
14+
case "-S":
15+
var file = os.Args[2]
1616
var receiverIP = os.Args[3]
17-
err := Sender.SendFileToIP(filepath, receiverIP)
18-
if err != nil {
19-
fmt.Println(err)
20-
os.Exit(1)
21-
}
22-
fmt.Println("File set successfully")
23-
case "-r":
24-
var customPort = os.Args[2]
25-
if customPort == "" {
26-
fmt.Println("Starting server at port: " + defaultPort)
27-
Receiver.StartReceiverServer(defaultPort)
28-
} else {
29-
fmt.Println("Starting server at port: " + customPort)
30-
Receiver.StartReceiverServer(customPort)
31-
}
32-
case "-h":
17+
Sender.SendToRemoteMachine(file, receiverIP)
18+
case "-R":
19+
Receiver.StartReceiveServer()
20+
default:
21+
fallthrough
22+
case "-H":
3323
fmt.Println("Help Text placeholder")
3424
}
3525
}

0 commit comments

Comments
 (0)