имеется пример сканера он в интернете достаточно распространён, код внизу. Я его использовал работает, но вот что интересно выдаёт через некоторое время ошибку по адресу... Код | [DCC Warning] Unit23.pas(81): W1057 Implicit string cast from 'AnsiChar' to 'string' что тут неявный переход?? [DCC Warning] Unit23.pas(137): W1024 Combining signed and unsigned types - widened both operands - типы без знака? [DCC Warning] Unit23.pas(176): W1057 Implicit string cast from 'AnsiChar' to 'string'
|
код сканера Код | unit Unit23;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Gauges, StdCtrls, Spin, Buttons, ExtCtrls, AppEvnts,winsock;
type TForm23 = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; SpeedButton1: TSpeedButton; Label3: TLabel; Label4: TLabel; Edit1: TEdit; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; ListBox1: TListBox; ProgressBar1: TGauge; ApplicationEvents1: TApplicationEvents; procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); procedure SpeedButton1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); end;
TMyThread = class(TThread) protected procedure Execute; override; end;
TFSocket = record sa: TSockAddr; FData: integer; TimeOut: integer; end;
const MAX_PORTS=500; Ping=5000;
var Form23: TForm23; FSocket: array [0..MAX_PORTS - 1] of TFSocket; FPort: WORD; FInfo: TWSADATA; FHost: integer; FPStart, FPEnd: WORD; SThread: TMyThread; implementation
uses Unit1;
{$R *.dfm}
procedure TForm23.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var pSrvEnt:pServEnt; sPortDescription:String; // j : integer; // port: array [0..41] of integer; begin if (Msg.message>=FPStart+WM_USER) and (Msg.message<=FPEnd+WM_USER) then if WSAGETSELECTERROR(Msg.lParam)=0 then case WSAGETSELECTEVENT(msg.lParam) of FD_CONNECT: begin // pSrvEnt := getservbyport(htons(port[j]),'TCP'); pSrvEnt := getservbyport(htons(msg.message - WM_USER),'TCP'); if Assigned (pSrvEnt) then sPortDescription := 'service: ' + string(pSrvEnt^.s_name) else sPortDescription := ''; ListBox1.Items.Add(IntToStr(ListBox1.Count+1)+ ') IP: '+inet_ntoa(FSocket[0].sa.sin_addr)+' | '+ 'Port: '+intToStr(Msg.message - WM_USER) + ' | ' + sPortDescription); Application.ProcessMessages; end; end; Handled:=false; end;
procedure TForm23.FormCreate(Sender: TObject); var i: integer; begin if WSAStartup(MAKEWORD(2, 0), FInfo)<>0 then Halt; for i:=0 to MAX_PORTS-1 do with FSocket[i] do begin TimeOut := 0; FData := Socket(AF_INET, SOCK_STREAM, 0); if FData = SOCKET_ERROR then begin WSACleanup; Halt; end; end; Application.OnMessage:=Form23.ApplicationEvents1Message; end;
procedure TForm23.FormDestroy(Sender: TObject); var i: integer; begin if SThread<>nil then begin SThread.Terminate; SThread.WaitFor; SThread:=nil; end; for i:=0 to MAX_PORTS-1 do CloseSocket(FSocket[i].FData); WSACleanup; end;
procedure InitSockets; var i: integer; begin for i:=0 to MAX_PORTS-1 do with FSocket[i] do if (FPort>=FPEnd) or (SThread.Terminated) then break else if GetTickCount-TimeOut>PING then begin sa.sin_family:=AF_INET; sa.sin_addr.S_addr:=FHost; sa.sin_port:=htons(FPort); // WSAAsyncSelect(FData, Application.Handle, WM_USER+FPort, FD_CONNECT); connect(FData, FSocket[i].sa, SizeOf(FSocket[i].sa)); TimeOut:=GetTickCount; inc(FPort); Form23.Label2.Caption:='Port: '+intToStr(FPort); Form23.ProgressBar1.Progress:=trunc(((FPort-FPStart)*100)/(FPEnd-FPStart)); Application.ProcessMessages; // Sleep(PING div MAX_PORTS); end; end;
procedure TMyThread.Execute; var i: integer; buf: in_addr; begin FPStart:=Form23.SpinEdit1.Value; FPEnd:=Form23.SpinEdit2.Value; FHost:=inet_addr(PansiChar(AnsiString(Form23.Edit1.Text))); if (FPEnd<=FPStart)or (Form23.SpinEdit1.Value>65535) or (Form23.SpinEdit2.Value>65535) then FHost:=SOCKET_ERROR; if FHost=SOCKET_ERROR then begin if not Terminated then SThread:=nil; Form23.SpeedButton1.Caption:='Запуск'; Exit; end; buf.S_addr:=FHost; Form23.Edit1.Text:=inet_ntoa(buf); Form23.ListBox1.Clear; FPort:=FPStart; for i:=0 to MAX_PORTS-1 do with FSocket[i] do begin TimeOut:=0; FData:=Socket(AF_INET, SOCK_STREAM, 0); end; // while not Terminated do begin InitSockets; if FPort>=FPEnd then break; end; // for i:=0 to MAX_PORTS-1 do CloseSocket(FSocket[i].FData); // if not Terminated then begin SThread:=nil; Form23.SpeedButton1.Caption:='Start'; end; end;
procedure TForm23.SpeedButton1Click(Sender: TObject); begin if SThread=nil then begin SThread:=TMyThread.Create(false); SpeedButton1.Caption:='Stop'; end else begin SThread.Terminate; SThread.WaitFor; SThread:=nil; SpeedButton1.Caption:='Start'; end; end;
end.
|
Это сообщение отредактировал(а) s2004 - 27.4.2015, 17:49
|