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.
 
 

61 lines
1.7 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 = 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;
}