reuse IDs on reconnect
parent
917a63625b
commit
1928f0a531
|
@ -338587,10 +338587,16 @@ static void enet_init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct peer_node_t {
|
||||||
|
int64_t id;
|
||||||
|
struct peer_node_t *next;
|
||||||
|
};
|
||||||
|
|
||||||
static ENetHost *Server;
|
static ENetHost *Server;
|
||||||
static map(ENetPeer *, int64_t) clients;
|
static map(ENetPeer *, int64_t) clients;
|
||||||
static map(int64_t, ENetPeer *) peers;
|
static map(int64_t, ENetPeer *) peers;
|
||||||
static int64_t next_client_id = 1; // assumes ID 0 is server
|
static int64_t next_client_id = 1; // assumes ID 0 is server
|
||||||
|
static struct peer_node_t *next_free_id = NULL;
|
||||||
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
||||||
|
|
||||||
bool server_bind(int max_clients, int port) {
|
bool server_bind(int max_clients, int port) {
|
||||||
|
@ -338612,6 +338618,14 @@ void server_drop_client(int64_t handle) {
|
||||||
|
|
||||||
static
|
static
|
||||||
void server_drop_client_peer(ENetPeer *peer) {
|
void server_drop_client_peer(ENetPeer *peer) {
|
||||||
|
struct peer_node_t *node = C_CAST(struct peer_node_t *, CALLOC(sizeof(struct peer_node_t), 1));
|
||||||
|
node->id = *(int64_t *)map_find(clients, peer);
|
||||||
|
if (!next_free_id) {
|
||||||
|
next_free_id = node;
|
||||||
|
} else {
|
||||||
|
node->next = next_free_id;
|
||||||
|
next_free_id = node;
|
||||||
|
}
|
||||||
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
||||||
map_erase(clients, peer);
|
map_erase(clients, peer);
|
||||||
}
|
}
|
||||||
|
@ -338894,13 +338908,22 @@ char** server_poll(unsigned timeout_ms) {
|
||||||
event.peer->data = STRDUP(ip); /* TEMP */
|
event.peer->data = STRDUP(ip); /* TEMP */
|
||||||
|
|
||||||
/* ensure we have free slot for client */
|
/* ensure we have free slot for client */
|
||||||
if (map_count(clients) >= network_get(NETWORK_CAPACITY)) {
|
if (map_count(clients) >= network_get(NETWORK_CAPACITY)-1) {
|
||||||
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
||||||
enet_peer_disconnect_now(event.peer, 1);
|
enet_peer_disconnect_now(event.peer, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t client_id = next_client_id++;
|
int64_t client_id = -1;
|
||||||
|
|
||||||
|
if (next_free_id) {
|
||||||
|
struct peer_node_t *node = next_free_id;
|
||||||
|
client_id = next_free_id->id;
|
||||||
|
next_free_id = next_free_id->next;
|
||||||
|
FREE(node);
|
||||||
|
}
|
||||||
|
else client_id = next_client_id++;
|
||||||
|
|
||||||
map_find_or_add(clients, event.peer, client_id);
|
map_find_or_add(clients, event.peer, client_id);
|
||||||
map_find_or_add(peers, client_id, event.peer);
|
map_find_or_add(peers, client_id, event.peer);
|
||||||
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
||||||
|
|
|
@ -125,10 +125,16 @@ static void enet_init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct peer_node_t {
|
||||||
|
int64_t id;
|
||||||
|
struct peer_node_t *next;
|
||||||
|
};
|
||||||
|
|
||||||
static ENetHost *Server;
|
static ENetHost *Server;
|
||||||
static map(ENetPeer *, int64_t) clients;
|
static map(ENetPeer *, int64_t) clients;
|
||||||
static map(int64_t, ENetPeer *) peers;
|
static map(int64_t, ENetPeer *) peers;
|
||||||
static int64_t next_client_id = 1; // assumes ID 0 is server
|
static int64_t next_client_id = 1; // assumes ID 0 is server
|
||||||
|
static struct peer_node_t *next_free_id = NULL;
|
||||||
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
||||||
|
|
||||||
bool server_bind(int max_clients, int port) {
|
bool server_bind(int max_clients, int port) {
|
||||||
|
@ -150,6 +156,14 @@ void server_drop_client(int64_t handle) {
|
||||||
|
|
||||||
static
|
static
|
||||||
void server_drop_client_peer(ENetPeer *peer) {
|
void server_drop_client_peer(ENetPeer *peer) {
|
||||||
|
struct peer_node_t *node = C_CAST(struct peer_node_t *, CALLOC(sizeof(struct peer_node_t), 1));
|
||||||
|
node->id = *(int64_t *)map_find(clients, peer);
|
||||||
|
if (!next_free_id) {
|
||||||
|
next_free_id = node;
|
||||||
|
} else {
|
||||||
|
node->next = next_free_id;
|
||||||
|
next_free_id = node;
|
||||||
|
}
|
||||||
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
||||||
map_erase(clients, peer);
|
map_erase(clients, peer);
|
||||||
}
|
}
|
||||||
|
@ -432,13 +446,22 @@ char** server_poll(unsigned timeout_ms) {
|
||||||
event.peer->data = STRDUP(ip); /* TEMP */
|
event.peer->data = STRDUP(ip); /* TEMP */
|
||||||
|
|
||||||
/* ensure we have free slot for client */
|
/* ensure we have free slot for client */
|
||||||
if (map_count(clients) >= network_get(NETWORK_CAPACITY)) {
|
if (map_count(clients) >= network_get(NETWORK_CAPACITY)-1) {
|
||||||
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
||||||
enet_peer_disconnect_now(event.peer, 1);
|
enet_peer_disconnect_now(event.peer, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t client_id = next_client_id++;
|
int64_t client_id = -1;
|
||||||
|
|
||||||
|
if (next_free_id) {
|
||||||
|
struct peer_node_t *node = next_free_id;
|
||||||
|
client_id = next_free_id->id;
|
||||||
|
next_free_id = next_free_id->next;
|
||||||
|
FREE(node);
|
||||||
|
}
|
||||||
|
else client_id = next_client_id++;
|
||||||
|
|
||||||
map_find_or_add(clients, event.peer, client_id);
|
map_find_or_add(clients, event.peer, client_id);
|
||||||
map_find_or_add(peers, client_id, event.peer);
|
map_find_or_add(peers, client_id, event.peer);
|
||||||
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
||||||
|
|
27
engine/v4k.c
27
engine/v4k.c
|
@ -9602,10 +9602,16 @@ static void enet_init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct peer_node_t {
|
||||||
|
int64_t id;
|
||||||
|
struct peer_node_t *next;
|
||||||
|
};
|
||||||
|
|
||||||
static ENetHost *Server;
|
static ENetHost *Server;
|
||||||
static map(ENetPeer *, int64_t) clients;
|
static map(ENetPeer *, int64_t) clients;
|
||||||
static map(int64_t, ENetPeer *) peers;
|
static map(int64_t, ENetPeer *) peers;
|
||||||
static int64_t next_client_id = 1; // assumes ID 0 is server
|
static int64_t next_client_id = 1; // assumes ID 0 is server
|
||||||
|
static struct peer_node_t *next_free_id = NULL;
|
||||||
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
enum { MSG_INIT, MSG_BUF, MSG_RPC, MSG_RPC_RESP };
|
||||||
|
|
||||||
bool server_bind(int max_clients, int port) {
|
bool server_bind(int max_clients, int port) {
|
||||||
|
@ -9627,6 +9633,14 @@ void server_drop_client(int64_t handle) {
|
||||||
|
|
||||||
static
|
static
|
||||||
void server_drop_client_peer(ENetPeer *peer) {
|
void server_drop_client_peer(ENetPeer *peer) {
|
||||||
|
struct peer_node_t *node = C_CAST(struct peer_node_t *, CALLOC(sizeof(struct peer_node_t), 1));
|
||||||
|
node->id = *(int64_t *)map_find(clients, peer);
|
||||||
|
if (!next_free_id) {
|
||||||
|
next_free_id = node;
|
||||||
|
} else {
|
||||||
|
node->next = next_free_id;
|
||||||
|
next_free_id = node;
|
||||||
|
}
|
||||||
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
map_erase(peers, *(int64_t *)map_find(clients, peer));
|
||||||
map_erase(clients, peer);
|
map_erase(clients, peer);
|
||||||
}
|
}
|
||||||
|
@ -9909,13 +9923,22 @@ char** server_poll(unsigned timeout_ms) {
|
||||||
event.peer->data = STRDUP(ip); /* TEMP */
|
event.peer->data = STRDUP(ip); /* TEMP */
|
||||||
|
|
||||||
/* ensure we have free slot for client */
|
/* ensure we have free slot for client */
|
||||||
if (map_count(clients) >= network_get(NETWORK_CAPACITY)) {
|
if (map_count(clients) >= network_get(NETWORK_CAPACITY)-1) {
|
||||||
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
msg = stringf("%d %s", 1, va("%s", "Server is at maximum capacity, disconnecting the peer (::%s:%u)...", ip, event.peer->address.port));
|
||||||
enet_peer_disconnect_now(event.peer, 1);
|
enet_peer_disconnect_now(event.peer, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t client_id = next_client_id++;
|
int64_t client_id = -1;
|
||||||
|
|
||||||
|
if (next_free_id) {
|
||||||
|
struct peer_node_t *node = next_free_id;
|
||||||
|
client_id = next_free_id->id;
|
||||||
|
next_free_id = next_free_id->next;
|
||||||
|
FREE(node);
|
||||||
|
}
|
||||||
|
else client_id = next_client_id++;
|
||||||
|
|
||||||
map_find_or_add(clients, event.peer, client_id);
|
map_find_or_add(clients, event.peer, client_id);
|
||||||
map_find_or_add(peers, client_id, event.peer);
|
map_find_or_add(peers, client_id, event.peer);
|
||||||
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
network_put(NETWORK_COUNT, network_get(NETWORK_COUNT)+1);
|
||||||
|
|
|
@ -596,7 +596,7 @@ details > summary::-webkit-details-marker {
|
||||||
|Version: | 2023.7 |
|
|Version: | 2023.7 |
|
||||||
|:--------------|:------------|
|
|:--------------|:------------|
|
||||||
|Branch: | main |
|
|Branch: | main |
|
||||||
|Commit: | 57 |
|
|Commit: | 58 |
|
||||||
<!--| Documentation last modified | { {LAST_MODIFIED} } |-->
|
<!--| Documentation last modified | { {LAST_MODIFIED} } |-->
|
||||||
|
|
||||||
# [V·4·K 2023.7 ](https://dev.v4.games/zaklaus/v4k)
|
# [V·4·K 2023.7 ](https://dev.v4.games/zaklaus/v4k)
|
||||||
|
|
Loading…
Reference in New Issue