/*
This file is part of Ingen.
Copyright 2007-2012 David Robillard
Ingen is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or any later version.
Ingen 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 Affero General Public License for details.
You should have received a copy of the GNU Affero General Public License
along with Ingen. If not, see .
*/
#ifndef INGEN_SOCKET_SOCKET_HPP
#define INGEN_SOCKET_SOCKET_HPP
#include
#include
#include "raul/Noncopyable.hpp"
#include "raul/SharedPtr.hpp"
#include "raul/URI.hpp"
namespace Ingen {
namespace Socket {
/** A safe and simple interface for UNIX or TCP sockets. */
class Socket : public Raul::Noncopyable {
public:
enum Type {
UNIX,
TCP
};
static Type type_from_uri(const Raul::URI uri) {
return (uri.scheme() == "unix") ? UNIX : TCP;
}
/** Create a new unbound/unconnected socket of a given type. */
explicit Socket(Type t);
/** Wrap an existing open socket. */
Socket(Type t,
const Raul::URI& uri,
struct sockaddr* addr,
socklen_t addr_len,
int fd);
~Socket();
/** Bind a server socket to an address.
* @param uri Address URI, e.g. unix:///tmp/foo or tcp://somehost:1234
* @return True on success.
*/
bool bind(const Raul::URI& uri);
/** Connect a client socket to a server address.
* @param uri Address URI, e.g. unix:///tmp/foo or tcp://somehost:1234
* @return True on success.
*/
bool connect(const Raul::URI& uri);
/** Mark server socket as passive to listen for incoming connections.
* @return True on success.
*/
bool listen();
/** Accept a connection.
* @return An new open socket for the connection.
*/
SharedPtr accept();
/** Return the file descriptor for the socket. */
int fd() { return _sock; }
const Raul::URI& uri() const { return _uri; }
/** Close the socket. */
void close();
/** Shut down the socket.
* This terminates any connections associated with the sockets, and will
* (unlike close()) cause a poll on the socket to return.
*/
void shutdown();
private:
bool set_addr(const Raul::URI& uri);
Type _type;
Raul::URI _uri;
struct sockaddr* _addr;
socklen_t _addr_len;
int _sock;
};
} // namespace Socket
} // namespace Ingen
#endif // INGEN_SOCKET_SOCKET_HPP