KeepAlive enhancement.

If the server doesn't send keepalive for 20 seconds, generate an error.
fix #251, close #255
This commit is contained in:
Tnze
2023-06-25 22:08:13 +08:00
parent d0ef493639
commit 940df0a968
3 changed files with 17 additions and 3 deletions

View File

@ -76,6 +76,8 @@ func (p *Player) handleLoginPacket(packet pk.Packet) error {
if err != nil { if err != nil {
return Error{err} return Error{err}
} }
p.resetKeepAliveDeadline()
return nil return nil
} }

View File

@ -1,15 +1,27 @@
package basic package basic
import ( import (
"time"
"github.com/Tnze/go-mc/data/packetid" "github.com/Tnze/go-mc/data/packetid"
pk "github.com/Tnze/go-mc/net/packet" pk "github.com/Tnze/go-mc/net/packet"
) )
const keepAliveDuration = time.Second * 20
func (p *Player) resetKeepAliveDeadline() {
newDeadline := time.Now().Add(keepAliveDuration)
p.c.Conn.Socket.SetDeadline(newDeadline)
}
func (p *Player) handleKeepAlivePacket(packet pk.Packet) error { func (p *Player) handleKeepAlivePacket(packet pk.Packet) error {
var KeepAliveID pk.Long var KeepAliveID pk.Long
if err := packet.Scan(&KeepAliveID); err != nil { if err := packet.Scan(&KeepAliveID); err != nil {
return Error{err} return Error{err}
} }
p.resetKeepAliveDeadline()
// Response // Response
err := p.c.Conn.WritePacket(pk.Packet{ err := p.c.Conn.WritePacket(pk.Packet{
ID: int32(packetid.ServerboundKeepAlive), ID: int32(packetid.ServerboundKeepAlive),

View File

@ -44,14 +44,14 @@ func NewClient() *Client {
// Conn is a concurrently-safe warpper of net.Conn with packet queue. // Conn is a concurrently-safe warpper of net.Conn with packet queue.
// Note that not all methods are concurrently-safe. // Note that not all methods are concurrently-safe.
type Conn struct { type Conn struct {
conn *net.Conn *net.Conn
send, recv queue.Queue[pk.Packet] send, recv queue.Queue[pk.Packet]
rerr error rerr error
} }
func warpConn(c *net.Conn) *Conn { func warpConn(c *net.Conn) *Conn {
wc := Conn{ wc := Conn{
conn: c, Conn: c,
send: make(queue.ChannelQueue[pk.Packet], 256), send: make(queue.ChannelQueue[pk.Packet], 256),
recv: make(queue.ChannelQueue[pk.Packet], 256), recv: make(queue.ChannelQueue[pk.Packet], 256),
rerr: nil, rerr: nil,
@ -104,7 +104,7 @@ func (c *Conn) WritePacket(p pk.Packet) error {
func (c *Conn) Close() error { func (c *Conn) Close() error {
c.send.Close() c.send.Close()
return c.conn.Close() return c.Conn.Close()
} }
// Position is a 3D vector. // Position is a 3D vector.