mirror of
https://github.com/renorris/openfsd
synced 2026-04-27 11:17:15 +08:00
individually tick heartbeat for each client
This commit is contained in:
@@ -4,15 +4,12 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/renorris/openfsd/client"
|
"github.com/renorris/openfsd/client"
|
||||||
"github.com/renorris/openfsd/postoffice"
|
|
||||||
"github.com/renorris/openfsd/protocol"
|
|
||||||
"github.com/renorris/openfsd/servercontext"
|
"github.com/renorris/openfsd/servercontext"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"slices"
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type FSDService struct{}
|
type FSDService struct{}
|
||||||
@@ -50,10 +47,6 @@ func (s *FSDService) boot(ctx context.Context, listener *net.TCPListener) error
|
|||||||
// Track each client connection in a wait group
|
// Track each client connection in a wait group
|
||||||
waitGroup := sync.WaitGroup{}
|
waitGroup := sync.WaitGroup{}
|
||||||
|
|
||||||
// Start heartbeat worker
|
|
||||||
waitGroup.Add(1)
|
|
||||||
go s.heartbeatWorker(ctx, &waitGroup)
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
// Handle incoming connections
|
// Handle incoming connections
|
||||||
@@ -120,25 +113,3 @@ func (s *FSDService) resolveAndListen() (listener *net.TCPListener, err error) {
|
|||||||
|
|
||||||
return listener, nil
|
return listener, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *FSDService) heartbeatWorker(ctx context.Context, wg *sync.WaitGroup) {
|
|
||||||
defer wg.Done()
|
|
||||||
|
|
||||||
heartbeatPacket := "#DLSERVER:*:0:0" + protocol.PacketDelimiter
|
|
||||||
|
|
||||||
ticker := time.NewTicker(30 * time.Second)
|
|
||||||
defer ticker.Stop()
|
|
||||||
|
|
||||||
// Send server heartbeat every 30 seconds
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
return
|
|
||||||
case <-ticker.C:
|
|
||||||
servercontext.PostOffice().ForEachRegistered(func(name string, address postoffice.Address) bool {
|
|
||||||
address.SendMail(heartbeatPacket)
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/renorris/openfsd/protocol"
|
"github.com/renorris/openfsd/protocol"
|
||||||
"github.com/renorris/openfsd/servercontext"
|
"github.com/renorris/openfsd/servercontext"
|
||||||
"log"
|
"log"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EventLoop runs the main event loop for a logged in client
|
// EventLoop runs the main event loop for a logged in client
|
||||||
@@ -18,6 +19,11 @@ func (c *FSDClient) EventLoop() error {
|
|||||||
log.Printf("client_disconnected total_clients=%d %s", servercontext.PostOffice().NumRegistered()-1, infoStr)
|
log.Printf("client_disconnected total_clients=%d %s", servercontext.PostOffice().NumRegistered()-1, infoStr)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// Set up heartbeat ticker
|
||||||
|
heartbeatPacket := "#DLSERVER:*:0:0" + protocol.PacketDelimiter
|
||||||
|
heartbeatTicker := time.NewTicker(30 * time.Second)
|
||||||
|
defer heartbeatTicker.Stop()
|
||||||
|
|
||||||
// Post-login FSD client event loop
|
// Post-login FSD client event loop
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@@ -43,6 +49,12 @@ func (c *FSDClient) EventLoop() error {
|
|||||||
// Handle incoming kill signals
|
// Handle incoming kill signals
|
||||||
case killPacket := <-c.kill:
|
case killPacket := <-c.kill:
|
||||||
return c.connection.WritePacketImmediately(killPacket)
|
return c.connection.WritePacketImmediately(killPacket)
|
||||||
|
|
||||||
|
// Listen for heartbeat ticker
|
||||||
|
case <-heartbeatTicker.C:
|
||||||
|
if err := c.connection.WritePacket(heartbeatPacket); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user