From aa37c682e84e2734c32016160f37bd91b2d5bd14 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Wed, 1 Mar 2017 16:12:20 +0000 Subject: [PATCH] add reusable server component --- server.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ server.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 server.c create mode 100644 server.h diff --git a/server.c b/server.c new file mode 100644 index 0000000..a71de3d --- /dev/null +++ b/server.c @@ -0,0 +1,46 @@ +#include "server.h" +#include +#include + +int resolve(const char *host, unsigned short port, struct addrinfo** addr) { + struct addrinfo hints = { + .ai_family = AF_UNSPEC, + .ai_socktype = SOCK_STREAM, + .ai_flags = AI_PASSIVE, + }; + char port_buf[8]; + snprintf(port_buf, sizeof port_buf, "%u", port); + return getaddrinfo(host, port_buf, &hints, addr); +} + +int server_waitclient(struct server *server, struct client* client) { + socklen_t clen = sizeof client->addr; + return ((client->fd = accept(server->fd, (void*)&client->addr, &clen)) == -1)*-1; +} + +int server_setup(struct server *server, const char* listenip, unsigned short port) { + struct addrinfo *ainfo = 0; + if(resolve(listenip, port, &ainfo)) return -1; + struct addrinfo* p; + int listenfd; + for(p = ainfo; p; p = p->ai_next) { + if((listenfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) + continue; + int yes = 1; + setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); + if(bind(listenfd, p->ai_addr, p->ai_addrlen) < 0) { + close(listenfd); + listenfd = -1; + continue; + } + break; + } + if(listenfd < 0) return -2; + freeaddrinfo(ainfo); + if(listen(listenfd, SOMAXCONN) < 0) { + close(listenfd); + return -3; + } + server->fd = listenfd; + return 0; +} diff --git a/server.h b/server.h new file mode 100644 index 0000000..477052c --- /dev/null +++ b/server.h @@ -0,0 +1,28 @@ +#ifndef SERVER_H +#define SERVER_H + +#include +#include + +//RcB: DEP "server.c" + +union sockaddr_union { + struct sockaddr_in v4; + struct sockaddr_in6 v6; +}; + +struct client { + union sockaddr_union addr; + int fd; +}; + +struct server { + int fd; +}; + +int resolve(const char *host, unsigned short port, struct addrinfo** addr); +int server_waitclient(struct server *server, struct client* client); +int server_setup(struct server *server, const char* listenip, unsigned short port); + +#endif + -- 2.11.4.GIT