★★★提供300分求解: IP扫描问题★★★(300分)

  • 主题发起人 主题发起人 Neffpb
  • 开始时间 开始时间
N

Neffpb

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想搜索一下局域网内(由于是用TCP/IP协议,因此这对Internet也是适合的吧)
的资源,看有没有人开放80端口。本人做了一个程序,在WinNT下使用没有任何问题,
但在Win98下扫描总是失败,不知何解,请高手们不吝赐教,本人将感激不尽。

本人代码简介如下(采用多线程):

【主线程部分】:
var
sk: array [0..99] of MySocket;
addr: Tsockaddr;
lst: TList;
CurScanIP: string;
。。。。。

//线程结束时的处理过程:
procedure TForm1.OnThreadEnd(Sender: TObject);
begin
Index:=lst.IndexOf(Sender); //查找结束了的线程的序号。
lst.Delete(Index);

if CurScanIP=EndIP then //如果扫描结束则退出。
exit;

addr.sin_addr.s_addr :=inet_addr(Pchar(CurScanIP));
addr.sin_port:=htons(80);

sk[Index]:=MySocket.Create(ListBox1, addr, Timeout);
sk[Index].OnTerminate:=OnThreadEnd; //线程结束时要作的处理。

lst.Add(sk[Index]); //保存已使用了的线程名。
end;

//当点击“开始扫描”按钮时:
procedure TForm1.btStartClick(Sender: TObject);
begin
CurScanIP:=StartIP; //CurScanIP为当前要进行扫描的IP地址,初始值为某一起始IP地址。
for i:=0 to 99 do
begin
addr.sin_family :=AF_INET;
addr.sin_addr.s_addr :=inet_addr(Pchar(CurScanIP));
addr.sin_port:=htons(80);

sk:=MySocket.Create(ListBox1, addr, Timeout); //ListBox1 是用于显示扫描结果的,Timeout为超时。
sk.OnTerminate:=OnThreadEnd; //线程结束时要作的处理。

lst.Add(sk); //保存已使用了的线程名。
Inc(IPScaned); //IP地址加一,挑选出下一个IP地址。
end;
end;

【线程部分】:
type
MySocket = class(TThread)
private
{ Private declarations }
Tlst: TListBox;
Taddr: TSockAddr;
TInterval: integer;
protected
procedure Execute; override;
procedure AddItem;
public
constructor create(ListBox: TListBox; addr: TSockAddr; Timeout: integer);

end;

。。。。。

procedure MySocket.AddItem;
begin
Tlst.Items.Add(inet_ntoa(taddr.sin_addr));
end;

constructor MySocket.create(ListBox: TListBox; addr: TSockAddr; Timeout: integer);
begin
inherited create(False);

Tlst:=ListBox;
Taddr:=addr;
TInterval:=Timeout;

FreeOnTerminate:=True;

end;

procedure MySocket.Execute;
var
wsaData: TWSAData;
skt: TSocket;
Re: integer;
begin
Try
if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
exit;

//建立Socket。
skt:=socket(AF_INET,SOCK_STREAM,0);
if skt=INVALID_SOCKET then //创建失败时。
exit;

//建立连接。
Re:=connect(skt,Taddr,sizeof(Taddr));
if Re=0 then //连接成功时,写入消息。
Synchronize(AddItem);

if Terminated then
exit;
finally
closesocket(skt);
WSACleanup;
end;
end;

=================================================================
本人程序的主要问题:
扫描和自己一个网段(如:本人IP为172.133.199.1,则扫描172.133.x.x的
[x为任意地址]IP范围没有错误; 但是扫描如192.168.x.x网址则开始很慢,停止
扫描后又重新一遍扫描数次后,扫描时所有地址一下就扫描过了,没有任何返回结果。
这令我很不解。 我采用的是Win Socket,按理说应该是没问题的呀??

请高手们帮忙解决一下问题:
1、如何使得能在Win98下扫描IP(80端口为例)?
2、是否有方法控制延迟?

请大家不吝赐教,再次感激不尽!
 
1.你的IP是172.133.199.1,自然无法扫描192.168.x.x,因为你们不在同一子网里。除非有路由器
转发。你可以先用ping试一下,如果ping不同,说明IP层不通,TCP连接自然是建不起来的。
2.Socket API在win98/2k下应该没有区别,报什么错了吗?
3.延迟指什么,是指connect用的时间吗?
 
To 【zw84611】回答:
1、路由器肯定是有的,因为我在WinNT下扫描过是可以行得通的;
2、我设置了一个显示报错的程式,但只有一小部分IP站点显示为10060,
其它的没有显示(同时在WinNT下扫描时,能扫描到很多的IP站点开放80端口)。
3、是的,是指Connect的延迟时间(默认好像是30秒吧),不知道有没有
办法改?

我现在怀疑的是: 问题是不是发生在我的多线程机制上?

要不这样也好: 有没有哪位大虾能提供一份Win98下行得通的扫描代码让我参考
一下。总之,如果大家愿意帮忙,本人实在是感激不仅。本人愿意在程序
中加入提供了关键帮助的大富翁的名字。
 
1.在98下最好不要一次开这么多线程,你一次开了100个,在98下可能是会有问题。可以一次开3到5个。
2.Connect的延迟时间可能不太好改,也许可以用非阻塞方式
 
回复【zw84611】:
首先非常感谢你这么关心这个问题。也请你继续支持。

只开3到5个线程的话,那扫描过程也太慢了(和WinNT情况没的比了)。
我听人说过:Win98下最多可开98个线程。我曾将线程数改到了50,仍然
是没有作用。唉,当真是奇怪了。。

还有其他热心人士愿意共同商讨吗?
我愿意再加200分以求一个正解。
 
有没有大侠愿意帮忙哪??
本人的这个问题确实有点急。。。


 
唉,人才凋零了。。。。。。。

结束,将分全部赠送给愿意帮忙的 zw84611, 以资鼓励!
 
唉,人才凋零了。。。。。。。

结束,将分全部赠送给愿意帮忙的 zw84611, 以资鼓励!
 
后退
顶部