문제

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을 사용한 다음 코드는 "다른 것"을 초래합니다.

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() Addr이라면 사실입니다 "127.0.0.1".
  • is.s_addr ~이다 INADDR_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:

  • Zero는 :: 구문 분석을 의미합니다. IPAddress() 생성자 던지기 bad_alloc.
  • 0이 아닌 수단 :: 구문 분석 자체는 IPv4AddressImpl() 건설자.

당신은 할 수있다 가지다 더 이상 디버그를하기 위해.

다른 팁

유일한 원인은

inet_addr

라인에

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

inaddr_none을 반환하여 0/null을 반환하여 예외가 발생합니다.

inet_addr ( "127.0.0.1")을 호출하고 결과가 무엇인지 볼 수 있습니까? 결과가 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