diff --git a/miniws/go.work b/miniws/go.work new file mode 100644 index 0000000..a757c90 --- /dev/null +++ b/miniws/go.work @@ -0,0 +1,6 @@ +go 1.24.5 + +use ( + . + ./sockets +) \ No newline at end of file diff --git a/miniws/sockets/buffer.go b/miniws/sockets/buffer.go new file mode 100644 index 0000000..f1b89f9 --- /dev/null +++ b/miniws/sockets/buffer.go @@ -0,0 +1,7 @@ +package sockets + +type buffer []byte + +func (b *buffer) Zero() { + *b = make(buffer, len(*b)) +} diff --git a/miniws/sockets/client.go b/miniws/sockets/client.go new file mode 100644 index 0000000..6a76859 --- /dev/null +++ b/miniws/sockets/client.go @@ -0,0 +1,47 @@ +package sockets + +import ( + "bufio" + "log" + "logplus" + "net" + "os" +) + +type Client struct{} + +func (c *Client) Start(network, address string) { + conn, err := net.Dial(network, address) + logplus.LogIfErrorFatal(err) + defer conn.Close() + + buffer := make(buffer, 1<<12) + scanner := bufio.NewScanner(os.Stdin) + for { + buffer.Zero() + scanner.Scan() + logplus.LogIfErrorFatal(scanner.Err()) + buffer = []byte(scanner.Text()) + _, err := conn.Write(buffer) + logplus.LogIfErrorFatal(err) + } +} + +func (c *Client) OneShotWrite(network, address string, content []byte) { + conn, err := net.Dial(network, address) + logplus.LogIfErrorFatal(err) + defer conn.Close() + + //will recieve a byte + buffer := make(buffer, 1) + + _, err = conn.Write(content) + logplus.LogIfErrorFatal(err) + _, err = conn.Read(buffer) + logplus.LogIfErrorFatal(err) + if buffer[0] == byte(0) { + log.Println("Signal", string(content), "doesn't exist!") + return + } + log.Println("Signal", string(content), "sent!") +} diff --git a/miniws/sockets/go.mod b/miniws/sockets/go.mod new file mode 100644 index 0000000..41bc991 --- /dev/null +++ b/miniws/sockets/go.mod @@ -0,0 +1,3 @@ +module sockets + +go 1.24.5 diff --git a/miniws/sockets/go.work b/miniws/sockets/go.work new file mode 100644 index 0000000..6d430c2 --- /dev/null +++ b/miniws/sockets/go.work @@ -0,0 +1,6 @@ +go 1.24.5 + +use ( + . + ./logplus +) \ No newline at end of file diff --git a/miniws/sockets/logplus/go.mod b/miniws/sockets/logplus/go.mod new file mode 100644 index 0000000..6fa60a9 --- /dev/null +++ b/miniws/sockets/logplus/go.mod @@ -0,0 +1,3 @@ +module logplus + +go 1.22.2 diff --git a/miniws/sockets/logplus/logplus.go b/miniws/sockets/logplus/logplus.go new file mode 100644 index 0000000..797d527 --- /dev/null +++ b/miniws/sockets/logplus/logplus.go @@ -0,0 +1,15 @@ +package logplus + +import "log" + +func LogIfError(err error) { + if err != nil { + log.Println(err) + } +} + +func LogIfErrorFatal(err error) { + if err != nil { + log.Fatalln(err) + } +} diff --git a/miniws/sockets/server.go b/miniws/sockets/server.go new file mode 100644 index 0000000..653467d --- /dev/null +++ b/miniws/sockets/server.go @@ -0,0 +1,58 @@ +package sockets + +import ( + "io" + "logplus" + "net" + "os" + "os/signal" + "strings" + "syscall" +) + +type Server struct{} + +func (s *Server) Start(RecvBind func(string, []string) byte, network, address string) int { + socket, err := net.Listen(network, address) + logplus.LogIfErrorFatal(err) + + //Cleanup the socket file + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + os.Remove(address) + os.Exit(1) + }() + + for { //Infinite loop + + //Accept connection + conn, err := socket.Accept() + logplus.LogIfErrorFatal(err) + + //Handle the connection + //in a separate goroutine + go func(conn net.Conn) { + defer conn.Close() + //Create a buffer (slice) + //for incoming data + buffer := make(buffer, 1<<12) + + for { + //Read data + _, err := conn.Read(buffer) + if err == io.EOF { + conn.Close() + break + } + logplus.LogIfErrorFatal(err) + fullstring := string(buffer) + arguments := strings.Split(fullstring, " ") + ret := RecvBind(arguments[0], arguments[1:]) + conn.Write([]byte{ret}) + buffer.Zero() + } + }(conn) + } +}