#include <vpr/IO/Socket/SocketDatagram.h>
Inheritance diagram for vpr::SocketDatagramImplNSPR:


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) |
This is used in conjunction with vpr::SocketConfiguration to create the typedef vpr::SocketDatagram.
Definition at line 59 of file SocketDatagramImplNSPR.h.
Definition at line 62 of file SocketDatagramImplNSPR.h.
| vpr::SocketDatagramImplNSPR::SocketDatagramImplNSPR | ( | ) | [inline] |
Default constructor.
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.
| 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 }
| 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 }
1.5.1