如何比较IP地址 [英] How to compare ip address

查看:120
本文介绍了如何比较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





我的尝试:





What I have tried:

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



for验证我在下面做了一个


for validation i did below one

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;
    }





所以同样的方式我对cck开始可以减少tan end ip



so same way i ave to cck start sould is less tan end ip

推荐答案

%^& *()+ =,。<>':;] *);
if((input.Compare(m_LocalIPaddress)== 0)| |(input.Compare(m_BroadCastIPaddress)== 0))
{
返回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)
{
返回EParseResult :: ENUM_VALID_IPV4;
}
}
else if(input.Find(_T(:))!= RET_FAILURE)
{
struct sockaddr_in6 sa ;
retVal = InetPton(AF_INET6,输入和&(sa.sin6_addr));
if(retVal == RET_VALID_IP)
{
返回EParseResult :: ENUM_VALID_IPV6;
}
}
}
其他
{
返回EParseResult :: ENUM_IS_FQDN;
}
%^&*()+=,.<>':;]*"); 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; }





所以同样的方式我开始使用cck开始的时候更少了晒黑了



so same way i ave to cck start sould is less tan end ip


可以与dword类型进行比较。

例如,你可以使用跟随宏。

It can be compared with dword type.
For example, you can use follow macros.
#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))


从IP字符串中提取octects(字节)(你可能会发现许多例子只是谷歌搜索 [ ^ ])然后比较它们。
Extract the octects (bytes) from the IP strings (you may find many examples just Googling[^]) and then compare them.


这篇关于如何比较IP地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆