From 7548de61c61d32e8bd9abce5846b836bca26f036 Mon Sep 17 00:00:00 2001 From: fengzero Date: Mon, 10 Apr 2023 03:12:12 +0000 Subject: [PATCH] improve(connection): replace old client --- src/connection/connection.c | 48 ++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/connection/connection.c b/src/connection/connection.c index cfd7d092..1b9ad400 100644 --- a/src/connection/connection.c +++ b/src/connection/connection.c @@ -69,6 +69,7 @@ struct neu_conn { static void conn_tcp_server_add_client(neu_conn_t *conn, int fd, struct sockaddr_in client); static void conn_tcp_server_del_client(neu_conn_t *conn, int fd); +static void conn_tcp_server_replace_client(neu_conn_t *conn, int fd); static void conn_tcp_server_listen(neu_conn_t *conn); static void conn_tcp_server_stop(neu_conn_t *conn); @@ -180,16 +181,6 @@ int neu_conn_tcp_server_accept(neu_conn_t *conn) return -1; } - if (conn->tcp_server.n_client >= conn->param.params.tcp_server.max_link) { - close(fd); - zlog_warn(conn->param.log, "%s:%d accpet max link: %d, reject", - conn->param.params.tcp_server.ip, - conn->param.params.tcp_server.port, - conn->param.params.tcp_server.max_link); - pthread_mutex_unlock(&conn->mtx); - return -1; - } - if (conn->block) { struct timeval tv = { .tv_sec = conn->param.params.tcp_server.timeout / 1000, @@ -199,7 +190,23 @@ int neu_conn_tcp_server_accept(neu_conn_t *conn) setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); } - conn_tcp_server_add_client(conn, fd, client); + if (conn->tcp_server.n_client >= conn->param.params.tcp_server.max_link) { + int free_fd = conn_tcp_server_del_first_client(conn, fd); + if (free_fd > 0) { + zlog_warn(conn->param.log, "replace old client %d with %d", free_fd, + fd); + } else { + close(fd); + zlog_warn(conn->param.log, "%s:%d accpet max link: %d, reject", + conn->param.params.tcp_server.ip, + conn->param.params.tcp_server.port, + conn->param.params.tcp_server.max_link); + pthread_mutex_unlock(&conn->mtx); + return -1; + } + } else { + conn_tcp_server_add_client(conn, fd, client); + } conn->is_connected = true; conn->connected(conn->data, fd); @@ -891,6 +898,25 @@ static void conn_tcp_server_del_client(neu_conn_t *conn, int fd) } } +static void conn_tcp_server_replace_client(neu_conn_t *conn, int fd) +{ + int ret = 0; + + for (int i = 0; i < conn->param.params.tcp_server.max_link; i++) { + if (conn->tcp_server.clients[i].fd > 0) { + ret = conn->tcp_server.clients[i].fd; + + close(conn->tcp_server.clients[i].fd); + conn->tcp_server.clients[i].fd = 0; + + conn->tcp_server.clients[i].fd = fd; + return; + } + } + + return ret; +} + int neu_conn_stream_consume(neu_conn_t *conn, void *context, neu_conn_stream_consume_fn fn) {