Pergunta

Estou desenvolvendo um aplicativo que precisa interagir sobre o FTP. Para esta comunicação, atualmente estou usando C ++, Visual Studio e Poco no Windows.

A linha a seguir resulta em uma exceção bad_alloc ...

ftp = new FTPClientSession("127.0.0.1", 21);

Então eu caí e tentei inicializar primeiro um streambocket, também falha ...

StreamSocket ss = new SocketAddress("127.0.0.1", 21);

Ao ir ainda mais abaixo, e parece que o Bad_Alloc vem de:

IPAddress * ip = new IPAddress("127.0.0.1");

Esse construtor contém: (vejo no depurador que _pimpl não é inicializado)

IPAddress::IPAddress(const std::string& addr)
{
_pImpl = IPv4AddressImpl::parse(addr);

if (!_pImpl) throw InvalidAddressException(addr);
}

Ipv4addressimpl :: parse contém:

static IPv4AddressImpl* parse(const std::string& addr)
{
if (addr.empty()) return 0;     
#if defined(_WIN32) 
    struct in_addr ia;
    ia.s_addr = inet_addr(addr.c_str());
    if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
        return 0;
    else
        return new IPv4AddressImpl(&ia);
#else
#if __GNUC__ < 3
    struct in_addr ia;
    ia.s_addr = inet_addr(addr.c_str());
    if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
        return 0;
    else
        return new IPv4AddressImpl(&ia);
#else
    struct in_addr ia;
    if (inet_aton(addr.c_str(), &ia))
        return new IPv4AddressImpl(&ia);
    else
        return 0;
#endif
#endif
}

O código a seguir com Inet_ADDR de Winsock2.h (WS2_32.lib) resulta em "outra coisa".

unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
    msg("NONE");
else
    msg("SOMETHING ELSE");

Não vejo o que está dando errado aqui ... Existe uma maneira de depurar isso mais ou alguém sabe o que dá errado?

Foi útil?

Solução

Não sou cientista de foguetes, mas parece que você precisa entrar IPv4AddressImpl() com ia.s_addr preenchido com um ponteiro para a corda "127.0.0.1".

Apenas fora de interesse, você recebe o erro ao usar seu endereço IP real em vez do loopback.

E você tem um servidor FTP em execução nessa máquina?

E você é absolutamente Certamente a string é "127.0.0.1"?

Atualizar:

Há apenas três coisas que podem causar a exceção.

  • addr.empty() é verdade, improvável se Addr for "127.0.0.1".
  • is.s_addr é INADDR_NONE, novamente improvável desde inet_addr() não deve ter problemas com 127.0.0.1 (como você testou).
  • o construtor para IPv4AddressImpl() retorna nulo (ou joga o bad_alloc exceção em si).

Esse último parece o mais provável, o que acontece quando você escreve seu próprio código para fazê -lo?

struct in_addr ia;
ia.s_addr = inet_addr("127.0.0.1");
IPv4Address *x = new IPv4AddressImpl(&ia);

Além disso, se você quebrar o ponto de interrupção no "if (!_pImpl) throw..." linha e examinar _pImpl:

  • Zero significa que o :: parse retornou nulo e é o IPAddress() lançamento do construtor bad_alloc.
  • diferente de zero significa :: parse em si jogou uma exceção que só poderia ser do IPv4AddressImpl() construtor.

Você pode tenho Para entrar nisso para depurar mais.

Outras dicas

Parece que a única causa possível é a chamada para

inet_addr

na linha

ia.s_addr = inet_addr(addr.c_str());

Retorna inaddr_none, o que faz com que 0/nulo seja devolvido, fazendo com que a exceção seja lançada.

Você pode ligar para o INT_ADDR ("127.0.0.1") e ver quais são os resultados? Se os resultados forem inaddr_none, você precisará encontrar um bom endereço para INT_ADDR que faça seu sistema feliz.

Aqui está um link para INT_ADDR na documentação do MSDN.

ObservaçãoVocê está chamando o construtor

 IPAddress("127.0.0.1");

com um const char*, mas o construtor faz referências const

 IPAddress::IPAddress(const std::string& str);

O compilador é inteligente o suficiente para criar isso temporário? Eu tentei com o VS 2003, e parece estar bem. Suspeito que o idioma seja inteligente o suficiente para lidar com isso, mas pensei em apontar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top