LastMUD/internal/server/server.go
2025-06-19 16:22:55 +03:00

86 lines
1.2 KiB
Go

package server
import (
"fmt"
"net"
"time"
)
type Server struct {
listener *net.TCPListener
connections []*Connection
stopChannel chan struct{}
}
func CreateServer(port string) (srv *Server, err error) {
addr, err := net.ResolveTCPAddr("tcp", port)
if err != nil {
fmt.Println(err)
return nil, err
}
ln, err := net.ListenTCP("tcp", addr)
if err != nil {
fmt.Println(err)
return nil, err
}
fmt.Println("Listening on port", port)
srv = &Server{
listener: ln,
connections: []*Connection{},
stopChannel: make(chan struct{}),
}
return
}
func (srv *Server) Listen() {
// Wait for 200 millis for a new connection, and loop if none found in that time
srv.listener.SetDeadline(time.Now().Add(1 * time.Second))
for {
if srv.shouldStop() {
break
}
conn, err := srv.listener.Accept()
if err != nil {
continue
}
c := CreateConnection(conn)
srv.connections = append(srv.connections, c)
go c.listen()
}
for _, v := range srv.connections {
v.Close()
}
err := srv.listener.Close()
if err != nil {
fmt.Println(err)
}
}
func (srv *Server) shouldStop() bool {
select {
case <-srv.stopChannel:
return true
default:
return false
}
}
func (srv *Server) Stop() {
srv.stopChannel <- struct{}{}
}