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