vpr::SocketDatagramImplBSD Class Reference

Implementation class for datagram sockets using the BSD sockets interface. More...

#include <vpr/IO/Socket/SocketDatagram.h>

Inheritance diagram for vpr::SocketDatagramImplBSD:

Inheritance graph
[legend]
Collaboration diagram for vpr::SocketDatagramImplBSD:

Collaboration graph
[legend]
List of all members.

Public Types

typedef SocketImplBSD Parent

Public Member Functions

 SocketDatagramImplBSD ()
 Default constructor.
 SocketDatagramImplBSD (const InetAddr &localAddr, const InetAddr &remoteAddr)
 Constructs a datagram socket using the given addresses as defaults for communication channels.
 SocketDatagramImplBSD (const SocketDatagramImplBSD &sock)
 Copy constructor.
vpr::ReturnStatus recvfrom (void *msg, const vpr::Uint32 length, vpr::InetAddr &from, vpr::Uint32 &bytesRead, const vpr::Interval timeout=vpr::Interval::NoTimeout)
 Receives a message from the specified address.
vpr::ReturnStatus sendto (const void *msg, const vpr::Uint32 length, const vpr::InetAddr &to, vpr::Uint32 &bytesSent, const vpr::Interval timeout=vpr::Interval::NoTimeout)
 Sends a message to the specified address.

Detailed Description

Implementation class for datagram sockets using the BSD sockets interface.

This is used in conjunction with vpr::SocketConfiguration to create the BSD implementation of the typedef vpr::SocketDatagram.

Definition at line 61 of file SocketDatagramImplBSD.h.


Member Typedef Documentation

typedef SocketImplBSD vpr::SocketDatagramImplBSD::Parent

Definition at line 64 of file SocketDatagramImplBSD.h.


Constructor & Destructor Documentation

vpr::SocketDatagramImplBSD::SocketDatagramImplBSD (  ) 

Default constructor.

This sets the socket type to vpr::SocketTypes::DATAGRAM.

Definition at line 63 of file SocketDatagramImplBSD.cpp.

00064    : SocketImplBSD(vpr::SocketTypes::DATAGRAM)
00065 {
00066    /* Do nothing. */ ;
00067 }

vpr::SocketDatagramImplBSD::SocketDatagramImplBSD ( const InetAddr localAddr,
const InetAddr remoteAddr 
)

Constructs a datagram socket using the given addresses as defaults for communication channels.

Postcondition:
The member variables are initialized with the type in particular set to vpr::SocketTypes::DATAGRAM.
Parameters:
localAddr The local address for this socket. This is used for binding the socket.
remoteAddr The remote address for this socket. This is used to specify a default destination for all packets.

Definition at line 69 of file SocketDatagramImplBSD.cpp.

00071    : SocketImplBSD(localAddr, remoteAddr, vpr::SocketTypes::DATAGRAM)
00072 {
00073    /* Do nothing. */ ;
00074 }

vpr::SocketDatagramImplBSD::SocketDatagramImplBSD ( const SocketDatagramImplBSD sock  ) 

Copy constructor.

Postcondition:
This socket is a copy of the given socket.

Definition at line 76 of file SocketDatagramImplBSD.cpp.

References vpr::FileHandleImplUNIX::getName(), vpr::FileHandleImplUNIX::mBlocking, vpr::FileHandleImplUNIX::mFdesc, vpr::SocketImplBSD::mHandle, and vpr::FileHandleImplUNIX::mOpen.

00077    : SocketImplBSD(sock.mLocalAddr, sock.mRemoteAddr, SocketTypes::DATAGRAM)
00078 {
00079    mHandle            = new FileHandleImplUNIX(sock.mHandle->getName());
00080    mHandle->mFdesc    = sock.mHandle->mFdesc;
00081    mHandle->mOpen     = sock.mHandle->mOpen;
00082    mHandle->mBlocking = sock.mHandle->mBlocking;
00083 }


Member Function Documentation

vpr::ReturnStatus vpr::SocketDatagramImplBSD::recvfrom ( void *  msg,
const vpr::Uint32  length,
vpr::InetAddr from,
vpr::Uint32 bytesRead,
const vpr::Interval  timeout = vpr::Interval::NoTimeout 
)

Receives a message from the specified address.

Definition at line 85 of file SocketDatagramImplBSD.cpp.

References errno, vpr::ReturnStatus::Fail, vpr::InetAddrBSD::getAddressString(), vpr::InetAddrBSD::getPort(), vpr::SocketImplBSD::isBlocking(), vpr::FileHandleImplUNIX::isReadable(), vpr::InetAddrBSD::mAddr, vpr::SocketImplBSD::mBlockingFixed, vpr::FileHandleImplUNIX::mFdesc, vpr::SocketImplBSD::mHandle, vpr::SocketImplBSD::mRemoteAddr, vpr::ReturnStatus::NotConnected, vpr::ReturnStatus::setCode(), vpr::InetAddrBSD::size(), vpr::ReturnStatus::success(), and vpr::ReturnStatus::WouldBlock.

00090 {
00091 #if defined(VPR_OS_IRIX) || defined(VPR_OS_HPUX)
00092    int fromlen;
00093 #else
00094    socklen_t fromlen;
00095 #endif
00096 
00097    vpr::ReturnStatus retval;
00098 
00099    retval = mHandle->isReadable(timeout);
00100 
00101    if ( retval.success() )
00102    {
00103       ssize_t bytes;
00104 
00105       mBlockingFixed = true;
00106 
00107       fromlen = from.size();
00108       bytes   = ::recvfrom(mHandle->mFdesc, msg, length, 0,
00109                            (struct sockaddr*) &from.mAddr, &fromlen);
00110 
00111       if ( bytes == -1 )
00112       {
00113          bytesRead = 0;
00114 
00115          if ( errno == EAGAIN && ! isBlocking() )
00116          {
00117             retval.setCode(vpr::ReturnStatus::WouldBlock);
00118          }
00119          else
00120          {
00121             fprintf(stderr,
00122                     "[vpr::SocketDatagramImplBSD] ERROR: Could not read from socket (%s:%hu): %s\n",
00123                     mRemoteAddr.getAddressString().c_str(),
00124                     mRemoteAddr.getPort(), strerror(errno));
00125             retval.setCode(vpr::ReturnStatus::Fail);
00126          }
00127       }
00128       else if ( bytes == 0 )
00129       {
00130          retval.setCode(vpr::ReturnStatus::NotConnected);
00131       }
00132       else
00133       {
00134          bytesRead = bytes;
00135       }
00136    }
00137 
00138    return retval;
00139 }

vpr::ReturnStatus vpr::SocketDatagramImplBSD::sendto ( const void *  msg,
const vpr::Uint32  length,
const vpr::InetAddr to,
vpr::Uint32 bytesSent,
const vpr::Interval  timeout = vpr::Interval::NoTimeout 
)

Sends a message to the specified address.

Definition at line 141 of file SocketDatagramImplBSD.cpp.

References errno, vpr::ReturnStatus::Fail, vpr::InetAddrBSD::getAddressString(), vpr::InetAddrBSD::getPort(), vpr::SocketImplBSD::isBlocking(), vpr::FileHandleImplUNIX::isWriteable(), vpr::InetAddrBSD::mAddr, vpr::SocketImplBSD::mBlockingFixed, vpr::FileHandleImplUNIX::mFdesc, vpr::SocketImplBSD::mHandle, vpr::SocketImplBSD::mRemoteAddr, vpr::ReturnStatus::NotConnected, vpr::ReturnStatus::setCode(), vpr::InetAddrBSD::size(), vpr::ReturnStatus::success(), and vpr::ReturnStatus::WouldBlock.

00146 {
00147    vpr::ReturnStatus retval;
00148 
00149    retval = mHandle->isWriteable(timeout);
00150 
00151    if ( retval.success() )
00152    {
00153       ssize_t bytes;
00154 
00155       mBlockingFixed = true;
00156 
00157       bytes = ::sendto(mHandle->mFdesc, msg, length, 0,
00158                        (struct sockaddr*) &to.mAddr, to.size());
00159 
00160       if ( bytes == -1 )
00161       {
00162          bytesSent = 0;
00163 
00164          if ( errno == EAGAIN && ! isBlocking() )
00165          {
00166             retval.setCode(vpr::ReturnStatus::WouldBlock);
00167          }
00168          else
00169          {
00170             fprintf(stderr,
00171                     "[vpr::SocketDatagramImplBSD] ERROR: Could not send to %s:%hu on socket (%s:%hu): %s\n",
00172                     to.getAddressString().c_str(), to.getPort(),
00173                     mRemoteAddr.getAddressString().c_str(),
00174                     mRemoteAddr.getPort(), strerror(errno));
00175             retval.setCode(vpr::ReturnStatus::Fail);
00176          }
00177       }
00178       else if ( errno == EHOSTUNREACH || errno == EHOSTDOWN ||
00179                 errno == ENETDOWN )
00180       {
00181          retval.setCode(vpr::ReturnStatus::NotConnected);
00182       }
00183       else
00184       {
00185          bytesSent = bytes;
00186       }
00187    }
00188 
00189    return retval;
00190 }


The documentation for this class was generated from the following files:
Generated on Thu Jan 4 10:55:34 2007 for VR Juggler Portable Runtime by  doxygen 1.5.1