Multi-client server, protocol versioning, streaming decompression fixes
This commit is contained in:
+24
-11
@@ -1,6 +1,7 @@
|
||||
#include "transport_tcp.h"
|
||||
#include "log.h"
|
||||
#include <arpa/inet.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -48,6 +49,7 @@ Server *server_create(int port) {
|
||||
|
||||
void server_delete(Server **server) {
|
||||
if (server == NULL || *server == NULL) return;
|
||||
close((*server)->file_descriptor);
|
||||
free(*server);
|
||||
*server = NULL;
|
||||
}
|
||||
@@ -55,22 +57,33 @@ void server_delete(Server **server) {
|
||||
void server_listen(Server *server, void (*handler)(int file_descriptor)) {
|
||||
log_message(LOG_LEVEL_INFO, "Start Listening on Port: %d",
|
||||
server->address.sin_port);
|
||||
if (listen(server->file_descriptor, 3) < 0) {
|
||||
if (listen(server->file_descriptor, SOMAXCONN) < 0) {
|
||||
perror("Could not listen on port!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int file_descriptor =
|
||||
accept(server->file_descriptor, (struct sockaddr *)&server->address,
|
||||
&server->address_length);
|
||||
if (file_descriptor < 0) {
|
||||
perror("Could not accept the connection");
|
||||
exit(EXIT_FAILURE);
|
||||
signal(SIGCHLD, SIG_IGN);
|
||||
|
||||
while (1) {
|
||||
struct sockaddr_in client_addr;
|
||||
socklen_t client_len = sizeof(client_addr);
|
||||
int file_descriptor =
|
||||
accept(server->file_descriptor, (struct sockaddr *)&client_addr,
|
||||
&client_len);
|
||||
if (file_descriptor < 0) {
|
||||
perror("Could not accept the connection");
|
||||
continue;
|
||||
}
|
||||
log_message(LOG_LEVEL_INFO, "Received Connection");
|
||||
pid_t pid = fork();
|
||||
if (pid == 0) {
|
||||
close(server->file_descriptor);
|
||||
handler(file_descriptor);
|
||||
close(file_descriptor);
|
||||
_exit(0);
|
||||
}
|
||||
close(file_descriptor);
|
||||
}
|
||||
log_message(LOG_LEVEL_INFO, "Received Connection");
|
||||
handler(file_descriptor);
|
||||
close(server->file_descriptor);
|
||||
close(file_descriptor);
|
||||
}
|
||||
|
||||
Client *client_create() {
|
||||
|
||||
Reference in New Issue
Block a user