void TcpSocketImpl::remoteEndpoint(Endpoint& ep) const { struct sockaddr_storage addr; socklen_t slen = sizeof(addr); int ret = ::getpeername(fd(), reinterpret_cast<struct sockaddr*>(&addr), &slen); if(ret == 0) ep.impl()->init( (sockaddr*)&addr, slen ); else ep.clear(); }
void AddrInfo::resolve(const Endpoint& ep, bool passive) { clear(); const EndpointImpl* impl = ep.impl(); const std::size_t addrlen = impl->addrlen(); if(addrlen > 0) { const sockaddr* addr = impl->addr(); std::memcpy(&_addr, addr, addrlen); _special.ai_family = _addr.ss_family; _special.ai_addr = reinterpret_cast<sockaddr*>(&_addr); _special.ai_addrlen = addrlen; _special.ai_next = 0; _ai = &_special; return; } struct addrinfo hints; std::memset(&hints, 0, sizeof(hints)); // ai_socktype set to 0 does not work for QNX NTO hints.ai_socktype = SOCK_STREAM; if( passive ) hints.ai_flags |= AI_PASSIVE; _host = impl->host(); _service = impl->service(); int error = ::getaddrinfo(_host.c_str(), _service.c_str(), &hints, &_gainfo); if(error) { log_error( "getaddrinfo: " << gai_strerror(error) ); throw System::AccessFailed(_host + ':' + _service); } _ai = _gainfo; }