题
我正在开发一个应用程序,需要进行互动过FTP。对于这种通信我目前正在使用C++、Visual Studio和Poco。
下面的线路的结果在bad_alloc异常...
ftp = new FTPClientSession("127.0.0.1", 21);
所以我去试了初始化异第一个,也会失败...
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::分析包括:
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
}
以下代码inet_addr从Winsock2.h(ws2_32.lib)的结果"的东西别的"。
unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
msg("NONE");
else
msg("SOMETHING ELSE");
我没看到什么错误在这里...有没有办法调试,这进一步或者没有人知道什么出错了?
解决方案
我不是火箭科学家,但是它看起来像你必须步入 IPv4AddressImpl()
与 ia.s_addr
填充了一个指的串 "127.0.0.1"
.
只是出的兴趣,你得到错误,当你用你的真实IP地址,而不是环回。
而且,你有FTP服务器上运行的机器?
而且,是你 绝对 某些字符串 "127.0.0.1"
?
更新:
只有真正的三个东西,可能会导致例外。
addr.empty()
是真的,不可能如果是地址"127.0.0.1"
.is.s_addr
是INADDR_NONE
, 再次不太可能由于inet_addr()
应该没有问题与127.0.0.1(作为你已经测试)。- 本构造
IPv4AddressImpl()
returns NULL(或引发的bad_alloc
例外本身)。
这最后一个似乎最有可能的,什么发生在你自己写的代码这样做?
struct in_addr ia;
ia.s_addr = inet_addr("127.0.0.1");
IPv4Address *x = new IPv4AddressImpl(&ia);
此外,如果断点上 "if (!_pImpl) throw..."
行和审查 _pImpl
:
- 零点装置::分析返回空的
IPAddress()
构造扔bad_alloc
. - 非零点装置::分析本身,把一个异常只能从
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试了一下,看起来没问题。我怀疑语言应该足够智能来处理这个问题,但我想我会指出它。