#include "server.h" server_t* server_open(conn_handler handler) { struct sockaddr_in servaddr; server_t *server = malloc(sizeof(server_t)); if(NULL == handler) { printf("server_open: received empty handler, stopping"); return NULL; } if (NULL == server) { printf("server_open: malloc failed"); return NULL; } server->conn = connection_create(CONN_TYPE_SERVER); if (NULL == server->conn) { free(server); return NULL; } server->handler = handler; server->conn->fd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == server->conn->fd) { printf("server_listen: failed to create endpoint.\n"); return NULL; } servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); if (0 != bind(server->conn->fd, (const struct sockaddr *) &servaddr, sizeof(servaddr))) { printf("server_listen: failed to bind socket\n"); return NULL; } return server; } int server_accept(server_t *server) { struct sockaddr_in client; int client_len = 0; int connfd = -1; if (NULL == server || 0 != listen(server->conn->fd, MAX_CLIENTS)) { printf("server_accept: listen failed\n"); return -1; } printf("server_accept: listening\n"); client_len = sizeof(client); connfd = accept(server->conn->fd, &client, &client_len); if(0 >= connfd) { printf("server_accept: connection to client failed, "); return -1; } else { server->handler(connfd); if(0 != close(connfd)) { printf("server_accept: failed to close client connection properly"); return -1; } } return 0; } int server_close(server_t *server) { int err = 0; if (NULL == server) { return 0; } if (0 != connection_destroy(server->conn)) { printf("server_close: closing socket failed\n"); err = -1; } free(server); return err; }