vpr::SocketDatagramImplNSPR Class Reference

NSPR implementation of the datagram socket interface. More...

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

Inheritance diagram for vpr::SocketDatagramImplNSPR:

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

Collaboration graph
[legend]
List of all members.

Public Types

typedef SocketImplNSPR Parent

Public Member Functions

 SocketDatagramImplNSPR ()
 Default constructor.
 SocketDatagramImplNSPR (const InetAddr &localAddr, const InetAddr &remoteAddr)
 Constructor.
 SocketDatagramImplNSPR (const SocketDatagramImplNSPR &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)
vpr::ReturnStatus sendto (const void *msg, const vpr::Uint32 length, const vpr::InetAddr &to, vpr::Uint32 &bytesSent, const vpr::Interval timeout=vpr::Interval::NoTimeout)

Detailed Description

NSPR implementation of the datagram socket interface.

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

Definition at line 59 of file SocketDatagramImplNSPR.h.


Member Typedef Documentation

typedef SocketImplNSPR vpr::SocketDatagramImplNSPR::Parent

Definition at line 62 of file SocketDatagramImplNSPR.h.


Constructor & Destructor Documentation

vpr::SocketDatagramImplNSPR::SocketDatagramImplNSPR (  )  [inline]

Default constructor.

Postcondition:
The member variables are initialized to default values. The socket type is set to vpr::SocketTypes::DATAGRAM.

Definition at line 74 of file SocketDatagramImplNSPR.h.

00074                             : SocketImplNSPR(SocketTypes::DATAGRAM)
00075    {
00076       /* Do nothing. */ ;
00077    }

vpr::SocketDatagramImplNSPR::SocketDatagramImplNSPR ( const InetAddr localAddr,
const InetAddr remoteAddr 
) [inline]

Constructor.

Postcondition:
The member variables are initialized to default values. The socket type is set to vpr::SocketTypes::DATAGRAM.
Parameters:
localAddr The local address to which this socket will be bound.
remoteAddr The remote address whith which this socket will communicate.

Definition at line 89 of file SocketDatagramImplNSPR.h.

00091       : SocketImplNSPR(localAddr, remoteAddr, SocketTypes::DATAGRAM)
00092    {
00093       /* Do nothing. */ ;
00094    }

vpr::SocketDatagramImplNSPR::SocketDatagramImplNSPR ( const SocketDatagramImplNSPR sock  )  [inline]

Copy constructor.

Definition at line 97 of file SocketDatagramImplNSPR.h.

References vpr::SocketImplNSPR::mLocalAddr, and vpr::SocketImplNSPR::mRemoteAddr.

00098       : SocketImplNSPR(sock)
00099    {
00100       mLocalAddr  = sock.mLocalAddr;
00101       mRemoteAddr = sock.mRemoteAddr;
00102    }


Member Function Documentation

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

Definition at line 61 of file SocketDatagramImplNSPR.cpp.

References vpr::ReturnStatus::ConnectionAborted, vpr::ReturnStatus::Fail, vpr::SocketImplNSPR::mHandle, vpr::ReturnStatus::NotConnected, vpr::NSPR_getInterval(), vpr::ErrorImplPosix::outputCurrentError(), vpr::ReturnStatus::setCode(), vpr::ReturnStatus::Timeout, vprDBG_ALL(), vprDBG_CRITICAL_LVL, vprDEBUG, vprDEBUG_FLUSH, and vpr::ReturnStatus::WouldBlock.

00066 {
00067    ReturnStatus retval;
00068    PRInt32 bytes;
00069 
00070    bytes = PR_RecvFrom(mHandle, msg, length, 0, from.getPRNetAddr(),
00071                        NSPR_getInterval(timeout));
00072 
00073    if ( bytes > 0 )
00074    {
00075       bytesRead = bytes;
00076    }
00077    else if ( bytes == -1 )
00078    {
00079       const PRErrorCode err_code = PR_GetError();
00080 
00081       bytesRead = 0;
00082 
00083       if ( err_code == PR_WOULD_BLOCK_ERROR )
00084       {
00085          retval.setCode(vpr::ReturnStatus::WouldBlock);
00086       }
00087       else if ( err_code == PR_IO_TIMEOUT_ERROR )
00088       {
00089 #if defined(WINNT)
00090          // Handle the case of a timeout error on an NT socket. We have to
00091          // tell NSPR to put the socket back into the right state. We do not
00092          // need to worry about whether the socket is blocking because the
00093          // timeout is ignored by non-blocking NSPR sockets.
00094          PR_NT_CancelIo(mHandle);
00095 #endif
00096          retval.setCode(ReturnStatus::Timeout);
00097       }
00098       else if ( err_code == PR_CONNECT_ABORTED_ERROR )
00099       {
00100          retval.setCode(vpr::ReturnStatus::ConnectionAborted);
00101       }
00102       else
00103       {
00104          std::ostringstream err_stream;
00105          vpr::Error::outputCurrentError(err_stream,
00106                                         "Could not read from socket");
00107          vprDEBUG(vprDBG_ALL, vprDBG_CRITICAL_LVL)
00108             << "[vpr::SocketDatagramImplNSPR::recvfrom()] "
00109             << err_stream.str() << std::endl << vprDEBUG_FLUSH;
00110          retval.setCode(ReturnStatus::Fail);
00111       }
00112    }
00113    else if ( bytes == 0 )      // Not connected
00114    {
00115       retval.setCode(ReturnStatus::NotConnected);
00116       bytesRead = bytes;
00117    }
00118 
00119    return retval;
00120 }

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

Definition at line 122 of file SocketDatagramImplNSPR.cpp.

References vpr::InetAddrBSD::AnyAddr, vpr::ReturnStatus::ConnectionAborted, vpr::ReturnStatus::Fail, vpr::SocketImplNSPR::mHandle, vpr::ReturnStatus::NotConnected, vpr::NSPR_getInterval(), vpr::ErrorImplPosix::outputCurrentError(), vpr::ReturnStatus::setCode(), vpr::ReturnStatus::Timeout, vprASSERT, vprDBG_ALL(), vprDBG_CRITICAL_LVL, vprDEBUG, vprDEBUG_FLUSH, and vpr::ReturnStatus::WouldBlock.

00127 {
00128    ReturnStatus retval;
00129    PRInt32 bytes;
00130 
00131 #ifdef VPR_OS_Win32
00132    vprASSERT(vpr::InetAddr::AnyAddr != to && "INADDR_ANY is not a valid desination on win32.");
00133 #endif
00134 
00135    bytes = PR_SendTo(mHandle, msg, length, 0, to.getPRNetAddr(),
00136                      NSPR_getInterval(timeout));
00137 
00138    if ( bytes == -1 )
00139    {
00140       const PRErrorCode err_code = PR_GetError();
00141 
00142       bytesSent = 0;
00143 
00144       if ( err_code == PR_WOULD_BLOCK_ERROR )
00145       {
00146          retval.setCode(vpr::ReturnStatus::WouldBlock);
00147       }
00148       else if ( err_code == PR_IO_TIMEOUT_ERROR )
00149       {
00150 #if defined(WINNT)
00151          // Handle the case of a timeout error on an NT socket. We have to
00152          // tell NSPR to put the socket back into the right state. We do not
00153          // need to worry about whether the socket is blocking because the
00154          // timeout is ignored by non-blocking NSPR sockets.
00155          PR_NT_CancelIo(mHandle);
00156 #endif
00157          retval.setCode(ReturnStatus::Timeout);
00158       }
00159       else if ( err_code == PR_CONNECT_ABORTED_ERROR )
00160       {
00161          retval.setCode(vpr::ReturnStatus::ConnectionAborted);
00162       }
00163       else if ( err_code == PR_NOT_CONNECTED_ERROR )
00164       {
00165          retval.setCode(vpr::ReturnStatus::NotConnected);
00166       }
00167       else
00168       {
00169          std::ostringstream err_stream;
00170          vpr::Error::outputCurrentError(err_stream, "Could not send message");
00171          vprDEBUG(vprDBG_ALL, vprDBG_CRITICAL_LVL)
00172             << "[vpr::SocketDatagramImplNSPR::sendto()] " << err_stream.str()
00173             << std::endl << vprDEBUG_FLUSH;
00174          retval.setCode(ReturnStatus::Fail);
00175       }
00176    }
00177    else
00178    {
00179       bytesSent = bytes;
00180    }
00181 
00182    return retval;
00183 }


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