query/include/matador/net/socket.hpp

169 lines
3.5 KiB
C++

#ifndef MATADOR_SOCKET_HPP
#define MATADOR_SOCKET_HPP
#include <stdexcept>
#include <sstream>
#ifdef _WIN32
#else
#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#include <cstring>
namespace matador {
/**
* Base class for some kind of socket
* classes (acceptor, stream) representing a
* socket. The protocol is selected via the
* template parameter (/sa tcp and udp classes)
*
* @tparam P Protocol type
*/
template < class P >
class socket_base
{
public:
typedef P protocol_type; /**< Shortcut to the protocol type */
typedef typename P::peer peer_type; /**< Shortcut to the peer type */
/**
* Creates a socket for a specific given
* protocol
*
* @param protocol Initial protocol
*/
explicit socket_base(const protocol_type &protocol);
/**
* Creates a socket with the given peer
*
* @param peer Peer used to initialize the socket
*/
explicit socket_base(const peer_type &peer);
/**
* Opens a socket. On success a positive socket id (fd)
* is returned. In case of error -1 is returned and
* errno is set.
*
* @param protocol Protocol for which a socket is created
* @return The socket fd or -1 on error
*/
socket_type open(const protocol_type &protocol);
/**
* Closes the open socket
*/
void close();
/**
* Returns true if the socket is open (created)
*
* @return True on open socket
*/
bool is_open() const;
/**
* Releases the socket fd and sets
* the internal socket to zero (0).
*
* After the socket is released, the user
* is in charge to take of the socket
*
* @return The released socket fd
*/
socket_type release();
/**
* Connect to the given peer. If the connection
* could be established, true is returned,
* otherwise false is returned, and errno is set.
*
* @param p Peer to execute to
* @return True on successful connection
*/
bool connect(const typename protocol_type::peer &p);
/**
* Sets the socket either blocking (false) or
* non-blocking (true).
*
* @param nb True sets the socket non blocking false blocking
*/
void non_blocking(bool nb);
/**
* Returns true if the socket is non-blocking
* otherwise returns false
* @return True if the socket is non-blocking
*/
bool non_blocking() const;
/**
* Set or unset the cose on the exec flag
* for the socket
*
* @param nb Flag to set or unset cloexec option
*/
void cloexec(bool nb);
/**
* Returns true if the close-on-exec option is set
*
* @return True on set cloexec option
*/
bool cloexec() const;
/**
* Sets a socket option represented by name. If the option
* was successfully set, true is returned. Otherwise, false
* and errno ist set.
*
* @param name Option name
* @param value Flag to set or unset the option
* @return True on success
*/
bool options(int name, bool value);
/**
* Returns the underlying socket fd
*
* @return Underlying socket fd
*/
socket_type id() const;
/**
* Assigns the given socket fd to this
* socket. If the socket is already opened,
* an exception is thrown.
*
* @param sock The socket fd to assign
*/
void assign(socket_type sock);
protected:
/// @cond MATADOR_DEV
socket_base() = default;
~socket_base() = default;
socket_type open(int family, int type, int protocol);
socket_type sock_ = 0;
std::string name_;
#ifdef _WIN32
bool is_nonblocking_ = false;
#endif
/// @endcond
};
}
#include "matador/net/socket.tpp"
#endif //MATADOR_SOCKET_HPP