aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/server.c b/src/server.c
index 68fec90..632cb28 100644
--- a/src/server.c
+++ b/src/server.c
@@ -5,8 +5,15 @@
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
+#include <signal.h>
#include <unistd.h>
+static int socket_fd;
+
+void closeServer(int dummy) {
+ shutdown(socket_fd, 2);
+}
+
int server_listen(server_t *server) {
/*
**
@@ -27,10 +34,19 @@ int server_listen(server_t *server) {
struct sockaddr_in server_addr = {0};
+ if (signal(SIGINT, closeServer) == SIG_ERR) {
+ printf("Could not set signal handler\n");
+ return -1;
+ }
+
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8000);
+ if (setsockopt(server->listen_fd, SOL_SOCKET, SO_REUSEADDR,1,sizeof(1))) {
+ printf("Could not set SO_REUSEADDR on server socket, continuing\n");
+ }
+
err = bind(server->listen_fd, (struct sockaddr *)&server_addr,
sizeof(server_addr));
if (err == -1) {
@@ -39,6 +55,8 @@ int server_listen(server_t *server) {
return err;
}
+ socket_fd = server->listen_fd;
+
err = listen(server->listen_fd, 100);
if (err == -1) {
perror("listen");