#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 = malloc(sizeof(connection_t)); if (NULL == server->conn) { printf("server_open: malloc failed"); 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) { server->handler(connfd); close(connfd); } return 0; } int server_close(server_t *server) { if (NULL != server && 0 != close(server->conn->fd)) { printf("server_close: closing socket failed\n"); return -1; } return 0; }