server.h
Go to the documentation of this file.
#ifndef WIBBLE_NET_SERVER_H
#define WIBBLE_NET_SERVER_H
/*
* net/server - Network server infrastructure
*
* Copyright (C) 2010 Enrico Zini <enrico@enricozini.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <string>
#include <vector>
#include <signal.h>
namespace wibble {
namespace net {
struct Server
{
// Human readable server hostname
std::string host;
// Human readable server port
std::string port;
// Type of server socket (default SOCK_STREAM)
int socktype;
// Server socket
int sock;
// Saved signal handlers before accept
struct sigaction *old_signal_actions;
// Signal handlers in use during accept
struct sigaction *signal_actions;
Server();
~Server();
// Bind to a given port (and optionally interface hostname)
void bind(const char* port, const char* host=NULL);
// Set socket to listen, with given backlog
void listen(int backlog = 16);
// Set FD_CLOEXEC option on master socket, so it does not propagate to
// children. The master socket is not FD_CLOEXEC by default.
void set_sock_cloexec();
};
struct TCPServer : public Server
{
// Signals used to stop the server's accept loop
std::vector<int> stop_signals;
TCPServer();
virtual ~TCPServer();
int accept_loop();
virtual void handle_client(int sock, const std::string& peer_hostname, const std::string& peer_hostaddr, const std::string& peer_port) = 0;
protected:
static void signal_handler(int sig);
static int last_signal;
// Initialize signal handling structures
void signal_setup();
void signal_install();
void signal_uninstall();
};
}
}
// vim:set ts=4 sw=4:
#endif
wibble::net::TCPServer::~TCPServer
virtual ~TCPServer()
wibble::net::Server::bind
void bind(const char *port, const char *host=NULL)
wibble::net::Server
Generic bind/listen/accept internet server.
Definition: server.h:34
wibble::net::TCPServer::signal_install
void signal_install()
wibble::net::Server::host
std::string host
Definition: server.h:37
wibble::net::TCPServer::TCPServer
TCPServer()
wibble::net::TCPServer::stop_signals
std::vector< int > stop_signals
Definition: server.h:67
wibble::net::Server::~Server
~Server()
wibble::net::TCPServer::handle_client
virtual void handle_client(int sock, const std::string &peer_hostname, const std::string &peer_hostaddr, const std::string &peer_port)=0
wibble::net::Server::Server
Server()
signal.h
wibble::net::Server::sock
int sock
Definition: server.h:43
wibble::net::Server::port
std::string port
Definition: server.h:39
wibble::net::Server::socktype
int socktype
Definition: server.h:41
wibble::net::TCPServer::signal_uninstall
void signal_uninstall()
wibble::net::TCPServer::signal_handler
static void signal_handler(int sig)
wibble::net::TCPServer::accept_loop
int accept_loop()
Loop accepting connections on the socket, until interrupted by a signal in stop_signals.
wibble::net::Server::signal_actions
struct sigaction * signal_actions
Definition: server.h:48
wibble::net::TCPServer::signal_setup
void signal_setup()
wibble
Definition: amorph.h:17
wibble::net::TCPServer::last_signal
static int last_signal
Definition: server.h:83
wibble::net::Server::listen
void listen(int backlog=16)
wibble::net::TCPServer
Definition: server.h:64
wibble::net::Server::old_signal_actions
struct sigaction * old_signal_actions
Definition: server.h:46
wibble::net::Server::set_sock_cloexec
void set_sock_cloexec()