I was working on a client and server that sends 1 byte packets to each other, when I run both on the same machine it works perfectly. But when I run the server and client on separate machines the server returns EOF as an error on the server side.
Here’s the client code
package main
import (
"errors"
"fmt"
"net"
"os"
"os/signal"
"strings"
)
func main() {
//option := 0
//input := ""
if len(os.Args) != 3 {
os.Exit(1)
}
buffer := make([]byte, 1)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
fmt.Printf("nBye Bye~n")
os.Exit(0)
}()
server1 := "nsl2.cau.ac.kr:41672"
server2 := "nsl5.cau.ac.kr:61672"
conn, _ := net.Dial("tcp", server1)
filename := strings.Split(os.Args[2], ".")[0]
//localAddr := conn.LocalAddr().(*net.TCPAddr)
option := os.Args[1]
var err error
var i int64
if option == "put" {
if _, err := os.Stat(filename + ".txt"); errors.Is(err, os.ErrNotExist) {
fmt.Println("File Does not exist!")
//conn.Write([]byte{0x18})
os.Exit(1)
}
file, _ := os.OpenFile(os.Args[2], os.O_RDWR, 0644)
stat, _ := file.Stat()
size := stat.Size()
fmt.Println(size)
conn.Write([]byte("put"))
conn.Write([]byte(filename))
for i = 0; i < size; i++ {
file.ReadAt(buffer, i)
if i%2 == 0 {
conn.Write(buffer)
fmt.Printf("--%xn", buffer)
}
}
conn.Write([]byte{0x04})
conn.Close()
file.Close()
conn, _ = net.Dial("tcp", server2)
//localAddr = conn.LocalAddr().(*net.TCPAddr)
file, _ = os.OpenFile(os.Args[2], os.O_RDWR, 0644)
//stat, _ = file.Stat()
//size = stat.Size()
conn.Write([]byte("put"))
conn.Write([]byte(filename))
for i = 0; i < size; i++ {
_, err = file.ReadAt(buffer, i)
if i%2 == 1 {
conn.Write(buffer)
fmt.Printf("%xn", buffer)
}
if size%2 == 0 && i == size-1 {
conn.Write([]byte{0x04})
} else if size%2 == 1 && i == size-2 {
conn.Write([]byte{0x04})
break
}
}
conn.Write([]byte{0x04})
conn.Close()
} else if option == "get" {
newfile, _ := os.OpenFile(filename+"-merged.txt", os.O_RDWR|os.O_CREATE, 0644)
//conn, _ = net.Dial("tcp", server1)
conn.Write([]byte("get"))
conn.Write([]byte(filename))
var i int = 0
for {
_, err = conn.Read(buffer)
if buffer[0] == 0x18 {
fmt.Println("File does not exist!")
os.Remove(newfile.Name())
os.Exit(1)
}
if buffer[0] == 0x04 {
break
}
if err != nil {
os.Exit(1)
}
newfile.WriteAt(buffer, int64(i))
i += 2
//fmt.Printf("%xn", buffer[0])
}
conn.Close()
conn, _ = net.Dial("tcp", server2)
conn.Write([]byte("get"))
conn.Write([]byte(filename))
i = 1
for {
_, err = conn.Read(buffer)
if buffer[0] == 0x18 {
fmt.Println("File does not exist!")
os.Remove(newfile.Name())
os.Exit(1)
}
if buffer[0] == 0x04 {
break
}
if err != nil {
os.Exit(1)
}
newfile.WriteAt(buffer, int64(i))
i += 2
//fmt.Printf("%xn", buffer[0])
}
}
conn.Close()
}
and the server code
package main
import (
"errors"
"fmt"
"net"
"os"
"os/signal"
"regexp"
"strings"
)
func main() {
//req_count := 0
//t0 := time.Now()
if len(os.Args) != 2 {
os.Exit(1)
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
fmt.Printf("nBye Bye~n")
os.Exit(0)
}()
serverPort := os.Args[1]
listener, _ := net.Listen("tcp4", ":"+serverPort)
//fmt.Printf("Server is ready to receive on port %sn", serverPort)
//buffer := make([]byte, 1024)
buffer := make([]byte, 1)
opbuff := make([]byte, 3)
fnamebuff := make([]byte, 1024)
for {
conn, _ := listener.Accept()
fmt.Printf("Connection requested from %sn", conn.RemoteAddr().String())
var err error
//var count int
_, err = conn.Read(opbuff)
count, _ := conn.Read(fnamebuff)
filename := string(fnamebuff[:count])
reg, err := regexp.Compile("[^a-zA-Z0-9]+")
filename = reg.ReplaceAllString(filename, "")
var number string
option := strings.TrimSpace(string(opbuff[:]))
fmt.Println(option)
if os.Args[1] == "41672" {
number = "1"
} else {
number = "2"
}
if option == "put" {
if _, err := os.Stat(filename + "-part" + number + ".txt"); err == nil {
continue
}
file, _ := os.OpenFile(filename+"-part"+number+".txt", os.O_RDWR|os.O_CREATE, 0644)
for {
_, err = conn.Read(buffer)
//fmt.Printf("%xn", buffer)
if buffer[0] == 0x04 {
break
}
if err != nil {
fmt.Println("Connection with client lost!" + err.Error())
os.Remove(file.Name())
os.Exit(1)
break
}
//fmt.Printf("%xn", buffer[0])
file.Write(buffer)
}
} else if option == "get" {
if _, err := os.Stat(filename + "-part" + number + ".txt"); errors.Is(err, os.ErrNotExist) {
fmt.Println("File Does not exist!")
conn.Write([]byte{0x18})
os.Exit(1)
} //file, _ := os.OpenFile("tests"+os.Args[1], os.O_RDWR|os.O_CREATE, 0644)
file, _ := os.OpenFile(filename+"-part"+number+".txt", os.O_RDWR, 0644)
stat, _ := file.Stat()
size := stat.Size()
var i int64
for i = 0; i < size; i++ {
_, err = file.ReadAt(buffer, i)
if err != nil {
fmt.Println("Connection with client lost!")
os.Exit(1)
break
}
//fmt.Printf("%xn", buffer[0])
conn.Write(buffer)
}
conn.Write([]byte{0x04})
}
conn.Close()
fmt.Println("Waiting for next command")
}
}
I assumed it had to do with the file I was trying to send byte by byte, but after confirming that the client was not in fact just reading EOF from the file I’m left stumped on what to try from here.