Example #1
0
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();
}
Example #2
0
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;
}