Frage

Ich entwickle eine Anwendung, die über FTP interagieren muss. Für diese Kommunikation verwende ich derzeit C ++, Visual Studio und POCO unter Windows.

Die folgende Zeile führt zu einer bad_alloc -Ausnahme ...

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

Also ging ich runter und versuchte zuerst ein Streamsocket, scheitert auch ...

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

Wenn Sie noch weiter nach unten gehen, scheint der Bad_alloc von:

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

Dieser Konstruktor enthält: (Ich sehe im Debugger, dass _pimpl nicht initialisiert wird)

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

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

IPv4AddressImpl :: Parse enthält:

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
}

Der folgende Code mit INET_ADDR von Winsock2.h (WS2_32.lib) führt zu "etwas anderem".

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

Ich sehe nicht, was hier schief geht ... Gibt es eine Möglichkeit, dies weiter zu debuggen, oder weiß jemand, was schief geht?

War es hilfreich?

Lösung

Ich bin kein Raketenwissenschaftler, aber es sieht so aus, als müssten Sie eintreten IPv4AddressImpl() mit ia.s_addr mit einem Zeiger auf die Zeichenfolge besiedelt "127.0.0.1".

Erhalten Sie den Fehler, wenn Sie Ihre reale IP -Adresse anstelle des Loopbacks verwenden.

Und haben Sie einen FTP -Server auf diesem Computer?

Und bist du unbedingt sicher die Zeichenfolge ist "127.0.0.1"?

Aktualisieren:

Es gibt nur drei Dinge, die die Ausnahme hervorrufen können.

  • addr.empty() ist wahr, unwahrscheinlich, wenn ADDR ist "127.0.0.1".
  • is.s_addr ist INADDR_NONE, seitdem wieder unwahrscheinlich inet_addr() sollte keine Probleme mit 127.0.0.1 haben (wie Sie getestet haben).
  • der Konstruktor für IPv4AddressImpl() Gibt NULL zurück (oder wirft die bad_alloc Ausnahme selbst).

Das letzte scheint am wahrscheinlichsten zu sein. Was passiert, wenn Sie Ihren eigenen Code schreiben, um dies zu tun?

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

Außerdem, wenn Sie Breakpoint auf der "if (!_pImpl) throw..." Linie und untersuchen _pImpl:

  • Null bedeutet das :: parse zurückgegeben null und es ist das ist das IPAddress() Konstruktor werfen bad_alloc.
  • ungleich Null bedeutet :: Parse selbst warf eine Ausnahme, die nur aus dem ausgehen konnte IPv4AddressImpl() Konstrukteur.

Du könntest haben Um weiter zu debuggen, um weiter zu debuggen.

Andere Tipps

Es sieht so aus, als wäre die einzig mögliche Ursache der Anruf an

inet_addr

an der Leitung

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

Gibt inaDDR_None zurück, was dazu führt, dass 0/Null zurückgegeben wird, was die Ausnahme ausgelöst hat.

Können Sie inet_addr ("127.0.0.1") nennen und sehen, was die Ergebnisse sind? Wenn die Ergebnisse inaDDR_None sind, müssen Sie eine gute Adresse zu Inet_ADDR finden, die Ihr System glücklich macht.

Hier ist ein Link zu INET_ADDR In der MSDN -Dokumentation.

ÜberwachungSie rufen den Konstruktor an

 IPAddress("127.0.0.1");

mit einem const char*, aber der Konstruktor nimmt eine konstante Referenzen

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

Ist der Compiler intelligent genug, um das vorübergehend zu erstellen? Ich habe es mit VS 2003 ausprobiert, und es scheint in Ordnung zu sein. Ich vermute, dass die Sprache klug genug sein sollte, um damit umzugehen, aber ich dachte, ich würde darauf hinweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top