diff options
author | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-09 03:12:35 +0200 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-09 03:12:35 +0200 |
commit | ad0eda138ecaffdc7df0b213d979984e48c5440b (patch) | |
tree | e3d3781ed627f5f37d5716e73ce234a3f666c786 | |
parent | cb2f92cfa288c9d9d0665aff9b235f41196d80c3 (diff) |
server: Fix broke pipe after client close connection
-rw-r--r-- | server.c | 34 | ||||
-rw-r--r-- | server.h | 1 |
2 files changed, 26 insertions, 9 deletions
@@ -62,6 +62,7 @@ server_create(uint32_t port) server_t server; memset(&server, 0, sizeof(server)); server.fd = server_fd; + memset(server.connected_clients, -1, sizeof(int) * MAXEVENTS); server.epoll_fd = epoll_create1(0); if (server.epoll_fd == -1) { @@ -122,17 +123,28 @@ server_start(server_t *server) exit(EXIT_FAILURE); } - server->connected_clients[server->connected_clients_index++] = client_fd; + int j = 0; + while (server->connected_clients[j] != -1 && j < MAXEVENTS) { + j++; + } + log_trace("j = %d, MAXEVENTS = %d", j, MAXEVENTS); + + if (j < MAXEVENTS) { + server->connected_clients[j] = client_fd; + } else { + log_warn("max number of connection has been reached"); + } } else { + int client_fd = sockfd; if (server->events[i].events & EPOLLHUP) { - int i; - for (i = 0; i < server->connected_clients_index; ++i) { - if (server->connected_clients[server->connected_clients_index] == sockfd) - server->connected_clients[server->connected_clients_index] = 1; + for (int j = 0; j < MAXEVENTS; ++j) { + if (server->connected_clients[j] == client_fd) { + server->connected_clients[j] = -1; + break; + } } continue; } - int client_fd = sockfd; char client_buf[BUFFER_SIZE]; memset(client_buf, 0, BUFFER_SIZE); @@ -148,10 +160,16 @@ server_start(server_t *server) exit(EXIT_SUCCESS); } - for (int i = 0; i < server->connected_clients_index; ++i) { + for (int j = 0; j < MAXEVENTS; ++j) { + if (server->connected_clients[j] == -1) { + continue; + } + char message[BUFFER_SIZE]; + memset(message, 0, sizeof(char) * BUFFER_SIZE); + sprintf(message, "client_%d :%s", client_fd, client_buf); - if (send(server->connected_clients[i], message, BUFFER_SIZE, 0) == -1) { + if (send(server->connected_clients[j], message, BUFFER_SIZE, 0) == -1) { log_error("could not send data to client: %s", strerror(errno)); continue; } @@ -29,7 +29,6 @@ typedef struct server { int epoll_fd; struct epoll_event events[MAXEVENTS]; int connected_clients[MAXEVENTS]; - int connected_clients_index; bool running; } server_t; |