0

FTPを介して対話する必要があるアプリケーションを開発しています。この通信には、現在WindowsでC ++、Visual Studio、Pocoを使用しています。

次の行では、bad_alloc例外が発生します。

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

だから私はダウンして最初にStreamSocketを初期化しようとしましたが、失敗します...

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

さらに下に行くと、bad_allocは次の場所から来ているようです。

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

そのコンストラクターには次のものが含まれます:(デバッガーで_pImplが初期化されていないことがわかります)

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

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

IPv4AddressImpl :: parseに含まれるもの:

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
}

Winsock2.h(ws2_32.lib)のinet_addrを含む次のコードは、「SOMETHINGELSE」になります。

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

ここで何が問題になっているのかわかりません...これをさらにデバッグする方法はありますか、それとも誰かが何が問題になっているのか知っていますか?

4

2 に答える 2

1

私はロケット科学者ではありませんが、string へのポインターが設定されたIPv4AddressImpl()状態でステップインする必要があるようです。ia.s_addr"127.0.0.1"

興味深いことに、ループバックの代わりに実際の IP アドレスを使用するとエラーが発生しますか。

また、そのマシンで FTP サーバーを実行していますか?

そして、文字列が であると確信しています"127.0.0.1"?

アップデート:

例外を引き起こす可能性があるのは、実際には 3 つだけです。

  • addr.empty()addr が の場合は真です"127.0.0.1"
  • is.s_addr127.0.0.1で問題はないはずなINADDR_NONEので、これもありそうにありません(テストしたように)。inet_addr()
  • のコンストラクターは NULL を返します (または例外自体IPv4AddressImpl()をスローします)。bad_alloc

最後の 1 つが最も可能性が高いと思われますが、それを行う独自のコードを作成するとどうなりますか?

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

さらに、"if (!_pImpl) throw..."行にブレークポイントを設定して調べると、次のようになり_pImplます。

  • ゼロは、 ::parse が NULL を返したことを意味し、IPAddress()コンストラクターがスローしていbad_allocます。
  • ゼロ以外の場合、::parse 自体が、IPv4AddressImpl()コンストラクターからのみ発生する可能性のある例外をスローしたことを意味します。

さらにデバッグするには、それにステップインする必要がある場合があります。

于 2009-04-30T13:50:59.500 に答える
0

考えられる唯一の原因は、

inet_addr

ライン上

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

INADDR_NONEを返します。これにより、0 / NULLが返され、例外がスローされます。

inet_addr( "127.0.0.1")を呼び出して、結果を確認できますか?結果がINADDR_NONEの場合、システムを満足させるinet_addrへの適切なアドレスを見つける必要があります。

これは、MSDNドキュメントのinet_addrへのリンクです。

観察 あなたはコンストラクターを呼んでいます

 IPAddress("127.0.0.1");

const char *を使用しますが、コンストラクターはconst参照を取ります

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

コンパイラはその一時的なものを作成するのに十分賢いですか?VS 2003で試してみましたが、問題ないようです。言語はこれを処理するのに十分賢いはずだと思いますが、私はそれを指摘したいと思いました。

于 2009-04-30T13:47:39.477 に答える