Send broken close message to clients after 1 second

Aka starting to work on timeouting clients
This commit is contained in:
ChillerDragon 2022-11-12 12:01:38 +01:00
parent 15139ceb68
commit e914ec3fa2
2 changed files with 39 additions and 2 deletions

View file

@ -71,4 +71,22 @@ class GameServer
# we do nothing for now
# TODO: do something
end
def disconnect_client(client, reason = nil)
@server.send_ctrl_close(client, reason)
end
def on_tick
now = Time.now
timeout_ids = []
@server.clients.each do |id, client|
diff = now - client.last_recv_time
timeout_ids.push(id) if diff > 1
end
timeout_ids.each do |id|
disconnect_client(@server.clients[id], 'Timeout')
@server.clients.delete(id)
end
end
end

View file

@ -15,12 +15,20 @@ require_relative 'game_server'
require_relative 'message'
class Client
attr_accessor :id, :addr, :vital_sent
attr_accessor :id, :addr, :vital_sent, :last_recv_time, :token
def initialize(attr = {})
@id = attr[:id]
@addr = attr[:addr]
@vital_sent = 0
@token = attr[:token]
unless @token.size == 4
raise "Invalid client token size\n" \
"got=#{@token.size} expected=4\n" \
"#{str_hex(@token)}"
end
@last_recv_time = Time.now
end
# TODO: use or remove
@ -36,6 +44,8 @@ class Client
end
class TeeworldsServer
attr_accessor :clients
def initialize(options = {})
@verbose = options[:verbose] || false
@ip = '127.0.0.1'
@ -132,6 +142,14 @@ class TeeworldsServer
end
end
def send_ctrl_close(client, reason)
msg = [NET_CTRLMSG_CLOSE]
msg += Packer.pack_str(reason) unless reason.nil?
@netbase.peer_token = client.token
@netbase.send_packet(msg, 0, control: true, addr: client.addr)
# @netbase.peer_token = @server_token
end
def send_ctrl_with_token(addr, token)
msg = [NET_CTRLMSG_TOKEN] + str_bytes(@server_token)
@netbase.peer_token = token
@ -203,7 +221,7 @@ class TeeworldsServer
puts 'server full drop packet. TODO: tell the client'
return
end
client = Client.new(id:, addr: packet.addr)
client = Client.new(id:, addr: packet.addr, token: packet.payload[...4])
@clients[id] = client
@netbase.send_packet([NET_CTRLMSG_ACCEPT], 0, control: true, addr: packet.addr)
end
@ -254,6 +272,7 @@ class TeeworldsServer
@current_game_tick += 1
do_snapshot
end
@game_server.on_tick
end
begin