我正在开发一个应用程序,需要进行互动过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_addrINADDR_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试了一下,看起来没问题。我怀疑语言应该足够智能来处理这个问题,但我想我会指出它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top