如何实现IP地址的递增遍历?(50分)

  • 主题发起人 主题发起人 jchc
  • 开始时间 开始时间
J

jchc

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,才50分。不过想这个问题若会,应该是很简单的。
比如,我想在程序中遍历100.100.1.1到100.100.1.220内的所有地址(或任何一个地址范围),
该如何做?我用inet_addr得到一个整数,若直接将该整数加一再用inet_ntoa换回去,就
不是原来的IP地址加一。我该怎么办?
 
什么意思?说明白点好吗?
 
没人会答吗?
 
在这里去循环
100.100.1.1--100.100.1.100
for i:=1 to 220
begin
ipstr:='100.100.1.'+inttostr(i)
inet_addr(.............你要做的工作。
end;
我写的用ping来找计算机的程序比有些小工具慢了好几倍。你的呢?
 
这太简单了!
你随便找个网络扫描的嗅探器源码看看就明白了!
 
不行。jayou的方法只能扫描子网掩码255.255.255.0的主机部分。若子网掩码为255.255.0.0
或其他东西呢?比如,从100.100.2.2到100.100.5.6?这样判断字符串太烦琐了,而且还要
考虑不能出现256的问题。
ybsnui,既然简单,请告诉我如何做好吗?我没有网络扫描器代码。而且我要在delphi下
实现(unix上当然简单了)
 
一个笨方法。
用4个变量。A、B、C、D
只对 D做 +1
if D=256 then
BEGIN
D:=0
C:=C+1
IF C=256 THEN
BEGIN
......

end;
最后就是 IntToStr(A)+'.'+IntToStr(B)+........
以后你想怎么样都行啦。



 
方法太笨了。不知道MicroSoft是如何实现的?
 
笨是笨了点,但管它白猫黑猫呢。
 
将循环改为多线程速度会快很多
 
不行。这样太繁琐,没有一点技巧。有别的高招吗?(难道你们做网络编程都是这样写的?)
 
很简单的,将IP地址改成一个整数,
如A.B.C.D,则改为A*256*256*256+B*256*256+C*256+D,然后...不用我说了吧.
其实IP协议基本上也是这么处理的.
 
touxing,好象不太对。那么说,我用inet_ntoa转换的地址192.168.1.2和192.168.1.3产生的
整数间就应该只相差一了,而实际上并不是差一。我直接把前者转换的整数家一再用inet-addr
换回来也不是192.168.1.3。这是为什么?(不信可以试试)
 
inet_ntoa我倒没用过,但我想按我说的办法应该很容易写出程序的吧,别总是依赖系统函数。
 
数据类型不能用longint 而要要用dword,一定为问题。
 
我看了一篇文章,作者说他把inet_ntoa的数字转成hex形式,结果发现。。。实际上是
把IP地址倒过来了。比如,192.127.25.1,最后出现的hex就是:(我这里没有转成16
进制,只是说明)125127192。我没证实过,不过估计没错。
 
你们的只是一个IP段的~
看我的~
edit2开始IP
edit3结束IP
listbox

procedure TForm1.Button1Click(Sender: TObject);
var
i11,i12,i13,i14,i21,i22,i23,i24,j,i:integer;
du1,du2,x: cardinal;
temp:string;
begin
try
temp:=edit2.Text;
j:=length(temp);
i:=pos('.',temp);
i11:=strtoint(copy(temp,1,i-1));
temp:=copy(temp,i+1,j-1);

j:=length(temp);
i:=pos('.',temp);
i12:=strtoint(copy(temp,1,i-1));
temp:=copy(temp,i+1,j-1);

j:=length(temp);
i:=pos('.',temp);
i13:=strtoint(copy(temp,1,i-1));
i14:=strtoint(copy(temp,i+1,j-1));
//---------------------------
temp:=edit3.Text;
j:=length(temp);
i:=pos('.',temp);
i21:=strtoint(copy(temp,1,i-1));
temp:=copy(temp,i+1,j-1);

j:=length(temp);
i:=pos('.',temp);
i22:=strtoint(copy(temp,1,i-1));
temp:=copy(temp,i+1,j-1);

j:=length(temp);
i:=pos('.',temp);
i23:=strtoint(copy(temp,1,i-1));
i24:=strtoint(copy(temp,i+1,j-1));
//-----------------------------
du1:=i11*256*256*256+i12*256*256+i13*256+i14;
du2:=i21*256*256*256+i22*256*256+i23*256+i24;
if du1>du2 then exit;
for x:=du1 to du2 do
begin
memo1.Lines.Add(inttostr(x div (256*256*256))+'.'+inttostr((x mod(256*256*256))div(256*256))+'.'+inttostr((x mod(256*256))div 256)+'.'+inttostr(x mod 256));
end;
except
showmessage('IP地址填写格式错误');
end;
 
我好穷`
给我分~
我的扫描器都这么写的`
 
后退
顶部