|
С tspClient не знаю, но так можно:
| type TCMSocketMessage = record Msg: Cardinal; Socket: TSocket; SelectEvent: Word; SelectError: Word; Result: Longint; end;
var socks:integer;
procedure TForm1.Button5Click(Sender: TObject); var tmp:integer; begin tmp:=strtoint(edit1.text); if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end; ipa[1]:=tmp; tmp:=strtoint(edit3.text); if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end; ipa[2]:=tmp; tmp:=strtoint(edit4.text); if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end; ipa[3]:=tmp; tmp:=strtoint(edit5.text); if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end; ipa[4]:=tmp; st:=tmp; tmp:=strtoint(edit6.text); if (tmp>255)or(tmp<1) then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end; en:=tmp; port:=StrToINT(Edit7.Text); ipi:=st; progressbar1.min:=st; progressbar1.max:=en; progressbar1.position:=st; ipscanactive:=true; timer1.enabled:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); var skt:tsocket; sa:SockAddr_in; // addr:in_addr; a:integer; estr:string; label showerror,cont; begin
if ipscanactive=false then begin // if socks=0 then begin // wsacleanup; // timer1.enabled:=false; // end; exit; end; if socks>=255 then exit;
skt:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP); sa.sin_port:=htons(port); ipa[4]:=ipi; sa.sin_addr.S_addr:=ip; sa.sin_family:=PF_INET; socks:=socks+1; wsaasyncselect(skt,form1.handle,WM_USER+1,FD_CONNECT or FD_READ);
a:=connect(skt,sa,sizeof(sa)); if a=-1 then begin a:=wsagetlasterror; estr:=''; case a of WSAENETDOWN: begin estr:='Network subsystem is down'; goto showerror; end; WSAEADDRNOTAVAIL: begin estr:='IP is not available'; goto showerror; end; WSAEAFNOSUPPORT: begin estr:='IP is not supported'; goto showerror; end; WSAEFAULT: goto showerror; WSAENETUNREACH: begin estr:='Network cannot be reached'; goto showerror; end; WSAEHOSTUNREACH: begin estr:='Host cannot be reached'; goto showerror; end; // should be else - WSAENOBUFS: goto showerror; WSAEWOULDBLOCK: goto cont; else socks:=socks-1; closesocket(skt); exit; end; showerror: socks:=socks-1; closesocket(skt); stopscan; messagedlg('Connect error '+inttostr(a)+#10+estr+#10'Scan ended at '+iptostr(ip),mterror,[mbok],0); exit; end; cont: ipi:=ipi+1; if ipi>=en then begin stopscan; exit; end; progressbar1.Position:=ipi; //label9.caption:=inttostr(ipi); end;
function Tform1.iptostr(p:cardinal):string; var pa:array[1..4] of byte absolute p; begin result:=inttostr(pa[1])+'.'+inttostr(pa[2])+'.'+inttostr(pa[3])+'.'+inttostr(pa[4]); end;
procedure tform1.stopscan; begin timer1.enabled:=false; ipscanactive:=false; progressbar1.Position:=0; // button5.enabled:=true; // button6.caption:='Exit'; // progressbar1.Max:=255; // progressbar1.Position:=progressbar1.Max; // label9.caption:='0'; end;
procedure Tform1.winsockevent(var msg:tcmsocketmessage); var sa:sockaddr_in; namelen:integer; tmp:string[20]; host:PhostEnt; begin if msg.SelectError=0 then begin if msg.SelectEvent=FD_CONNECT then begin namelen:=sizeof(sa); getpeername(msg.Socket,sa,namelen); if (ipa[1]=127)and(ipa[2]=0) then lbnames.Items.add('localhost: Connected') else begin lbnames.Items.add(iptostr(sa.sin_addr.S_addr){+Inttostr(sa.sin_addr.S_un_w.s_w1)}); //gethostbyaddr(sa.sin_addr.s_addr,sa.sin_addr.S_un_w, end; // end; end; end; closesocket(msg.socket); socks:=socks-1; end;
|
взято здесь же на sources.ru(правда давно ссылочки не нашёл), поэтому выдирал из своей проги, мог какие-то переменные не дописать, разбирайся...
|