15 #include <sys/socket.h>
16 #include <sys/select.h>
20 #include <system_error>
30 if(-1 == lowLevelSocket) {
35 close(lowLevelSocket);
43 : lowLevelSocket(::socket(
46 theAddress->getProtocol()
53 : lowLevelSocket(existingLowLevelSocket),
56 if(-1 == lowLevelSocket) {
57 throw std::system_error(errno, std::system_category());
62 struct timeval timeout;
64 timeout.tv_sec = timeout_ms / 1000;
65 timeout.tv_usec = 1000 * (timeout_ms % 1000);
68 fd_set read; FD_ZERO(&read);
if(checkRead) { FD_SET(lowLevelSocket, &read); }
69 fd_set write; FD_ZERO(&write);
if(checkWrite) { FD_SET(lowLevelSocket, &write); }
70 fd_set error; FD_ZERO(&error);
if(checkError) { FD_SET(lowLevelSocket, &error); }
71 const int result =
::select(lowLevelSocket + 1, &read, &write, &error, 0 == timeout_ms ?
nullptr : &timeout);
73 throw std::system_error(errno, std::system_category());
76 const bool readyToRead = FD_ISSET(lowLevelSocket, &read);
77 const bool readyToWrite = FD_ISSET(lowLevelSocket, &write);
78 const bool readyWithError = FD_ISSET(lowLevelSocket, &error);
80 return SelectResult(checkRead, checkWrite, checkError, readyToRead, readyToWrite, readyWithError);
86 fds[0].fd = lowLevelSocket;
87 fds[0].events = eventsToLookFor;
89 if(-1 == ::
poll(fds, 1, timeout_ms)) {
90 throw std::system_error(errno, std::system_category());
93 return fds[0].revents;
96 ssize_t
Socket::send(
const void* buffer,
size_t length,
int flags)
const {
97 const ssize_t result =
::send(lowLevelSocket, buffer, length, flags);
102 throw std::system_error(errno, std::system_category());
106 const ssize_t result = ::recv(lowLevelSocket, buffer, length, flags);
111 throw std::system_error(errno, std::system_category());
115 const ssize_t result = ::read(lowLevelSocket, buffer, length);
120 throw std::system_error(errno, std::system_category());
124 if(-1 == ::getsockopt(lowLevelSocket, level, optionName, optionValue, optionLength)) {
125 throw std::system_error(errno, std::system_category());
130 if(-1 == ::setsockopt(lowLevelSocket, level, optionName, optionValue, optionLength)) {
131 throw std::system_error(errno, std::system_category());
140 return lowLevelSocket;
std::shared_ptr< Address > Ptr
Result of Socket::select() indicating the result status.
static Socket::Ptr create(std::shared_ptr< Address > theAddress, int existingLowLevelSocket)
int getLowLevelSocket() const
short poll(int timeout_ms, short eventsToLookFor)
ssize_t receive(void *buffer, size_t length, int flags=0) const
std::shared_ptr< Socket > Ptr
ssize_t send(const void *buffer, size_t length, int flags=0) const
void setSocketOption(int level, int optionName, const void *optionValue, socklen_t optionLength) const
std::shared_ptr< Address > getAddress() const
void getSocketOption(int level, int optionName, void *optionValue, socklen_t *optionLength) const
Socket(std::shared_ptr< Address > theAddress)
ssize_t blockingReceive(void *buffer, size_t length) const
SelectResult select(int timeout_ms, bool checkRead, bool checkWrite, bool checkError)
Namespace of the BsdSockets library.
int socketDomainToLowLevel(SocketDomain domain)
int socketTypeToLowLevel(SocketType type)