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 的代码会导致“SOMETHING ELSE”。

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

我不是火箭科学家,但看起来你必须IPv4AddressImpl()使用ia.s_addr指向 string 的指针进入"127.0.0.1"

只是出于兴趣,当您使用真实 IP 地址而不是环回时,您是否会收到错误消息。

并且,您在那台机器上运行 FTP 服务器吗?

而且,您绝对确定字符串是"127.0.0.1"吗?

更新:

只有三件事会导致异常。

  • addr.empty()为真,如果 addr 为 ,则不太可能"127.0.0.1"
  • is.s_addrINADDR_NONE,同样不太可能,因为inet_addr()127.0.0.1 应该没有问题(正如你所测试的那样)。
  • 的构造函数IPv4AddressImpl()返回 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

  • 零表示 ::parse 返回 NULL 并且它是IPAddress()构造函数 throwing 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 回答