Network wrapper protocol as part of the practical master thesis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

71 lines
2.0 KiB

#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;
}