Обработка: Пусто / Нет IP-адреса - PullRequest
0 голосов
/ 10 ноября 2011

Я использую код для получения URL-адреса и IP-адреса текущей веб-страницы.Это все работает нормально, пока не появится About: Blank, и он останавливает мой код.Проблема в том, что About: Blank не возвращает IP-адрес, и это проблема.Как я могу сохранить это, даже если нет IP-адреса.Здесь он останавливается.

ppaddr2 = (int**)pHostEnt2->h_addr_list;
sockAddr2.sin_addr.s_addr = **ppaddr2;
addr2 = inet_ntoa(sockAddr2.sin_addr);

Соответствующий код ...

BSTR bstr;
pBrowser->get_LocationURL(&bstr);
std::wstring wsURL;
wsURL = bstr;

size_t DSlashLoc = wsURL.find(L"://");
if (DSlashLoc != wsURL.npos)
    {
    wsURL.erase(wsURL.begin(), wsURL.begin() + DSlashLoc + 3);
    }
DSlashLoc = wsURL.find(L"www.");
if (DSlashLoc == 0)
    {
    wsURL.erase(wsURL.begin(), wsURL.begin() + 4);
    }
DSlashLoc = wsURL.find(L"/");
if (DSlashLoc != wsURL.npos)
    {
    wsURL.erase(DSlashLoc);
    }
   wprintf(L"\n   Current Website URL: %s", wsURL.c_str());

int Newlength = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0,  NULL, NULL);
std::string NewLogURL(Newlength+1, 0); 
int Newresult = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, &NewLogURL[0],Newlength+1,  NULL, NULL);

HOSTENT *pHostEnt2;
int  **ppaddr2;
SOCKADDR_IN sockAddr2;
pHostEnt2 = gethostbyname(NewLogURL.c_str());

ppaddr2 = (int**)pHostEnt2->h_addr_list;
sockAddr2.sin_addr.s_addr = **ppaddr2;
addr2 = inet_ntoa(sockAddr2.sin_addr);

printf("\n   Current Website IP:%s", addr2); 

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

В дополнение к тому, что сказал Рашман, вы также можете проверить, что URL начинается с «http:» или «https:» перед его обработкой.

Кроме того, вы НЕ должны убирать «www»."часть.Все, что находится между ": //" и следующим "/", является именем хоста.Решите это как есть, DNS справится с этим хорошо.На самом деле, если вы удалите его, вы можете получить разные результаты.Например, «yahoo.com» преобразуется в «98.139.180.149», а «www.yahoo.com» преобразуется в «72.30.2.43».Браузер не собирается убирать "www.", Так что вам тоже не следует.

Попробуйте это:

BSTR bstr;
pBrowser->get_LocationURL(&bstr);
std::wstring wsURL(bstr, SysStringLen(bstr));
SysFreeString(bstr);

std::wstring wsHost;

size_t DSlashLoc = wsURL.find(L"://");
if (DSlashLoc != std::wstring::npos)
{
    DSlashLoc += 3;

    size_t DSlashLoc2 = wsURL.find(L"/", DSlashLoc);
    if (DSlashLoc2 != std::wstring::npos)
      wsHost = wsURL.substr(DSlashLoc, DSlashLoc2 - DSlashLoc);
    else
      wsHost = wsURL.substr(DSlashLoc);
}

if (wsHost.empty())
{
    printf("\n   Unknown Website Host");
}
else
{
    wprintf(L"\n   Website Host: %s", wsHost.c_str());

    std::string sHost;
    int Newlength = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsHost.c_str(), wsHost.length(), NULL, 0,  NULL, NULL);
    if (Newlength > 0)
    {
        sHost.resize(Newlength);
        WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsHost.c_str(), wsHost.length(), &sHost[0], Newlength, NULL, NULL);
    }

    HOSTENT *pHostEnt2 = gethostbyname(sHost.c_str());
    if (!pHostEnt2)
    {
        printf("\n   Unknown Website IP");
    }
    else if (pHostEnt2->h_addrtype != AF_INET)
    {
        printf("\n   Website does not use IPv4 addresses");
    }
    else
    {
        for (char **addr = pHostEnt2->h_addr_list; *addr != NULL; ++addr)
        {
            printf("\n   Website IP: %s", inet_ntoa(* (struct in_addr *) *addr));
        }
    }
}
1 голос
/ 10 ноября 2011

gethostbyname возвращает NULL, если не удается найти запись DNS.Просто проверьте это и выведите подходящее сообщение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...