first ipc implementation

This commit is contained in:
uan
2025-08-22 17:42:01 +02:00
parent a6d2c9dfad
commit 240e862d6c
8 changed files with 145 additions and 0 deletions

6
miniws/go.work Normal file
View File

@@ -0,0 +1,6 @@
go 1.24.5
use (
.
./sockets
)

7
miniws/sockets/buffer.go Normal file
View File

@@ -0,0 +1,7 @@
package sockets
type buffer []byte
func (b *buffer) Zero() {
*b = make(buffer, len(*b))
}

47
miniws/sockets/client.go Normal file
View File

@@ -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!")
}

3
miniws/sockets/go.mod Normal file
View File

@@ -0,0 +1,3 @@
module sockets
go 1.24.5

6
miniws/sockets/go.work Normal file
View File

@@ -0,0 +1,6 @@
go 1.24.5
use (
.
./logplus
)

View File

@@ -0,0 +1,3 @@
module logplus
go 1.22.2

View File

@@ -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)
}
}

58
miniws/sockets/server.go Normal file
View File

@@ -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)
}
}