55 lines
1007 B
Go
55 lines
1007 B
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"serveg/internal/log"
|
|
"sync"
|
|
)
|
|
|
|
type Server struct {
|
|
Conf *Config
|
|
logger log.LoggerContext
|
|
listener net.Listener
|
|
wg sync.WaitGroup
|
|
}
|
|
|
|
func NewServer(conf *Config) *Server {
|
|
return &Server{
|
|
Conf: conf,
|
|
logger: log.LoggerContext{Name: "server"},
|
|
}
|
|
}
|
|
|
|
func (srv *Server) StartGoroutine() (err error) {
|
|
srv.logger.Info("listening at ", srv.Conf.Addr)
|
|
srv.listener, err = net.Listen("tcp", srv.Conf.Addr)
|
|
if err == nil {
|
|
srv.wg.Go(srv.serve)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (srv *Server) serve() {
|
|
srv.logger.Info("server started")
|
|
for i := int64(0); ; i++ {
|
|
accepted, err := srv.listener.Accept()
|
|
if err != nil {
|
|
if errors.Is(err, net.ErrClosed) {
|
|
srv.logger.Info("listener socket closed")
|
|
return
|
|
}
|
|
srv.logger.Error(err)
|
|
continue
|
|
}
|
|
conn := NewTcpConnection(srv, accepted.(*net.TCPConn), i)
|
|
go conn.Start()
|
|
}
|
|
}
|
|
|
|
func (srv *Server) Stop() {
|
|
srv.logger.Info("stopping server")
|
|
_ = srv.listener.Close()
|
|
srv.wg.Wait()
|
|
}
|