質問
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で試してみましたが、問題ないようです。私は言語がこれを処理するのに十分スマートでなければならないと思いますが、私はそれを指摘したいと思いました。