Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

CODEX_Quorum::SocketBase Class Reference

This class handles basic socket operations. More...

#include <Socket.h>

Inheritance diagram for CODEX_Quorum::SocketBase:

Inheritance graph
[legend]
List of all members.

Public Types

typedef std::queue< Message * > MsgQueueType
 Outgoing messages are kept in a queue.

enum  StateType
 Type of state to check.


Public Methods

Socket Creation and Maintenance
These functions, including constructors and a destructor, create, maintain, and destroy sockets.

In addition to construction, this also includes setting up sockets to receive incoming connections and establishing incoming and outgoing connections.

 SocketBase (int domain=PF_INET, int type=SOCK_STREAM, int protocol=0, bool blocking=false)
 The constructor creates a socket(2).

virtual ~SocketBase ()
virtual void setup (int port, int backlog)
 This version of SocketBase::setup() assumes an IPv4 socket.

virtual void setup (struct sockaddr *my_addr, socklen_t addrlen, int backlog)
 This version of SocketBase::setup() allows for other varieties of sockets aside from IPv4.

virtual void connect (const RemoteServer &server)
 This replaces the standard C connect(2) function, calling the standard function in the base class (with all arguments handled transparently to the user) and allowing refinements in derived classes.

virtual SocketBase * accept ()
 This replaces the standard C accept(2) function, calling the standard function in the base class (with all arguments handled transparently to the user) and allowing refinements in derived classes.

Socket I/O
These functions handle basic socket I/O.

virtual size_t readFrom (void *output, size_t maxSize=1024) const
 Read data from a socket.

virtual size_t readAll (Message &msg, size_t length=0) const
 This method reads an entire message from the socket, using the message length information encoded in the packet.

virtual void writeTo (const Message &input) const
 Write data to a socket.

virtual int set_fd (fd_set *fd_bitmap, StateType s) const
 Fill file descriptor bitmap.

virtual bool isset_fd (const fd_set *fd_bitmap, StateType s) const
 Check file descriptor bitmap.

virtual void flush () const
 Force a blocking write of the internal buffer.


Protected Methods

virtual int internal_write (const unsigned char *output, size_t maxSize) const
 Write data to the socket.

Protected Constructors
These functions allow controlled construction of new SocketBases.

 SocketBase (const SocketBase &aOther)
 Copy constructor.

virtual SocketBase * clone ()
 Subclass-aware object duplication.

Protected Setup and Maintenance Methods
These methods implement the functionality of their non-protected counterparts.

This allows derived classes to use the public methods without having to fully reimplement the base class methods.

virtual SocketBase * protected_accept ()
 
Exceptions:
QSESocketBaseAcceptFailed 


virtual void finish_accept ()
 Post-creation method called by protected_accept().

virtual void protected_bind (int port)
virtual void protected_bind (struct sockaddr *my_addr, socklen_t addrlen)
 
Exceptions:
QSESocketBaseCannotBind 


virtual void protected_listen (int backlog)
 
Exceptions:
QSESocketBaseListenFailed 


void setSocket (int socketFD)
void setBacklog (int backlog)
void setPort (int port)
Protected Accessors
These accessor methods allow derived classes to read, but not modify, private member data.

int domain () const
int type () const
int protocol () const
bool blocking () const
int port () const
int backlog () const
int socket () const

Protected Attributes

MsgQueueType m_msgQueue
 Message queue, which allows us to do in-order non-blocking writes.

unsigned int m_msgOffset
 Offset into the buffer of the first message on the queue.


Detailed Description

This class handles basic socket operations.

Definition at line 35 of file Socket.h.


Constructor & Destructor Documentation

SocketBase::SocketBase int    domain = PF_INET,
int    type = SOCK_STREAM,
int    protocol = 0,
bool    blocking = false
 

The constructor creates a socket(2).

Additional configuration, such as bind(2) and listen(2) must be done after construction. The default values establish an IPv4 TCP socket.

Parameters:
domain  Selects protocol domain, such as PF_UNIX, PF_INET, or PF_INET6.
type  Selects the type of socket, such as SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW.
protocol  Selects the protocol to use.
blocking  Should sockets produced by accept(2) block?
Exceptions:
QSESocketBaseBadSocket  if the socket cannot be created.

Definition at line 33 of file Socket.cc.

Referenced by CODEX_SSL::SSLSocket::clone(), and clone().

SocketBase::SocketBase const SocketBase &    aOther [protected]
 

Copy constructor.

The copy constructor does not create a new socket, but rather copies the configuration of the original socket. This is used when accepting connections, where the listening socket is cloned for each incoming connection.

Definition at line 52 of file Socket.cc.


Member Function Documentation

SocketBase * SocketBase::accept   [virtual]
 

This replaces the standard C accept(2) function, calling the standard function in the base class (with all arguments handled transparently to the user) and allowing refinements in derived classes.

The connection information is held within the member data of SocketBase. As the standard accept(2) returns a new socket filehandle, this version acts as a clone function. The bulk of the work is handled in the protected member function SocketBase::protected_accept(), which should be called by derived-class reimplementations of SocketBase::accept().

Returns:
pointer to a SocketBase containing connection information. This should be deleted by the caller when no longer needed.
Exceptions:
QSESocketBaseAcceptFailed  if the call to accept(2) fails. Note that this might not be a fatal error for a non-blocking socket, in which case an invocation may look like:
try
{
   SocketBase* newConnection = listeningSocket->accept();
   // read from socket newConnection
}
catch( QSESocketBaseAcceptFailed& err )
{
   // no data to read
}

Reimplemented in CODEX_Quorum::LoopbackSocket.

Definition at line 94 of file Socket.cc.

References protected_accept().

Referenced by CODEX_Quorum::EchoServer::processRequest().

SocketBase * SocketBase::clone   [protected, virtual]
 

Subclass-aware object duplication.

This is similar to a copy constructor except that, as a virtual function, it can be overridden in order for derived classes to return copies of themselves that have the correct type, yet which use an identical interface from the base class. Each class in the SocketBase hierarchy overrides this method to use its own copy constructor.

Reimplemented in CODEX_Quorum::LoopbackSocket, and CODEX_SSL::SSLSocket.

Definition at line 371 of file Socket.cc.

References SocketBase().

Referenced by protected_accept().

void SocketBase::connect const RemoteServer   server [virtual]
 

This replaces the standard C connect(2) function, calling the standard function in the base class (with all arguments handled transparently to the user) and allowing refinements in derived classes.

Parameters:
server  Object defining the server to which this socket should connect
Return values:
true  if connection is successful
false  if connection fails

Reimplemented in CODEX_Quorum::LoopbackSocket.

Definition at line 85 of file Socket.cc.

References CODEX_Quorum::RemoteServer::addrlen(), and CODEX_Quorum::RemoteServer::sockaddr().

Referenced by CODEX_Quorum::RemoteServer::socket().

void SocketBase::finish_accept   [protected, virtual]
 

Post-creation method called by protected_accept().

The default version of this method does nothing. It exists so that derived classes may add their own setup after accept(2) has run, but before the actual type is lost by the socket being returned as a pointer to SocketBase.

Reimplemented in CODEX_SSL::SSLSocket.

Definition at line 366 of file Socket.cc.

Referenced by protected_accept().

void SocketBase::flush   [virtual]
 

Force a blocking write of the internal buffer.

Reads are not affected. Single-threaded servers should not call this, but it's fine for multi-threaded servers and clients that want to block until they get a response.

Reimplemented in CODEX_Quorum::LoopbackSocket.

Definition at line 279 of file Socket.cc.

References CODEX_Quorum::Message::buffer(), internal_write(), CODEX_Quorum::Message::length(), m_msgOffset, and m_msgQueue.

Referenced by CODEX_Quorum::RemoteServer::flushSocket().

int SocketBase::internal_write const unsigned char *    output,
size_t    maxSize
const [protected, virtual]
 

Write data to the socket.

Derived classes that need special semantics for writing but can still use the select(2) mechanism, such as for SSL, only need to override this method. The public writeTo() method is SSL-clean.

Parameters:
output  Buffer containing the data to write
maxSize  Maximum number of bytes to write
Returns:
Number of bytes written
Exceptions:
QSESocketBaseWriteFailed  An error occurred during writing.

Reimplemented in CODEX_SSL::SSLSocket.

Definition at line 311 of file Socket.cc.

Referenced by flush(), and isset_fd().

bool SocketBase::isset_fd const fd_set *    fd_bitmap,
StateType    s
const [virtual]
 

Check file descriptor bitmap.

Parameters:
fd_bitmap  bitmap of file descriptors to check. This is typically a fd_set returned by select(2), and will have the bit corresponding to the socket file descriptor set to 1 if the relevant action is appropriate.
s  state of the socket to be tested. This allows derived classes to manipulate the return value appropriately when there is additional socket state to consider.
Return values:
true  the bit is set
false  the bit is not set

Reimplemented in CODEX_Quorum::LoopbackSocket, and CODEX_SSL::SSLSocket.

Definition at line 239 of file Socket.cc.

References CODEX_Quorum::Message::buffer(), internal_write(), CODEX_Quorum::Message::length(), m_msgOffset, m_msgQueue, and set_fd().

Referenced by CODEX_Quorum::RemoteServer::isset_fd(), CODEX_Quorum::LocalServer::isset_fd(), CODEX_Quorum::EchoServer::processRequest(), and readAll().

void SocketBase::protected_bind struct sockaddr *    my_addr,
socklen_t    addrlen
[protected, virtual]
 

Exceptions:
QSESocketBaseCannotBind 

Bug:
This may not be the right place to call setsockopt(2), and it may not always be appropriate to call it.
Todo:
Make a real setsockopt interface.

Definition at line 399 of file Socket.cc.

Referenced by setup().

size_t SocketBase::readAll Message   msg,
size_t    length = 0
const [virtual]
 

This method reads an entire message from the socket, using the message length information encoded in the packet.

If reading the entire message would block, the available data is put into msg and the remaining number of bytes to be read is returned. The message passed in will be appended to, so in the case where a read would have blocked, the Message can be passed to readAll() again when more data becomes available.

Parameters:
msg  Buffer for the message data
length  Number of bytes to read, or 0 if unknown
Returns:
Number of bytes left to read in this message
Exceptions:
QSESocketBaseSocketClosed  The socket is closed.
QSESocketBaseMessageTooLong  The incoming message has a length field greater than 4GB.
QSESocketBaseMessageTooShort  The buffer read from the socket is not long enough to contain any data.
QSESocketBaseReadFailed  select(2) returned an error or readFrom() threw it.

Definition at line 116 of file Socket.cc.

References CODEX_Quorum::Message::fill(), isset_fd(), CODEX_Quorum::Message::length(), readFrom(), and set_fd().

Referenced by CODEX_Quorum::RemoteServer::receiveFrom().

size_t SocketBase::readFrom void *    output,
size_t    maxSize = 1024
const [virtual]
 

Read data from a socket.

Parameters:
output  array containing the data returned from the socket
maxSize  maximum number of bytes to be read from the socket
Returns:
number of bytes actually read (0=connection is closed)
Exceptions:
QSESocketBaseReadFailed  An error occurred while reading.

Reimplemented in CODEX_Quorum::LoopbackSocket, and CODEX_SSL::SSLSocket.

Definition at line 100 of file Socket.cc.

Referenced by CODEX_Quorum::EchoServer::processRequest(), and readAll().

int SocketBase::set_fd fd_set *    fd_bitmap,
StateType    s
const [virtual]
 

Fill file descriptor bitmap.

Parameters:
fd_bitmap  bitmap of file descriptors to modify. The bit corresponding to the socket file descriptor will be set to 1.
s  state of the socket to be tested. This allows derived classes to manipulate the bitmap appropriately when there is additional socket state to consider.
Returns:
file descriptor of the socket

Reimplemented in CODEX_Quorum::LoopbackSocket, and CODEX_SSL::SSLSocket.

Definition at line 232 of file Socket.cc.

Referenced by isset_fd(), CODEX_Quorum::EchoServer::processRequest(), readAll(), CODEX_Quorum::RemoteServer::set_fd(), and CODEX_Quorum::LocalServer::set_fd().

void SocketBase::setup struct sockaddr *    my_addr,
socklen_t    addrlen,
int    backlog
[virtual]
 

This version of SocketBase::setup() allows for other varieties of sockets aside from IPv4.

The arguments provided conform to the arguments of bind(2) and listen(2).

Reimplemented in CODEX_Quorum::LoopbackSocket.

Definition at line 76 of file Socket.cc.

References protected_bind(), and protected_listen().

void SocketBase::setup int    port,
int    backlog
[virtual]
 

This version of SocketBase::setup() assumes an IPv4 socket.

It will use AF_INET and INADDR_ANY when bind(2)ing. Protected member functions SocketBase::protected_bind() and SocketBase::protected_listen() are used for configuration, so that derived classes may reimplement them.

Parameters:
port  Local port on which to bind.
backlog  Maximum number of pending connections in the queue.
Exceptions:
QSESocketBaseCannotBind  if the call to bind(2) fails.
QSESocketBaseListenFailed  if the call to listen(2) fails.

Reimplemented in CODEX_Quorum::LoopbackSocket.

Definition at line 69 of file Socket.cc.

References protected_bind(), and protected_listen().

Referenced by CODEX_Quorum::LocalServer::enable().

void SocketBase::writeTo const Message   input const [virtual]
 

Write data to a socket.

Parameters:
input  Message to queue for writing.
Exceptions:
QSESocketBaseWriteFailed  An error occurred while writing.

Definition at line 209 of file Socket.cc.

References CODEX_Quorum::Message::fill(), CODEX_Quorum::Message::length(), and m_msgQueue.

Referenced by CODEX_Quorum::EchoServer::processRequest(), and CODEX_Quorum::RemoteServer::sendTo().


The documentation for this class was generated from the following files:
Generated on Wed Jun 2 16:33:18 2004 for COrnell Data EXchange (CODEX) by doxygen1.2.18