void SocketImpl::bind6(const SocketAddress& address, bool reuseAddress, bool ipV6Only) { #if defined(POCO_HAVE_IPv6) if (address.family() != IPAddress::IPv6) throw Poco::InvalidArgumentException("SocketAddress must be an IPv6 address"); if (_sockfd == POCO_INVALID_SOCKET) { init(address.af()); } #ifdef IPV6_V6ONLY setOption(IPPROTO_IPV6, IPV6_V6ONLY, ipV6Only ? 1 : 0); #else if (ipV6Only) throw Poco::NotImplementedException("IPV6_V6ONLY not defined."); #endif if (reuseAddress) { setReuseAddress(true); setReusePort(true); } int rc = ::bind(_sockfd, address.addr(), address.length()); if (rc != 0) error(address.toString()); #else throw Poco::NotImplementedException("No IPv6 support available"); #endif }
void SocketImpl::connect(const SocketAddress& address, const Poco::Timespan& timeout) { if (_sockfd == POCO_INVALID_SOCKET) { init(address.af()); } setBlocking(false); try { #if defined(POCO_VXWORKS) int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length()); #else int rc = ::connect(_sockfd, address.addr(), address.length()); #endif if (rc != 0) { int err = lastError(); if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK) error(err, address.toString()); if (!poll(timeout, SELECT_READ | SELECT_WRITE | SELECT_ERROR)) throw Poco::TimeoutException("connect timed out", address.toString()); err = socketError(); if (err != 0) error(err); } } catch (Poco::Exception&) { setBlocking(true); throw; } setBlocking(true); }
bool FTPClientSession::sendEPRT(const SocketAddress& addr) { std::string arg("|"); arg += addr.af() == AF_INET ? '1' : '2'; arg += '|'; arg += addr.host().toString(); arg += '|'; arg += NumberFormatter::format(addr.port()); arg += '|'; std::string response; int status = sendCommand("EPRT", arg, response); if (isPositiveCompletion(status)) return true; else if (isPermanentNegative(status)) return false; else throw FTPException("EPRT command failed", response, status); }
void SocketImpl::bind(const SocketAddress& address, bool reuseAddress) { if (_sockfd == POCO_INVALID_SOCKET) { init(address.af()); } if (reuseAddress) { setReuseAddress(true); setReusePort(true); } #if defined(POCO_VXWORKS) int rc = ::bind(_sockfd, (sockaddr*) address.addr(), address.length()); #else int rc = ::bind(_sockfd, address.addr(), address.length()); #endif if (rc != 0) error(address.toString()); }
void SocketImpl::connectNB(const SocketAddress& address) { if (_sockfd == POCO_INVALID_SOCKET) { init(address.af()); } setBlocking(false); #if defined(POCO_VXWORKS) int rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length()); #else int rc = ::connect(_sockfd, address.addr(), address.length()); #endif if (rc != 0) { int err = lastError(); if (err != POCO_EINPROGRESS && err != POCO_EWOULDBLOCK) error(err, address.toString()); } }
void SocketImpl::connect(const SocketAddress& address) { if (_sockfd == POCO_INVALID_SOCKET) { init(address.af()); } int rc; do { #if defined(POCO_VXWORKS) rc = ::connect(_sockfd, (sockaddr*) address.addr(), address.length()); #else rc = ::connect(_sockfd, address.addr(), address.length()); #endif } while (rc != 0 && lastError() == POCO_EINTR); if (rc != 0) { int err = lastError(); error(err, address.toString()); } }