server.h 1.4 KB
#ifndef __SERVER_H__
#define __SERVER_H__

#include <stdio.h>      /* for printf() and fprintf() */
#include <poll.h> /* for select system call and related */

#include "class.h"
#include "socket.h"
#include "logger.h"

#define POLL_FD_NSIZE		1024
#define POLL_FD_SIZE		(sizeof(struct pollfd) * POLL_FD_NSIZE)

#define MOVE_SIZE(size,idx)	((size) * (POLL_FD_NSIZE-((idx)+1)))
#define CLEAR_CONN(server,idx)	\
	memmove(&(((server)->fds)[(idx)]), \
			&(((server)->fds)[(idx)+1]), \
			MOVE_SIZE(sizeof(((server)->fds)[0]),(idx))); \
	memmove(&(((server)->conns)[(idx)]), \
			&(((server)->conns)[(idx)+1]), \
			MOVE_SIZE(sizeof(((server)->conns)[0]),(idx)))


CLASS(Server) {
	Logger        logger;
	Sock          sock;
	void *        reader;

	/**
	 * loeschen: fds[i].event auf 0
	 * dann nfds um die anzahl der geloeschten elemente verkleinern.
	 * die in close pending stehenden socket schliessen.
	 * vor jedem poll qsort auf fds ueber event.
	 * nach dem poll qsort auf fds ueber revent und reuckgebewert
	 * von poll beruecksichtigen.
	 */
	nfds_t        nfds;
	nfds_t        ndel;
	struct pollfd fds[POLL_FD_NSIZE];

	struct {
		Sock         sock;
		void *       reader;

		char         wbuf[2048];
		char *       rbuf;
		unsigned int rpos;
		unsigned int wpos;
	} conns[POLL_FD_NSIZE];
};

void serverRun(Server this);
void serverCloseConn(Server this, unsigned int handle);

#endif // __SERVER_H__

// vim: set ts=4 sw=4: