怎样列举出两个ip地址之间所有的ip地址?(200分)

  • 主题发起人 主题发起人 chenziyi
  • 开始时间 开始时间
C

chenziyi

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样列举出两个ip地址之间所有的ip地址?
比如:
24.126.0.0 和 24.127.191.255之间所有的ip地址(包括边界)。
最好写成一个next函数,这个函数每次取出这个地址段中的一个ip地址。
 
找了两个函数你参考:
//获取网络中的工作组
Function NetGetGroupList(var List: TStringList): Boolean;
//获取工作组中所有计算机
Function NetGetUsers(GroupName: string;
var List: TStringList): Boolean;
{=================================================================
功 能: 返回网络中的工作组
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function TPub.NetGetGroupList( var List : TStringList ) : Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
NetResource: TNetResource;
Buf: Pointer;
Count,BufSize,Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i,j: SmallInt;
NetworkTypeList: TList;
begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then
exit;//Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then
Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1do
//记录各个网络类型的信息
begin
NetworkTypeList.Add(p);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then
exit;
for j := 0 to NetworkTypeList.Count-1do
//列出各个网络类型中的所有工作组名称
begin
//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then
break;//执行失败
while truedo
//列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then
break;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1do
//列举各个工作组的信息
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then
break;//执行失败
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
end;

{=================================================================
功 能: 列举工作组中所有的计算机
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function TPub.NetGetUsers(GroupName: string;
var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @GroupName[1];//指定工作组名称
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息
//获取指定工作组的网络资源句柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then
Exit;
//执行失败
while Truedo
//列举指定工作组的网络资源
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then
break;//资源列举完毕
if (Res <> NO_ERROR) then
Exit;//执行失败
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1do
//列举工作组的计算机名称
begin
//获取工作组的计算机名称,+2表示删除"//",如//wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName + 2);
inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then
exit;//执行失败
Result := True;
FreeMem(Buf);
end;
 
将IP转换为一个整数,在两个整数之间剃增,再将整数转为IP。
如一个IP地址如下形式:a.b.c.d
将其转为整数为:a*256*256*256+b*256*256+c*256+d
 
以下是用链表实现的一些想法,具体的还是你自己做
type
pips=^ips
ips=record
next:pips
add:string;
end;
var iphead:pips=nil
getiprange(a1,a2:String):pointer;
var s1,s2,s3,s4:string
s5,s6,s7,s8:string
p:pips;
begin
s1:=Fetch(a1,'.');
s2:=Fetch(a1,'.');
s3:=Fetch(a1,'.');
s4:=a1;
s5:=Fetch(a2,'.');
s6:=Fetch(a2,'.');
s7:=Fetch(a2,'.');
s8:=a2;
freeips;(u write yourself)
for i:=strtoint(s1) to strtoint(s5)do
begin
p:=new(pips);
p:=.....
ned.
.....
 
我觉得blue2000的方法应该是可行的,希望找一个效率比较高的算法。
 
IPv4就是一个32位的整数值嘛,自然递增就好了
IPv6就不清楚了,呵呵
 
關注,幫你頂一下,希望你能給點分!
 
按照blue2000的想法,实现如下:(经过测试)
function nextip(startip,endip:string):string;
var
i:integer;
a0,a1,a2,a3,a:int64;
b0,b1,b2,b3,b:int64;
templist1,templist2:Tstringlist;
curip:string;
begin
//210.0.0.0:211.255.255.255
templist1:=Tstringlist.Create;
templist1.Capacity:=20;
templist2:=Tstringlist.Create;
templist2.Capacity:=20;
///////////////////////////////
split(startip,'.',templist1);
split(endip,'.',templist2);
curip:='';
///////////////////////////////////
a0:=strtoint(templist1.Strings[0]);
a1:=strtoint(templist1.Strings[1]);
a2:=strtoint(templist1.Strings[2]);
a3:=strtoint(templist1.Strings[3]);
b0:=strtoint(templist2.Strings[0]);
b1:=strtoint(templist2.Strings[1]);
b2:=strtoint(templist2.Strings[2]);
b3:=strtoint(templist2.Strings[3]);
a:=a0*16777216+a1*65536+a2*256+a3;
b:=b0*16777216+b1*65536+b2*256+b3;
if a>=b then
result:='-1'
else
begin
a0:=(a+1) div 16777216;
a1:=((a+1)-a0*16777216) div 65536;
a2:=((a+1)-a0*16777216-a1*65536) div 256;
a3:=(a+1) mod 256;
result:=inttostr(a0)+'.'+inttostr(a1)+'.'+inttostr(a2)+'.'+inttostr(a3);
end;
templist1.free;
templist2.free;
end;
 
多人接受答案了。
 
后退
顶部