forked from Telodendria/Telodendria
Poll the socket for data events.
This commit is contained in:
parent
d9c944871a
commit
af03988db7
2 changed files with 40 additions and 13 deletions
|
@ -26,7 +26,8 @@
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <errno.h>
|
||||||
|
#include <poll.h>
|
||||||
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
@ -36,27 +37,34 @@ struct HttpServer
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
unsigned int nThreads;
|
unsigned int nThreads;
|
||||||
HttpHandler *requestHandler;
|
|
||||||
void *handlerArgs;
|
|
||||||
|
|
||||||
pthread_t socketThread;
|
pthread_t socketThread;
|
||||||
|
|
||||||
volatile unsigned int stop:1;
|
volatile unsigned int stop:1;
|
||||||
volatile unsigned int isRunning:1;
|
volatile unsigned int isRunning:1;
|
||||||
|
|
||||||
|
HttpHandler *requestHandler;
|
||||||
|
void *handlerArgs;
|
||||||
};
|
};
|
||||||
|
|
||||||
HttpServer *
|
HttpServer *
|
||||||
HttpServerCreate(unsigned short port, unsigned int nThreads, HttpHandler * requestHandler, void *handlerArgs)
|
HttpServerCreate(unsigned short port, unsigned int nThreads,
|
||||||
|
HttpHandler * requestHandler, void *handlerArgs)
|
||||||
{
|
{
|
||||||
HttpServer *server = malloc(sizeof(HttpServer));
|
HttpServer *server;
|
||||||
struct sockaddr_in sa = {0};
|
struct sockaddr_in sa = {0};
|
||||||
|
|
||||||
|
if (!requestHandler)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
server = malloc(sizeof(HttpServer));
|
||||||
if (!server)
|
if (!server)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->sd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
|
server->sd = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
if (server->sd < 0)
|
if (server->sd < 0)
|
||||||
{
|
{
|
||||||
|
@ -108,21 +116,39 @@ static void *
|
||||||
HttpServerEventThread(void *args)
|
HttpServerEventThread(void *args)
|
||||||
{
|
{
|
||||||
HttpServer *server = (HttpServer *) args;
|
HttpServer *server = (HttpServer *) args;
|
||||||
|
struct pollfd pollFds[1];
|
||||||
|
|
||||||
server->isRunning = 1;
|
server->isRunning = 1;
|
||||||
server->stop = 0;
|
server->stop = 0;
|
||||||
|
|
||||||
|
pollFds[0].fd = server->sd;
|
||||||
|
pollFds[0].events = POLLIN;
|
||||||
|
|
||||||
while (!server->stop)
|
while (!server->stop)
|
||||||
{
|
{
|
||||||
printf("In server event thread\n");
|
struct sockaddr_storage addr;
|
||||||
fflush(stdout);
|
socklen_t addrLen = sizeof(addr);
|
||||||
sleep(1);
|
int connFd;
|
||||||
|
int pollResult = poll(pollFds, 1, 60 * 1000);
|
||||||
|
|
||||||
|
if (pollResult < 0)
|
||||||
|
{
|
||||||
|
/* The poll either timed out, or was interrupted. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
connFd = accept(server->sd, (struct sockaddr *) & addr, &addrLen);
|
||||||
|
|
||||||
|
if (connFd < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(connFd);
|
||||||
}
|
}
|
||||||
|
|
||||||
server->isRunning = 0;
|
server->isRunning = 0;
|
||||||
|
|
||||||
printf("Event thread dying!\n");
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -295,7 +295,8 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bind the socket before possibly dropping permissions */
|
/* Bind the socket before possibly dropping permissions */
|
||||||
httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads, TelodendriaHttpHandler, NULL);
|
httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads,
|
||||||
|
TelodendriaHttpHandler, NULL);
|
||||||
if (!httpServer)
|
if (!httpServer)
|
||||||
{
|
{
|
||||||
Log(lc, LOG_ERROR, "Unable to create HTTP server on port %d: %s",
|
Log(lc, LOG_ERROR, "Unable to create HTTP server on port %d: %s",
|
||||||
|
|
Loading…
Reference in a new issue