关于IP地址问题?

silence0201 2005-06-11 05:28:18
得到IP地址,如何通过程序实现判断这个IP地址属于某个IP地址段呢??

如得到IP地址193.168.3.1,
要判断它是否属于XXX.XXX.XXX.XXX-YYY.YYY.YYY.YYY!!!!
...全文
212 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
petiteturbo 2005-06-15
  • 打赏
  • 举报
回复
学习
F117p 2005-06-12
  • 打赏
  • 举报
回复
对三,简单的就那么比较
取IP地址,然后对IP地址转换,比较前3个数
僵哥 2005-06-12
  • 打赏
  • 举报
回复
//对两个IP做比较
//IP1<IP2,返回 1
//IP1=IP2,返回 2
//IP1>IP2,返回 3
//若其中一个IP非法,则返回 -1
function IPCompare(const IP1,IP2:String):integer;
var
tmpIP1:String;
tmpIP2:String;

//测试IP地址是否非法
//非法IP地址返回 True
//否则返回False
function InvalidIpAddress(const IPAddress:String):boolean;
var
iPos:Integer;
tmpIP:String;
tmpID:Integer;
begin
Result:=false;
tmpIP:=IPAddress;
//通过StringReplace测试是否存在三个'.'号,否则非法IP
if Length(tmpIP)-Length(StringReplace(tmpIP,'.','',[rfReplaceAll]))<>3 then
begin
Result:=true;
exit;
end;
iPos:=Pos('.',tmpIP);
repeat
try
//将IP地址拆分并转换成数值
//转换失败,非法IP
if iPos<=0 then
tmpID := StrToInt(tmpIP)
else
tmpID := StrToInt(Copy(tmpIP,1,iPos-1));
//测试数值是否0~255之间的数字,否则非法IP
if (tmpID<0) or (tmpID>255) then
raise ERangeError.Create('Invalid IP Address!');
if iPos<=0 then break;
except
Result:=True;
exit;
end;
tmpIP:=Copy(tmpIP,iPos+1,Length(tmpIP)-iPos);
iPos:=Pos('.',tmpIP);
until false;
end;

//将IP地址格式化为每段数字以三位显示的字符串
//例:192.168.0.25
//格式化后成为:192.168.000.025
//非法IP返回空串('')
function FormatIPAddress(const IPAddress:String):string;
var
iPos:Integer;
tmpIP:String;
tmpID:String;
begin
Result:='';
if InvalidIPAddress(IPAddress) then exit;
tmpIP:=IPAddress;
iPos:=Pos('.',tmpIP);
repeat
if iPos<=0 then
begin
tmpID := tmpIP;
while Length(tmpID)<3 do
tmpID:='0'+tmpID;
end
else
begin
tmpID := Copy(tmpIP,1,iPos);
while Length(tmpID)<4 do
tmpID:='0'+tmpID;
end;
Result:=Result+tmpID;
if iPos<=0 then break;
tmpIP:=Copy(tmpIP,
iPos+1,
Length(tmpIP)-iPos);
iPos:=Pos('.',tmpIP);
until false;
end;

begin
Result:=-1;
tmpIP1:=FormatIPAddress(IP1);
if tmpIP1='' then exit;
tmpIP2:=FormatIPAddress(IP2);
if tmpIP2='' then exit;
//CompareString s1,s2
//s1<s2,Result:1
//s1=s2,Result:2
//s1>s2,Result:3
Result:=CompareString(LOCALE_SYSTEM_DEFAULT,
NORM_IGNORECASE,
PChar(tmpIP1),-1,
PChar(tmpIP2),-1);
end;

//测试IPTest是否在IP1与IP2范围内。
function IPInRange(const IPTest,IP1,IP2:string;
const PosCase:Boolean=False):Boolean;
var
tmpValue:Integer;
tmpIPLo:String;
tmpIPHi:String;
begin
Result:=false;
tmpIPLo:=IP1;
tmpIPHi:=IP2

//IP1和IP2是否为固定位置
//即,IP1<=IP2
if not PosCase then
begin
tmpValue:=IPCompare(IP1,IP2);
if tmpValue=-1 then exit;
if tmpValue=3 then
begin
tmpIPLo:=IP2;
tmpIPHi:=IP1
end;
end;

Result:=(IPCompare(IPTest,IP1)>1)
and
(IPCompare(IP2,IPTest)>1);
end;
僵哥 2005-06-12
  • 打赏
  • 举报
回复
//测试IP地址是否非法
//非法IP地址返回 True
//否则返回False
bool __fastcall InvalidIPAddress(const AnsiString IPAddress)
{
int iPos;
AnsiString tmpIP;
int tmpID;

tmpIP=IPAddress;
//通过StringReplace测试是否存在三个'.'号,否则非法IP
if(tmpIP.Length()-
StringReplace(tmpIP,
".",
"",
TReplaceFlags()<<rfReplaceAll
).Length()
!=3)
return true;
iPos=tmpIP.Pos(".");
while(true)
{
try
{
//将IP地址拆分并转换成数值
//转换失败,非法IP
if (iPos<=0)
tmpID = StrToInt(tmpIP);
else
tmpID = StrToInt(tmpIP.SubString(1,iPos-1));
//测试数值是否0~255之间的数字,否则非法IP
if((tmpID<0) || (tmpID>255))
throw ERangeError("Invalid IP Address!");
if (iPos<=0) break;
}
catch(...)
{
return true;
}
tmpIP=tmpIP.SubString(iPos+1,tmpIP.Length()-iPos);
iPos=tmpIP.Pos(".");
}
return false;
}
//-----------------------------------------------------------
//将IP地址格式化为每段数字以三位显示的字符串
//例:192.168.0.25
//格式化后成为:192.168.000.025
//非法IP返回空串("")
AnsiString __fastcall FormatIPAddress(const AnsiString IPAddress)
{
int iPos;
AnsiString tmpIP;
AnsiString tmpID;
AnsiString Result="";
if(InvalidIPAddress(IPAddress))return Result;
tmpIP=IPAddress;
iPos=tmpIP.Pos(".");
while(true)
{
if (iPos<=0)
{
tmpID = tmpIP;
tmpID=AnsiString::StringOfChar('0',3-tmpID.Length())+tmpID;
}
else
{
tmpID = tmpIP.SubString(1,iPos);

tmpID=AnsiString::StringOfChar('0',4-tmpID.Length())+tmpID;
}
Result+=tmpID;
if (iPos<=0) break;
tmpIP=tmpIP.SubString(
iPos+1,
tmpIP.Length()-iPos);
iPos=tmpIP.Pos(".");
}
return Result;
}
//-----------------------------------------------------------
//对两个IP做比较
//IP1<IP2,返回 1
//IP1=IP2,返回 2
//IP1>IP2,返回 3
//若其中一个IP非法,则返回 -1
int __fastcall IPCompare(const AnsiString IP1,
const AnsiString IP2)
{
AnsiString tmpIP1;
AnsiString tmpIP2;

tmpIP1=FormatIPAddress(IP1);
if (tmpIP1=="")return -1;
tmpIP2=FormatIPAddress(IP2);
if (tmpIP2=="")return -1;
//CompareString s1,s2
//s1<s2,Result:1
//s1=s2,Result:2
//s1>s2,Result:3
return CompareString(LOCALE_SYSTEM_DEFAULT,
NORM_IGNORECASE,
tmpIP1.c_str(),-1,
tmpIP2.c_str(),-1);
}
//-----------------------------------------------------------
//测试IPTest是否在IP1与IP2范围内。
bool __fastcall IPInRange(const AnsiString IPTest,
const AnsiString IP1,
const AnsiString IP2,
const bool PosCase=false)
{
int tmpValue;
AnsiString tmpIPLo;
AnsiString tmpIPHi;

tmpIPLo=IP1;
tmpIPHi=IP2;

//IP1和IP2是否为固定位置
//即,IP1<=IP2
if (!PosCase)
{
tmpValue=IPCompare(IP1,IP2);
if (tmpValue==-1)
return false;
if (tmpValue==3)
{
tmpIPLo=IP2;
tmpIPHi=IP1;
}
}

return (IPCompare(IPTest,IP1)>1)
&&
(IPCompare(IP2,IPTest)>1);
}
zyyoung 2005-06-12
  • 打赏
  • 举报
回复
ding
pp616 2005-06-12
  • 打赏
  • 举报
回复
把IP地址转换为ULONG然后判断是否是ip1<ip2<ip3这种关系就好了。
转换可以用socket库中的函数也可以直接乘一下。
a.b.c.d=a*255*255*255+b*255*255+c*255+d
ynlzl 2005-06-11
  • 打赏
  • 举报
回复
把得到的IP当作字符串处理,应该可以比较。或与小数点分隔,分别转换成数字,也可以比较呀!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧