多线程扫描IP问题求助,在线等待,急(100分)

D

dhsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我把扫描的代码放在EXECUTE里面
while not Terminateddo
begin
if ((ping_ip_start + fProcess) <= ping_ip_stop) then
begin
myping.Address := iptostr(ping_ip_start + fProcess);
if myping.Ping = 1 then
begin
cs := cs + 1;
mystt := iptostr(ping_ip_start + fProcess);
procexe;
end;
end
else
break;
end;
但这样一次只能扫描一个,速度还不行,
我就在调用的地方加了如下实现多个线程
for i := 0 to number - 1do
mythread := mythread.Create(false);
但是这样的话,同样的IP就会扫描好多次,应该是一个IP扫描一次,而同时有好多次IP一起扫描,可没想到同样的IP扫描多次,加了如下的同步也不行,请大家赐教,多谢了
while not Terminateddo
begin
entercriticalsection(cs1);
//进入临界状态
fProcess := cur_ip;
inc(cur_ip);
leavecriticalsection(cs1);
//释放临界状态
if ((ping_ip_start + fProcess) <= ping_ip_stop) then
begin
myping.Address := iptostr(ping_ip_start + fProcess);
if myping.Ping = 1 then
begin
cs := cs + 1;
mystt := iptostr(ping_ip_start + fProcess);
procexe;
end;
end
else
break;
end;

 
都建几個線程呀﹐不就搞定了嗎
 
问题是怎么建??请给出源码,行后马上给分
 
我以前写过,不过代码就不知放哪里去了,
我也是写两个线程,一个是主线程,负责建立ping的线程,
另一个是ping线程,单纯是ping,ip分配就由主线程处理,
主线程如 for i :=0 to number - 1do
mythread := mythread.Create(IP);//ip为主线程分配的ip
当然,主线程要创建一个全局变量,当ping线程达到一定值,则暂时停止创建ping线程
 
to: sandz
就是这意思,因为单是建一个线程,在扫描IP的时候还是会停顿,如果让一个线程在扫描这个IP的时候 ,再建另外一个(当然可以是好多个)线程去扫描下一个IP.
请给出代码,在线等待,代码能用的话,分不够再加,本人急用.
 
for i := 0 to number - 1do
mythread := mythread.Create(false);
改为
for i := 0 to number - 1do
mythread := mythread.Create(IP,false);
这样就不会重复IP扫描了
 
你没有理解到我的意思,
我是指建一个主线程,然后由这个线程指定一个IP,另外创建一个PING线程去ping这个IP,
而主线程则空出来再分配一个IP,再创建一个PING的线程!如些循环.
这样就可以有多个线程同时PING多个IP;
我的邮箱是sandz@21cn.com,还有不明白也可以发我邮箱
 
呵呵,对不起,是我没看清楚,呵呵,
我的代码找不到了,不过这实现起来并不难
 
to:sandz
有完整源代码吗?我初次接触多线程,为了少走弯路,请给出完整的代码,先谢谢了,
可以发到我邮箱,flashbw@163.com
to:海风
有完整源代码吗?我急用,,谢了,有请发到我邮箱
 
to:sandz
正所谓会者不难,难者不会,请指教
 
uses
Classes, SysUtils, SyncObjs, Connection, ComCtrls,Ping;
type
Tmy_scan_ping = class(TThread)
private
{ Private declarations }
fProcess : LongWord;
procedure Update_scan_ip;
protected
procedure Execute;
override;
public
FPing : TPing;
constructor Create(CreateSuspended: Boolean);
procedure set_str;
procedure set_str2;
procedure set_bar;
procedure ThreadDone(Sender : TObject);
procedure PingEchoReply(Sender : TObject;
Icmp: TObject;Error: integer);
end;

implementation
uses function_1, main, Tlookup_name;
{ Tmy_scan_ping }
constructor Tmy_scan_ping.Create(CreateSuspended: Boolean);
begin
FPing:= TPing.Create(frmMain);
FPing.Timeout:=StrToInt(frmMain.Edit12.Text);
OnTerminate :=ThreadDone;
FreeOnTerminate := True;
FPing.OnEchoReply:=PingEchoReply;
inc(ping_thread_no);
frmMain.scan_edit2.Text:=IntToStr(ping_thread_no+scan_thread_no);
inherited Create(CreateSuspended);
end;

procedure Tmy_scan_ping.Update_scan_ip;
begin
frmMain.scan_ip.Text:=iptostr(ping_ip_start + fProcess );
end;

procedure Tmy_scan_ping.Execute;
begin
inherited;
while (thread_run)do
begin
ping_CriticalSection.Enter;//进入临界状态
fProcess:=cur_ip;
inc(cur_ip);
//frmMain.scan_ip.Text:=iptostr(ping_ip_start+no);
Synchronize(Update_scan_ip);
ping_CriticalSection.Leave;//析放临界状态
if ((ping_ip_start + fProcess)<=ping_ip_stop) then
begin
FPing.Address:=iptostr(ping_ip_start + fProcess);
FPing.Ping;
end else
break;
end
end;

procedure Tmy_scan_ping.PingEchoReply(Sender, Icmp: TObject;
Error: integer);
begin
Synchronize(set_bar);
if (Error=1) then
Synchronize(set_str)
else
if not (only_ping) then
Synchronize(set_str2);
end;

procedure Tmy_scan_ping.set_bar;
begin
frmMain.Bar.Position:=cur_ip;
end;

procedure Tmy_scan_ping.set_str;
var
temp_node : TTreeNode;
bubble : TmyLookUp_Name;//查找名称
begin
temp_node:=frmMain.Tree_port.Items.Add(nil,FPing.Address);
temp_node.ImageIndex:=0;
temp_node.SelectedIndex:=0;
main_list.Add(IntToStr(Integer(temp_node.ItemId)));
main_list.Add(FPing.Address);
frmMain.scan_edit3.Text:=IntToStr(StrToInt(frmMain.scan_edit3.Text)+1);
if (frmMain.CheckBox2.Checked) then
begin
bubble := TmyLOOKUP_Name.Create(Integer(temp_node.ItemId),FPing.Address,false);
end;
frmMain.thread_time.Enabled:=true;
end;

procedure Tmy_scan_ping.set_str2;
var
temp_node : TTreeNode;
bubble : TmyLookUp_Name;//查找名称
begin
temp_node:=frmMain.Tree_port.Items.Add(nil,FPing.Address);
temp_node.ImageIndex:=1;
temp_node.SelectedIndex:=1;
main_list.Add(IntToStr(Integer(temp_node.ItemId)));
main_list.Add(FPing.Address);
if (frmMain.CheckBox2.Checked)then
begin
bubble := TMyLookUp_Name.Create(Integer(temp_node.ItemId),FPing.Address,false);
end;

frmMain.thread_time.Enabled:=true;
end;

procedure Tmy_scan_ping.ThreadDone(Sender: TObject);
begin
(Tmy_scan_ping(Sender)).FPing.Free;
Dec(ping_thread_no);
frmMain.scan_edit2.Text:=IntToStr(ping_thread_no+scan_thread_no);
if ((scan_thread_no=0)and(ping_thread_no=0)) then
begin
frmMain.Bar.Position:=0;
frmMain.scan_ip.Text:='扫描完毕,请查看...';
end;

end;

end.
加点分,我给全部原码
 
to:laoli
这个源代码我有,我要的不要这么多,只要合适我的就好,请给出我所说的能用的代码,
我分照加不误.
 
说出你的困难在哪里,我做过,不过和你的程序不一样,我可以帮你分析程序
 
to:海风
谢谢,我的困难在于如何一次扫描多个IP,而不是一个一个的来扫,这样即使用我线程技术,速度还是不行.
 
sandz说的很对,这是一个比较好的方法。
 
不好意思发错了!
你要多快的速度,感觉采用线程技术速度还可以!
 
还是我自己把解决问题了,散分,来者都有分
 
顶部