質問

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を使用した次のコードは、&quot; SOMETHING ELSE&quot;になります。

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

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

役に立ちましたか?

解決

私はロケット科学者ではありませんが、 ia.s_addr に文字列へのポインターを入力して IPv4AddressImpl()にステップインする必要があるようです>&quot; 127.0.0.1&quot;

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

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

そして、文字列が&quot; 127.0.0.1&quot; であることを絶対に確信していますか?

更新:

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

  • addr.empty()はtrueです。addrが&quot; 127.0.0.1&quot; の場合はほとんどありません。
  • is.s_addr INADDR_NONE です。これは、 inet_addr()が127.0.0.1で問題ないはずだからです(テスト済みです) )。
  • IPv4AddressImpl()のコンストラクターはNULLを返します(または bad_alloc 例外自体をスローします)。

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

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

さらに、&quot; if(!_pImpl)throw ...&quot; 行にブレークポイントを設定して、 _pImpl を調べる場合:

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

さらにデバッグするために、ステップインする ことがあります。

他のヒント

考えられる唯一の原因は、呼び出しであるようです

inet_addr

ライン上

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

INADDR_NONEを返すと、0 / NULLが返され、例外がスローされます。

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

inet_addr へのリンクです。 MSDNドキュメントで。

観察 コンストラクターを呼び出しています

 IPAddress("127.0.0.1");

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top