我有一台设备A,是TCP/IP连接的。此设备要密码A才能进入到管理界面。设备的SDK有一个清除密码的函数,可以用来清除设备的管理权限。现在的问题是我不知道此设备的具体IP地址。只知道是在192.168.1.2至192.168.1.254之间,
为了清除设备上的密码,我目前使用的是for i:=1 to 254 do 的循环。这样子太慢了,
每个IP都要尝试连接,每个IP大约要耗时20秒才知道成不成功我能不能将这个做成多线程的。开它几十上百个线程。具体要怎么设计啊,我目前的代码如下:(太慢了啊)for i:= 1 to 254 do
begin
IpAdd := '192.168.1.' + inttostr(i);
if DevClearPassword(IpAdd) = true
begin
break;
end
end多线程要怎么做?
为了清除设备上的密码,我目前使用的是for i:=1 to 254 do 的循环。这样子太慢了,
每个IP都要尝试连接,每个IP大约要耗时20秒才知道成不成功我能不能将这个做成多线程的。开它几十上百个线程。具体要怎么设计啊,我目前的代码如下:(太慢了啊)for i:= 1 to 254 do
begin
IpAdd := '192.168.1.' + inttostr(i);
if DevClearPassword(IpAdd) = true
begin
break;
end
end多线程要怎么做?
你的IP是在192.168.1.2至192.168.1.254之间,不可能每一个IP都有连设备吧?
那就先把连接有设备的IP找出来(这个应该能容易点吧),得到一个子集,
然后再用你的方法遍历这个子集
b: Boolean = False;
cs: TRTLCriticalSection;
ip: array of Integer;procedure f(p: Pointer); stdcall;
begin
EnterCriticalSection(cs);
if not b then
b := DevClearPassword('192.168.1.' + IntToStr(Integer(p^)));
LeaveCriticalSection(cs);
end;procedure TForm1.Button1Click(Sender: TObject);
var
dw: array[0..253] of DWORD;
i: Integer;
begin
for i := 1 to 254 do
begin
ip[i - 1] := i;
CloseHandle(CreateThread(nil, 0, @f, @ip[i - 1], 0, dw[i - 1]));
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(cs);
SetLength(ip, 254);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(cs);
end;
procedure ThreadDo(P:Pstring);
var
ipadd:string;
begin
try
if not assigned(p) then exit;
ipadd:=P^;
if DevClearPassword(IpAdd) = true
begin
break;
end
finally
Endthread(0);
end;
end;function myfunction:integer;
var
Pipadd:Pstring;
i:integer;
t:Cardinal;
begin
for i:= 1 to 254 do
begin
new(Pipadd);
Pipadd^:='192.168.1.' + inttostr(i);;
result:=beginthread(nil,0,@ThreadDo,Pipadd,0,t);
end;
end;
我就是不知道连接的设备的IP啊,如果知道IP或知道IP的子集那就好办了,就是得到IP相当耗时间。。
清除密码倒是不耗时。