Fawkes API  Fawkes Development Version
fawkes::Socket Class Referenceabstract

Socket base class. More...

#include <netcomm/socket/socket.h>

Inheritance diagram for fawkes::Socket:

Public Types

enum  AddrType { UNSPECIFIED, IPv4, IPv6 }
 Address type specification. More...
 
enum  SocketType { TCP, UDP }
 Socket type. More...
 

Public Member Functions

 Socket (AddrType addr_type, SocketType sock_type, float timeout=0.f)
 Constructor similar to syscall. More...
 
 Socket (Socket &socket)
 Copy constructor. More...
 
virtual ~Socket ()
 Destructor. More...
 
virtual void connect (const char *hostname, const unsigned short int port)
 Connect socket. More...
 
virtual void connect (const struct ::sockaddr_storage &addr_port)
 Connect socket. More...
 
virtual void connect (const struct sockaddr *addr_port, socklen_t struct_size)
 Connect socket. More...
 
virtual void bind (const unsigned short int port)
 Bind socket. More...
 
virtual void bind (const unsigned short int port, const char *ipaddr)
 Bind socket to a specific address. More...
 
virtual void listen (int backlog=1)
 Listen on socket. More...
 
virtual Socketaccept ()
 Accept connection. More...
 
virtual void close ()
 Close socket. More...
 
virtual bool available ()
 Check if data is available. More...
 
virtual size_t read (void *buf, size_t count, bool read_all=true)
 Read from socket. More...
 
virtual void write (const void *buf, size_t count)
 Write to the socket. More...
 
virtual void send (void *buf, size_t buf_len)
 Write to the socket. More...
 
virtual void send (void *buf, size_t buf_len, const struct sockaddr *to_addr, socklen_t addr_len)
 Send message. More...
 
virtual size_t recv (void *buf, size_t buf_len)
 Read from socket. More...
 
virtual size_t recv (void *buf, size_t buf_len, struct sockaddr *from_addr, socklen_t *addr_len)
 Receive data. More...
 
virtual Socketclone ()=0
 Clone socket. More...
 
virtual short poll (int timeout=-1, short what=POLL_IN|POLL_HUP|POLL_PRI|POLL_RDHUP)
 Wait for some event on socket. More...
 
virtual bool listening ()
 Is socket listening for connections? More...
 
virtual unsigned int mtu ()
 Maximum Transfer Unit (MTU) of socket. More...
 
template<class SocketTypeC >
SocketTypeC * accept ()
 Accept connection. More...
 

Static Public Attributes

static const short POLL_IN = POLLIN
 Data can be read. More...
 
static const short POLL_OUT = POLLOUT
 Writing will not block. More...
 
static const short POLL_PRI = POLLPRI
 There is urgent data to read (e.g., out-of-band data on TCP socket; pseudo-terminal master in packet mode has seen state change in slave). More...
 
static const short POLL_RDHUP = 0
 Stream socket peer closed connection, or shut down writing half of connection. More...
 
static const short POLL_ERR = POLLERR
 Error condition. More...
 
static const short POLL_HUP = POLLHUP
 Hang up. More...
 
static const short POLL_NVAL = POLLNVAL
 Invalid request. More...
 

Protected Member Functions

 Socket (SocketType sock_type, float timeout=0.f)
 IPv4 Constructor. More...
 
 Socket ()
 Constructor. More...
 

Protected Attributes

AddrType addr_type
 Address type/family of socket. More...
 
int sock_fd
 Socket file descriptor. More...
 
float timeout
 Timeout in seconds for various operations. More...
 
struct ::sockaddr_storage * client_addr
 Client address, set if connected. More...
 
unsigned int client_addr_len
 length in bytes of client address. More...
 

Detailed Description

Socket base class.

This is the base class for all sockets. You cannot use it directly but you have to use one of the derivatives like StreamSocket or DatagramSocket.

Author
Tim Niemueller

Definition at line 65 of file socket.h.

Member Enumeration Documentation

◆ AddrType

Address type specification.

Enumerator
UNSPECIFIED 

Yet unknown address type.

IPv4 

IPv4.

IPv6 

IPv6.

Definition at line 78 of file socket.h.

◆ SocketType

Socket type.

Enumerator
TCP 

TCP stream socket.

UDP 

UDP datagram socket.

Definition at line 85 of file socket.h.

Constructor & Destructor Documentation

◆ Socket() [1/4]

fawkes::Socket::Socket ( AddrType  addr_type,
SocketType  sock_type,
float  timeout = 0.f 
)

Constructor similar to syscall.

This creates a new socket. This is a plain pass-through constructor to the socket() syscall. In most cases this should only be used by a derivate.

Parameters
addr_typeSpecify IPv4 or IPv6
sock_typesocket type, either TCP or UDP
timeoutSee Socket::timeout.
Exceptions
SocketExceptionthrown if socket cannot be opened, check errno for cause

Definition at line 163 of file socket.cpp.

References IPv4, IPv6, TCP, and UDP.

◆ Socket() [2/4]

fawkes::Socket::Socket ( Socket socket)

Copy constructor.

Parameters
socketsocket to copy

Definition at line 220 of file socket.cpp.

References client_addr, client_addr_len, sock_fd, and timeout.

◆ ~Socket()

fawkes::Socket::~Socket ( )
virtual

Destructor.

Definition at line 262 of file socket.cpp.

References client_addr, and close().

◆ Socket() [3/4]

fawkes::Socket::Socket ( SocketType  sock_type,
float  timeout = 0.f 
)
protected

IPv4 Constructor.

This creates a new socket. This is a plain pass-through constructor to the socket() syscall. In most cases this should only be used by a derivate.

Parameters
sock_typesocket type, either TCP or UDP
timeoutSee Socket::timeout.
Exceptions
SocketExceptionthrown if socket cannot be opened, check errno for cause

Definition at line 191 of file socket.cpp.

References TCP, and UDP.

◆ Socket() [4/4]

fawkes::Socket::Socket ( )
protected

Constructor.

Plain constructor. The socket will not be opened. This may only be called by sub-classes and you must ensure that the socket file descriptor is initialized properly.

Definition at line 210 of file socket.cpp.

Member Function Documentation

◆ accept() [1/2]

Socket * fawkes::Socket::accept ( )
virtual

Accept connection.

Accepts a connection waiting in the queue.

Returns
new socket used to communicate with the remote part
Exceptions
SocketExceptionthrown if socket cannot accept, check errno for cause

Definition at line 565 of file socket.cpp.

References client_addr, clone(), and sock_fd.

Referenced by fawkes::NetworkAcceptorThread::loop().

◆ accept() [2/2]

template<class SocketTypeC >
SocketTypeC * fawkes::Socket::accept ( )

Accept connection.

This method works like accept() but it ensures that the returned socket is of the given type.

Returns
socket to client

Definition at line 158 of file socket.h.

◆ available()

bool fawkes::Socket::available ( )
virtual

Check if data is available.

Use this to check if data is available on the socket for reading.

Returns
true, if data can be read, false otherwise

Definition at line 611 of file socket.cpp.

References sock_fd.

Referenced by firevision::FuseClient::disconnect(), fawkes::FawkesNetworkTransceiver::recv(), and firevision::FuseNetworkTransceiver::recv().

◆ bind() [1/2]

void fawkes::Socket::bind ( const unsigned short int  port)
virtual

Bind socket.

Can only be called on stream sockets.

Parameters
portport to bind
Exceptions
SocketExceptionthrown if socket cannot bind, check errno for cause

Reimplemented in fawkes::MulticastDatagramSocket, and fawkes::BroadcastDatagramSocket.

Definition at line 419 of file socket.cpp.

References addr_type, IPv4, IPv6, and sock_fd.

Referenced by bind(), and fawkes::NetworkAcceptorThread::NetworkAcceptorThread().

◆ bind() [2/2]

void fawkes::Socket::bind ( const unsigned short int  port,
const char *  ipaddr 
)
virtual

Bind socket to a specific address.

Parameters
portport to bind
ipaddrtextual IP address of a local interface to bind to, must match the address type passed to the constructor.
Exceptions
SocketExceptionthrown if socket cannot bind, check errno for cause

Reimplemented in fawkes::MulticastDatagramSocket, and fawkes::BroadcastDatagramSocket.

Definition at line 479 of file socket.cpp.

References addr_type, bind(), IPv4, IPv6, and sock_fd.

◆ clone()

virtual Socket* fawkes::Socket::clone ( )
pure virtual

Clone socket.

This method has to be implemented by subclass to correctly clone the instance.

Returns
cloned socket

Implemented in fawkes::MulticastDatagramSocket, fawkes::BroadcastDatagramSocket, fawkes::StreamSocket, and fawkes::DatagramSocket.

Referenced by accept().

◆ close()

◆ connect() [1/3]

void fawkes::Socket::connect ( const char *  hostname,
const unsigned short int  port 
)
virtual

Connect socket.

If called for a stream socket this will connect to the remote address. If you call this on a datagram socket you will tune in to a specific sender and receiver.

Parameters
hostnamehostname or textual represenation of IP address to connect to
portport to connect to
Exceptions
SocketExceptionthrown if socket cannot connect, check errno for cause

Definition at line 340 of file socket.cpp.

References close(), sock_fd, and fawkes::StringConversions::to_string().

Referenced by firevision::FuseClient::connect(), and connect().

◆ connect() [2/3]

void fawkes::Socket::connect ( const struct ::sockaddr_storage &  addr_port)
virtual

Connect socket.

If called for a stream socket this will connect to the remote address. If you call this on a datagram socket you will tune in to a specific sender and receiver.

Parameters
addr_portstruct containing address and port to connect to
Exceptions
SocketExceptionthrown if socket cannot connect, check errno for cause

Definition at line 291 of file socket.cpp.

References connect().

◆ connect() [3/3]

void fawkes::Socket::connect ( const struct sockaddr *  addr_port,
socklen_t  struct_size 
)
virtual

Connect socket.

If called for a stream socket this will connect to the remote address. If you call this on a datagram socket you will tune in to a specific sender and receiver.

Parameters
addr_portstruct containing address and port to connect to
struct_sizesize of addr_port struct
Exceptions
SocketExceptionthrown if socket cannot connect, check errno for cause

Definition at line 305 of file socket.cpp.

References connect(), sock_fd, fawkes::time_diff_sec(), and timeout.

◆ listen()

void fawkes::Socket::listen ( int  backlog = 1)
virtual

Listen on socket.

This waits for new connections on a bound socket. The backlog is the maximum number of connections waiting for being accepted.

Parameters
backlogmaximum number of waiting connections
Exceptions
SocketExceptionthrown if socket cannot listen, check errno for cause
See also
bind()
accept()

Definition at line 547 of file socket.cpp.

References sock_fd.

Referenced by fawkes::NetworkAcceptorThread::NetworkAcceptorThread().

◆ listening()

bool fawkes::Socket::listening ( )
virtual

Is socket listening for connections?

Returns
true if socket is listening for incoming connections, false otherwise

Definition at line 932 of file socket.cpp.

References sock_fd.

◆ mtu()

unsigned int fawkes::Socket::mtu ( )
virtual

Maximum Transfer Unit (MTU) of socket.

Note that this can only be retrieved of connected sockets!

Returns
MTU in bytes

Definition at line 950 of file socket.cpp.

References sock_fd.

◆ poll()

short fawkes::Socket::poll ( int  timeout = -1,
short  what = POLL_IN | POLL_HUP | POLL_PRI | POLL_RDHUP 
)
virtual

Wait for some event on socket.

Parameters
timeouttimeout in miliseconds to wait. A negative value means to wait forever until an event occurs, zero means just check, don't wait.
whatwhat to wait for, a bitwise OR'ed combination of POLL_IN, POLL_OUT and POLL_PRI.
Returns
Returns a flag value. Use bit-wise AND with the POLL_* constants in this class.
Exceptions
InterruptedExceptionthrown, if poll is interrupted by a signal
SocketExceptionthrown for any other error the poll() syscall can cause, see Exception::errno() for the cause of the error.
See also
Socket::POLL_IN
Socket::POLL_OUT
Socket::POLL_PRI
Socket::POLL_RDHUP
Socket::POLL_ERR
Socket::POLL_HUP
Socket::POLL_NVAL

Definition at line 652 of file socket.cpp.

References POLL_ERR, and sock_fd.

Referenced by firevision::FuseClient::enqueue_and_wait(), fawkes::FawkesNetworkServerClientThread::loop(), firevision::FuseServerClientThread::loop(), and Msl2010RefBoxProcessor::refbox_process().

◆ read()

size_t fawkes::Socket::read ( void *  buf,
size_t  count,
bool  read_all = true 
)
virtual

Read from socket.

Read from the socket. This method can only be used on streams.

Parameters
bufbuffer to write from
countlength of buffer, number of bytes to write to stream
read_allsetting this to true causes a call to read() loop until exactly count bytes have been read, if false it will return after the first successful read with the number of bytes available then.
Returns
number of bytes read.
See also
write
Exceptions
SocketExceptionthrown for any error during reading

Definition at line 729 of file socket.cpp.

References sock_fd, fawkes::time_diff_sec(), and timeout.

Referenced by fawkes::FawkesNetworkTransceiver::recv(), firevision::FuseNetworkTransceiver::recv(), and Msl2010RefBoxProcessor::refbox_process().

◆ recv() [1/2]

size_t fawkes::Socket::recv ( void *  buf,
size_t  buf_len 
)
virtual

Read from socket.

Read from the socket. This method can only be used on streams. Usage of read() is recommended.

Parameters
bufbuffer to read data into
buf_lenlength of buffer, number of bytes to read from stream
Returns
number of bytes read
Exceptions
SocketExceptionthrown if an error occurs or the other side has closed the connection.

Definition at line 836 of file socket.cpp.

References sock_fd.

◆ recv() [2/2]

size_t fawkes::Socket::recv ( void *  buf,
size_t  buf_len,
struct sockaddr *  addr,
socklen_t *  addr_len 
)
virtual

Receive data.

This will use recvfrom() to read data from the socket and returns the number of bytes actually read. It will not wait until the requested number of bytes has been read. Use read() if you need this.

Parameters
bufbuffer that read data shall be stored in.
buf_lenlength of buffer and number of bytes to be read
addrreturn parameter, contains address of sender
addr_leninitially has to contain size of address, on return contains the actual bytes used.
Returns
number of bytes received

Definition at line 909 of file socket.cpp.

References sock_fd.

◆ send() [1/2]

void fawkes::Socket::send ( void *  buf,
size_t  buf_len 
)
virtual

Write to the socket.

Write to the socket. This method can be used on streams or on datagram sockets which have been tuned to a specific receiver by using connect(). For streams usage of write() is recommended as it is the more intuitive way to deal with a stream.

Parameters
bufbuffer to write
buf_lenlength of buffer, number of bytes to write to stream
See also
write

Reimplemented in fawkes::MulticastDatagramSocket, and fawkes::BroadcastDatagramSocket.

Definition at line 816 of file socket.cpp.

References write().

Referenced by fawkes::BroadcastDatagramSocket::send(), and fawkes::MulticastDatagramSocket::send().

◆ send() [2/2]

void fawkes::Socket::send ( void *  buf,
size_t  buf_len,
const struct sockaddr *  addr,
socklen_t  addr_len 
)
virtual

Send message.

Parameters
bufbuffer with data to send
buf_lenlength of buffer, all data will be send.
addraddr to send data to.
addr_lenlength of address

Reimplemented in fawkes::MulticastDatagramSocket, and fawkes::BroadcastDatagramSocket.

Definition at line 859 of file socket.cpp.

References sock_fd, fawkes::time_diff_sec(), and timeout.

◆ write()

void fawkes::Socket::write ( const void *  buf,
size_t  count 
)
virtual

Write to the socket.

Write to the socket. This method can only be used on streams.

Parameters
bufbuffer to write
countnumber of bytes to write from buf
Exceptions
SocketExceptionif the data could not be written or if a timeout occured.

Definition at line 681 of file socket.cpp.

References sock_fd, fawkes::time_diff_sec(), and timeout.

Referenced by fawkes::FawkesNetworkTransceiver::send(), firevision::FuseNetworkTransceiver::send(), and send().

Member Data Documentation

◆ addr_type

fawkes::Socket::addr_type
protected

Address type/family of socket.

Definition at line 139 of file socket.h.

Referenced by bind().

◆ client_addr

fawkes::Socket::client_addr
protected

Client address, set if connected.

Definition at line 142 of file socket.h.

Referenced by accept(), Socket(), and ~Socket().

◆ client_addr_len

fawkes::Socket::client_addr_len
protected

length in bytes of client address.

Definition at line 143 of file socket.h.

Referenced by Socket().

◆ POLL_ERR

const short fawkes::Socket::POLL_ERR = POLLERR
static

◆ POLL_HUP

const short fawkes::Socket::POLL_HUP = POLLHUP
static

◆ POLL_IN

const short fawkes::Socket::POLL_IN = POLLIN
static

◆ POLL_NVAL

const short fawkes::Socket::POLL_NVAL = POLLNVAL
static

Invalid request.

Definition at line 75 of file socket.h.

Referenced by fawkes::SocketException::SocketException().

◆ POLL_OUT

const short fawkes::Socket::POLL_OUT = POLLOUT
static

Writing will not block.

Definition at line 70 of file socket.h.

Referenced by fawkes::SocketException::SocketException().

◆ POLL_PRI

const short fawkes::Socket::POLL_PRI = POLLPRI
static

There is urgent data to read (e.g., out-of-band data on TCP socket; pseudo-terminal master in packet mode has seen state change in slave).

Definition at line 71 of file socket.h.

Referenced by fawkes::SocketException::SocketException().

◆ POLL_RDHUP

const short fawkes::Socket::POLL_RDHUP = 0
static

Stream socket peer closed connection, or shut down writing half of connection.

The _GNU_SOURCE feature test macro must be defined in order to obtain this definition (since Linux 2.6.17).

Definition at line 72 of file socket.h.

Referenced by fawkes::FawkesNetworkServerClientThread::loop(), fawkes::FawkesNetworkClientRecvThread::loop(), and fawkes::SocketException::SocketException().

◆ sock_fd

◆ timeout

fawkes::Socket::timeout
protected

Timeout in seconds for various operations.

If the timeout is non-zero the socket is initialized non-blocking and operations are aborted after timeout seconds have passed.

Definition at line 141 of file socket.h.

Referenced by connect(), read(), send(), Socket(), and write().


The documentation for this class was generated from the following files: