diff options
| author | Kyren223 <ulmliad223@gmail.com> | 2024-10-05 15:27:40 +0300 |
|---|---|---|
| committer | Kyren223 <ulmliad223@gmail.com> | 2024-10-05 15:27:40 +0300 |
| commit | b987605cfbbb5ca7b3b4bda0b5a5fdb34c53c8dd (patch) | |
| tree | 1057eedd0bf8d4f1b63ef86bca0c1d72d89664b9 /internal/server | |
| parent | 0929041a9ccce566411e9a36713cb4125d72a1ed (diff) | |
feat: basic server connection handling
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/handler.go | 32 | ||||
| -rw-r--r-- | internal/server/server.go | 79 |
2 files changed, 111 insertions, 0 deletions
diff --git a/internal/server/handler.go b/internal/server/handler.go new file mode 100644 index 0000000..68a7cd2 --- /dev/null +++ b/internal/server/handler.go @@ -0,0 +1,32 @@ +package server + +import ( + "net" + "sync" + + "github.com/kyren223/eko/internal/utils/log" +) + +func handleClient(conn net.Conn, wg *sync.WaitGroup) { + log.Info("Handling client... %v", conn.RemoteAddr().String()) + defer log.Info("Disconnecting client: %v", conn.RemoteAddr().String()) + defer conn.Close() + defer wg.Done() + + var request []byte + n, err := conn.Read(request) + if err != nil { + log.Error("Failed reading: %v", err) + return + } + log.Info("Read %v bytes: %v", n, string(request)) + + response := []byte("Server response") + n, err = conn.Write(response) + if err != nil { + log.Error("Failed writing response: %v", err) + return + } + log.Info("Responded successfully") +} + diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 0000000..c49df15 --- /dev/null +++ b/internal/server/server.go @@ -0,0 +1,79 @@ +package server + +import ( + "net" + "os" + "os/signal" + "strconv" + "sync" + "syscall" + + "github.com/kyren223/eko/internal/utils/log" +) + +const PORT int = 7223 + +func Start() { + server, err := NewServer(6969) + if err != nil { + log.Error("Unable to start server: %v", err) + return + } + + var wg sync.WaitGroup + stopChan := make(chan os.Signal, 1) + signal.Notify(stopChan, syscall.SIGINT, syscall.SIGTERM) + wg.Add(1) + go handleInterrupt(server, stopChan, &wg) + + server.Listen() + wg.Wait() +} + +func handleInterrupt(server *Server, stopChan <-chan os.Signal, wg *sync.WaitGroup) { + defer wg.Done() + <-stopChan + log.Info("Interrupt Occurred") + log.Info("Shutting down server...") + server.Close() + log.Info("Waiting for all connections to close") + server.Wait() + log.Info("Server has been shutdown") +} + +type Server struct { + listener net.Listener + wg sync.WaitGroup +} + +func NewServer(port int) (*Server, error) { + listener, err := net.Listen("tcp", ":"+strconv.Itoa(port)) + if err != nil { + return nil, err + } + + log.Info("Created server on port %v", port) + return &Server{listener, sync.WaitGroup{}}, nil +} + +func (s *Server) Listen() { + log.Info("Server started listening... %v", s.listener.Addr().String()) + for { + conn, err := s.listener.Accept() + if err != nil { + break + } + s.wg.Add(1) + go handleClient(conn, &s.wg) + } +} + +// Stop stops the server. The blocked Listen call will be unlocked +func (s *Server) Close() { + s.listener.Close() +} + +// Wait blocks until all active connections to the server are done +func (s *Server) Wait() { + s.wg.Wait() +} |
