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

vpr::SocketDatagramImplBSD Class Reference

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

#include <SocketDatagramImplBSD.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 Methods

 SocketDatagramImplBSD ()
 Default constructor. More...

 SocketDatagramImplBSD (const InetAddr &local_addr, const InetAddr &remote_addr)
 Constructs a datagram socket using the given addresses as defaults for communication channels. More...

 SocketDatagramImplBSD (const SocketDatagramImplBSD &sock)
 Copy constructor. More...

vpr::ReturnStatus recvfrom (void *msg, const vpr::Uint32 length, const int flags, vpr::InetAddr &from, vpr::Uint32 &bytes_read, const vpr::Interval timeout=vpr::Interval::NoTimeout)
 Receives a message from the specified address. More...

vpr::ReturnStatus sendto (const void *msg, const vpr::Uint32 length, const int flags, const vpr::InetAddr &to, vpr::Uint32 &bytes_sent, const vpr::Interval timeout=vpr::Interval::NoTimeout)
 Sends a message to the specified address. More...


Detailed Description

Implementation class for datagram sockets using the BSD sockets interface.

Definition at line 58 of file SocketDatagramImplBSD.h.


Member Typedef Documentation

typedef SocketImplBSD vpr::SocketDatagramImplBSD::Parent
 

Definition at line 61 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.

References vpr::SocketTypes::DATAGRAM.

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

vpr::SocketDatagramImplBSD::SocketDatagramImplBSD const InetAddr   local_addr,
const InetAddr   remote_addr
 

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:
local_addr  The local address for this socket. This is used for binding the socket.
remote_addr  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.

References vpr::SocketTypes::DATAGRAM, and vpr::InetAddr.

00071    : SocketImplBSD(local_addr, remote_addr, 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::SocketTypes::DATAGRAM, 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,
const int    flags,
vpr::InetAddr   from,
vpr::Uint32   bytes_read,
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::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.

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

vpr::ReturnStatus vpr::SocketDatagramImplBSD::sendto const void *    msg,
const vpr::Uint32    length,
const int    flags,
const vpr::InetAddr   to,
vpr::Uint32   bytes_sent,
const vpr::Interval    timeout = vpr::Interval::NoTimeout
 

Sends a message to the specified address.

Definition at line 142 of file SocketDatagramImplBSD.cpp.

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

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


The documentation for this class was generated from the following files:
Generated on Sun May 2 14:47:04 2004 for VR Juggler Portable Runtime by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002