Member 13089825 Ответов: 2

Как сравнить ip-адрес


 CString  ip_start = ctlList.GetItemText(row, s_cnIpFilterRangeStart);
     
 CString ip_end = ctlList.GetItemText(row, s_cnIpFilterRangeEnd);
here i am getting ip address and storing into strings.
when i am giving like below i should through some waringing
ip_start = 11.1.1.1
ip_end  = 1.1.1.1
could you please suggest me here


Что я уже пробовал:

rightnow i have checked only ip validation it means when user gives IP address as 111111 then i am thorwing as error
but now my request is need compare both

для проверки я сделал ниже один
ValidateIP(CString input)
{
    int retVal = FALSE;
    CString m_LocalIPaddress("0.0.0.0");
    CString m_BroadCastIPaddress("255.255.255.255");
    std::string s_input(CW2A(input.GetString()));
    std::regex pattern("[0-9][0-9a-zA-Z_!@#$%^&*()+=,.<>':;]*");
    if ((input.Compare(m_LocalIPaddress) == 0) || (input.Compare(m_BroadCastIPaddress) == 0))
    {
        return EParseResult::ENUM_NOT_SUPPORTED;
    }
    else if (std::regex_match(s_input, pattern) || (input.Find(_T(":"), 0) != RET_FAILURE))
    {
        if (input.Find(_T(".")) != RET_FAILURE)
        {
            struct sockaddr_in sa;
            retVal = InetPton(AF_INET, input, &(sa.sin_addr));
            if (retVal == RET_VALID_IP)
            {
                return EParseResult::ENUM_VALID_IPV4;
            }
        }
        else if (input.Find(_T(":")) != RET_FAILURE)
        {
            struct sockaddr_in6 sa;
            retVal = InetPton(AF_INET6, input, &(sa.sin6_addr));
            if (retVal == RET_VALID_IP)
            {
                return EParseResult::ENUM_VALID_IPV6;
            }
        }
    }
    else
    {
       return EParseResult::ENUM_IS_FQDN;
    }


так же, как я на аве с ССК начать стоит меньше Tan конечный IP

Afzaal Ahmad Zeeshan

Как вы сравниваете или с какой целью? Плюс 11.1.1.1 будет храниться только в строке, вы не можете хранить это в float (он может содержать один десятичный знак, верно?). Можете ли вы быть более конкретным, чем это?

Member 13089825

он будет сохранен как "11.1.1.1", потому что ctlList.GetItemText(row, s_cnIpFilterRangeEnd); будет rturn cstring
я хочу сравнить меньше или больше цели

Richard MacCutchan

Разберите строку на четыре составляющих значения и сравните их одно за другим.

Member 13089825

если это возможно, не могли бы вы привести какой-нибудь пример для анализа ip-адресов

Member 13089825

привет, спасибо за быстрый ответ.
ссылка, которую вы предоставили, предназначена для управления ip-адресом, но в моем случае я храню ip-адрес в строках, поэтому мне нужно разобрать жало и сравнить.
если у вас есть какой-нибудь пример на этот счет, не могли бы вы мне помочь.

Richard MacCutchan

Просто разбейте его на токены, преобразуйте каждый токен в целое число и проверьте каждый на согласованность.

Member 13089825

спасибо, что теперь он работает

2 Ответов

Рейтинг:
0

forest-321

Его можно сравнить с типом dword.
Например,вы можете использовать макросы follow.

#define str2dword(sip, ip) { \
	DWORD _2, _3, _4; \
	_stscanf_s(sip, _T("%d.%d.%d.%d"), &ip, &_2, &_3, &_4);	\
	ip = ip | (_2 << 8);			\
	ip = ip | (_3 << 16);			\
	ip = ip | (_4 << 24);			\
}
#define I4V2IP(a, b, c, d) ((DWORD)(a) | ((DWORD)(b)<<8) | ((DWORD)(c)<<16) | ((DWORD)(d)<<24))


Рейтинг:
0

CPallini

Извлеките октеты (байты) из строк IP-адреса (вы можете найти много примеров просто погуглив[^]), а затем сравнить их.