Pregunta

Estoy desarrollando una aplicación que necesita interactuar a través de FTP. Para esta comunicación, actualmente estoy usando C ++, Visual Studio y Poco en Windows.

La siguiente línea da como resultado una excepción bad_alloc ...

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

Así que bajé e intenté inicializar un StreamSocket primero, también falla ...

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

Al ir aún más abajo, y parece que el bad_alloc viene de:

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

Ese constructor contiene: (veo en el depurador que _pImpl no está inicializado)

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

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

IPv4AddressImpl :: parse contiene:

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
}

El siguiente código con inet_addr de Winsock2.h (ws2_32.lib) da como resultado " ALGO MÁS " ;.

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

No veo qué está mal aquí ... ¿Hay alguna manera de depurar esto o alguien sabe qué está mal?

¿Fue útil?

Solución

No soy un científico de cohetes, pero parece que tendrá que ingresar a IPv4AddressImpl () con ia.s_addr poblado con un puntero a la cadena " 127.0.0.1 " .

Solo por interés, ¿obtiene el error cuando usa su dirección IP real en lugar del bucle invertido?

¿Y tiene un servidor FTP ejecutándose en esa máquina?

Y, ¿estás absolutamente seguro de que la cadena es " 127.0.0.1 " ?

Update:

Solo hay realmente tres cosas que pueden causar la excepción.

  • addr.empty () es verdadero, es poco probable que addr sea " 127.0.0.1 " .
  • is.s_addr es INADDR_NONE , de nuevo poco probable ya que inet_addr () no debería tener problemas con 127.0.0.1 (como ha probado ).
  • el constructor para IPv4AddressImpl () devuelve NULL (o lanza la excepción bad_alloc ).

Ese último parece el más probable, ¿qué sucede cuando escribes tu propio código para hacerlo?

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

Además, si rompe el punto " si (! _pImpl) lanza ... " y examina _pImpl :

  • cero significa que :: parse devolvió NULL y es el constructor IPAddress () lanzando bad_alloc .
  • no cero significa que :: el análisis mismo lanzó una excepción que solo podría ser del constructor IPv4AddressImpl () .

Es posible que tenga para intervenir y depurar más.

Otros consejos

Parece que la única causa posible es la llamada a

inet_addr

en la línea

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

devuelve INADDR_NONE, lo que hace que se devuelva 0 / NULL, provocando la excepción.

¿Puedes llamar a inet_addr (" 127.0.0.1 ") y ver cuáles son los resultados? Si los resultados son INADDR_NONE, necesitará encontrar una buena dirección para inet_addr que haga feliz a su sistema.

Aquí hay un enlace a inet_addr en la documentación de MSDN.

Observación Estás llamando al constructor

 IPAddress("127.0.0.1");

con un const char *, pero el constructor toma una referencia const

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

¿el compilador es lo suficientemente inteligente como para crear ese temporal? Lo probé con VS 2003, y parece estar bien. Sospecho que el lenguaje debería ser lo suficientemente inteligente como para manejar esto, pero pensé que lo señalaría.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top