diff --git a/include/neuron/connection/neu_connection.h b/include/neuron/connection/neu_connection.h index cce6b69b..cbdc1950 100644 --- a/include/neuron/connection/neu_connection.h +++ b/include/neuron/connection/neu_connection.h @@ -43,6 +43,9 @@ typedef enum neu_conn_tty_baud { NEU_CONN_TTY_BAUD_1800, NEU_CONN_TTY_BAUD_1200, NEU_CONN_TTY_BAUD_600, + NEU_CONN_TTY_BAUD_300, + NEU_CONN_TTY_BAUD_200, + NEU_CONN_TTY_BAUD_150, } neu_conn_tty_baud_e; typedef enum neu_conn_tty_parity { diff --git a/src/connection/connection.c b/src/connection/connection.c index cec4cd90..ca098f97 100644 --- a/src/connection/connection.c +++ b/src/connection/connection.c @@ -69,6 +69,8 @@ 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 int conn_tcp_server_replace_client(neu_conn_t *conn, int fd, + struct sockaddr_in client); static void conn_tcp_server_listen(neu_conn_t *conn); static void conn_tcp_server_stop(neu_conn_t *conn); @@ -180,16 +182,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 +191,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_replace_client(conn, fd, client); + 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); @@ -740,6 +748,18 @@ static void conn_connect(neu_conn_t *conn) cfsetospeed(&tty_opt, B600); cfsetispeed(&tty_opt, B600); break; + case NEU_CONN_TTY_BAUD_300: + cfsetospeed(&tty_opt, B300); + cfsetispeed(&tty_opt, B300); + break; + case NEU_CONN_TTY_BAUD_200: + cfsetospeed(&tty_opt, B200); + cfsetispeed(&tty_opt, B200); + break; + case NEU_CONN_TTY_BAUD_150: + cfsetospeed(&tty_opt, B150); + cfsetispeed(&tty_opt, B150); + break; } switch (conn->param.params.tty_client.parity) { @@ -879,6 +899,25 @@ static void conn_tcp_server_del_client(neu_conn_t *conn, int fd) } } +static int conn_tcp_server_replace_client(neu_conn_t *conn, int fd, + struct sockaddr_in client) +{ + for (int i = 0; i < conn->param.params.tcp_server.max_link; i++) { + if (conn->tcp_server.clients[i].fd > 0) { + int 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; + conn->tcp_server.clients[i].client = client; + return ret; + } + } + + return 0; +} + int neu_conn_stream_consume(neu_conn_t *conn, void *context, neu_conn_stream_consume_fn fn) {