SOCKET SocketBase::doAccept(Address& fromaddr) throw(NetworkException) { if ( state == LISTENING ) { SOCKET newsock; newsock= accept(sockfd, fromaddr.getSockaddr(), fromaddr.getSockaddrLenPointer()); if ( newsock == INVALID_SOCKET ) { lastError = GET_NET_ERROR(); if ( ! IS_ACCEPT_IGNORABLE(lastError) ) { std::stringstream msg; msg << "Accept error: " << NETSTRERROR(lastError); LOGGER.warning("%s", msg.str().c_str()); } } return newsock; } else { LOGGER.warning("Trying to accept on an unlistening socket [%s]", getStateString()); } return SOCKET_ERROR; }
int SocketBase::doSendTo(const Address& toaddr, const void* data, size_t len) throw(NetworkException) { if ( state == BOUND ) { int res = sendto(sockfd, (const char*) data, len, SEND_FLAGS, toaddr.getSockaddr(), toaddr.getSockaddrLen()); if(res == SOCKET_ERROR) { lastError = GET_NET_ERROR(); if ( ! IS_SENDTO_IGNORABLE(lastError) ) { std::stringstream msg; msg << "Send error: " << NETSTRERROR(lastError); LOGGER.warning("%s", msg.str().c_str()); } return 0; } return res; } else { LOGGER.warning("Trying to sendto in an unbound socket [%s]", getStateString()); } return 0; }
size_t SocketBase::doReceiveFrom(Address& fromaddr, void* buffer, size_t len) throw(NetworkException) { if ( state == BOUND || state == CONNECTED ) { int res = recvfrom(sockfd, (char*) buffer, len, RECV_FLAGS, fromaddr.getSockaddr(), fromaddr.getSockaddrLenPointer()); if ( res == SOCKET_ERROR ) { lastError = GET_NET_ERROR(); if ( ! IS_RECVFROM_IGNORABLE(lastError) ) { std::stringstream msg; msg << "ReceiveFrom error: " << NETSTRERROR(lastError); LOGGER.warning("%s", msg.str().c_str()); } return 0; } return res; } else { LOGGER.warning("Trying to receivefrom on an not bound or conected socket [%s]", getStateString()); } return 0; }
void SocketBase::bindSocketTo(const Address& toaddr) throw(NetworkException) { if ( state == CONFIGURED ) { int res = bind(sockfd, toaddr.getSockaddr(), toaddr.getSockaddrLen()); if(res == SOCKET_ERROR) { lastError = GET_NET_ERROR(); doClose(); std::stringstream msg; msg << "Couldn't bind socket to address '" << toaddr.getIP() << "' port " << toaddr.getPort() << ": " << NETSTRERROR(lastError); throw NetworkException(msg.str()); } SocketManager::addSocket(this); state = BOUND; } else { LOGGER.warning("Trying to bind to a socket != CONFIGURED [%s]", getStateString()); } }