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


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. | |
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.
Definition at line 64 of file SocketDatagramImplBSD.h.
| 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.
| 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.
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 }
| 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 }
1.5.1