diff --git a/network/Account.gd b/network/Account.gd new file mode 100644 index 0000000..11b3f6e --- /dev/null +++ b/network/Account.gd @@ -0,0 +1,6 @@ +class_name Account + +var password: String + +func _init(pw: String): + password = pw \ No newline at end of file diff --git a/network/client/Login.gd b/network/client/Login.gd index a493627..72cb163 100644 --- a/network/client/Login.gd +++ b/network/client/Login.gd @@ -14,7 +14,7 @@ func send_login(): var buffer := StreamPeerBuffer.new() buffer.put_8(Packet.LOGIN) - buffer.put_data(JSON.stringify(["username", "password"]).to_utf8_buffer()) + buffer.put_data(JSON.stringify(["user1", "password"]).to_utf8_buffer()) %Client.socket.put_packet(buffer.data_array) print("[Client] Connecting...") diff --git a/network/server/Connection.gd b/network/server/Connection.gd new file mode 100644 index 0000000..1943be6 --- /dev/null +++ b/network/server/Connection.gd @@ -0,0 +1,4 @@ +class_name Connection + +var peer: PacketPeerUDP +var last_packet: int \ No newline at end of file diff --git a/network/server/Login.gd b/network/server/Login.gd index 5f68537..dfbbc36 100644 --- a/network/server/Login.gd +++ b/network/server/Login.gd @@ -5,6 +5,11 @@ enum { FAIL = 1, } +var accounts := { + "user1": Account.new("password"), + "user2": Account.new("password"), +} + func _ready(): %Server.set_handler(Packet.LOGIN, self) @@ -19,7 +24,11 @@ func handle_packet(data: PackedByteArray, peer: PacketPeer): var username = login_request[0] var password = login_request[1] - if username != "username" || password != "password": + if !accounts.has(username): + fail_login(peer) + return + + if accounts[username].password != password: fail_login(peer) return @@ -32,4 +41,4 @@ func fail_login(peer: PacketPeer): var buffer := StreamPeerBuffer.new() buffer.put_8(Packet.LOGIN) buffer.put_8(FAIL) - peer.put_packet(buffer.data_array) \ No newline at end of file + peer.put_packet(buffer.data_array) diff --git a/network/server/Ping.gd b/network/server/Ping.gd index f53762c..59183ca 100644 --- a/network/server/Ping.gd +++ b/network/server/Ping.gd @@ -4,12 +4,6 @@ func _ready(): %Server.set_handler(Packet.PING, self) func handle_packet(data: PackedByteArray, peer: PacketPeer): - # var response := PackedByteArray() - # response.resize(2) - # response.encode_u8(0, Packet.PING) - # response.encode_u8(1, data[0]) - # peer.put_packet(response) - var buffer := StreamPeerBuffer.new() buffer.put_8(Packet.PING) diff --git a/network/server/Server.gd b/network/server/Server.gd index f4542ca..2194cc9 100644 --- a/network/server/Server.gd +++ b/network/server/Server.gd @@ -1,11 +1,19 @@ extends NetworkNode +## Port number. @export var port := 4242 + +## Timeout in milliseconds. +@export var timeout := 5000 + +## Maximum number of pending connections. @export var max_pending_connections := 4096 var server := UDPServer.new() var last_statistics := Time.get_ticks_msec() +var clients := {} var packet_count := 0 +var now := 0 func _init(): super._init() @@ -14,16 +22,44 @@ func _init(): func _process(_delta): server.poll() + now = Time.get_ticks_msec() while server.is_connection_available(): var peer: PacketPeerUDP = server.take_connection() + var address := "%s:%d" % [peer.get_packet_ip(), peer.get_packet_port()] + + if !clients.has(address): + var connection = Connection.new() + connection.peer = peer + clients[address] = connection + peer_connected(address) + + clients[address].last_packet = now + + for key in clients: + var client = clients[key] + var peer = client.peer while peer.get_available_packet_count() > 0: var packet = peer.get_packet() handle_packet(packet, peer) + client.last_packet = now packet_count += 1 - if Time.get_ticks_msec() > last_statistics + 1000: - print("[Server] %d packets per second" % packet_count) + if now > last_statistics + 1000: + for address in clients.keys(): + var last_packet_time = clients[address].last_packet + + if now - last_packet_time > timeout: + peer_disconnected(address) + clients.erase(address) + + print("[Server] %d clients | %d packets" % [clients.size(), packet_count]) packet_count = 0 last_statistics = Time.get_ticks_msec() + +func peer_connected(_address: String): + pass + +func peer_disconnected(address: String): + print("TIMEOUT ", address) diff --git a/tools/stresstest/main.go b/tools/stresstest/main.go index 7685946..8493e9c 100644 --- a/tools/stresstest/main.go +++ b/tools/stresstest/main.go @@ -14,7 +14,8 @@ const ( var ( numClients = flag.Int("c", 10, "number of clients") - message = []byte{1} + sleepTime = flag.Duration("s", time.Second, "sleep time for each client") + message = []byte{1, 0} ) func init() { @@ -39,11 +40,13 @@ func udpClient(wg *sync.WaitGroup) { for { _, err := conn.Write(message) + if err != nil { fmt.Println("Error sending message:", err) return } - time.Sleep(50 * time.Millisecond) // Adjust the sleep duration as needed + + time.Sleep(*sleepTime) } }