Entwickler-Ecke

Internet / Netzwerk - Prüfen, ob ein Port offen ist


achterburg - So 26.10.03 19:36
Titel: Prüfen, ob ein Port offen ist
Hallo, ihc bin gerade dabei, Netzwerkfunktionalität für ein kleines Spiel zu entwickeln. Dabei möchte ich, dass alle rechner im Netz abgesucht werden( wass schon geht) und bei dehnen getestet wird, ob ein bestimmter Port offen ist, so also kein professioneller Portscanner werden, sondern nur eine Abfrage, ob Port 999 offen ist. WEiss jmd den Befehl dafür?


MSCH - So 26.10.03 21:12

Ein Port ist offen, wenn eine Anwendung dranhängt. In der Regel reicht es, zu versuchen, eine IP-Connection auf diesen Port zu setzen. KIst er established so hängt was dran.
grez
msch


BungeeBug - So 26.10.03 21:28

Hi,

nimm auf keinen Fall Port 999. Alle Ports < 1024 sind reserviert und nicht für die "freie" Benutzung gedacht!


achterburg - So 26.10.03 21:47

also, port 999 werde ich dann mal ändern. Aber ich kann nciht einfach kucken, ober connecten kann, da ich eine Zählschleife als IP prüfer verwende. WEnn er nicht verbinden kann, fliegt er aus der Zählschleife raus. Und dann kann ich keine komplette liste, von allen Netzwerkclients machen, an die ich Daten schicken möchte. Mein Code:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm9.datensenden;
Var i,j:integer;
host:String;
Begin
j:=1;
host:=form7.getsubnet('192.168.0.1');
form1.IdTCPClient1.Port:=999;
for i := 1 to 254 DO
 Begin
  If form7.istda(host + inttoStr(i))
  THEN Begin
    form9.StringGrid1.Cells[0,j] :=host  + inttoStr(i);
    form1.IdTCPClient1.Host:=host + InttoStr(i);
    form1.IdTCPClient1.Connect;
    If form1.IdTCPClient1.Connected THEN
      form1.IdTCPClient1.WriteLn(form2.Edit1.Text + '|' + form7.Memo1.Lines.Strings[0]);
    form1.IdTCPClient1.Disconnect;
    form1.IdTCPClient1.Free;
    sleep(10);
    j:=j + 1;
//showmessage(InttoStr(i));
   end;
 end;
end;


das ist die procedure, umalle Rechner im Netz zu finden^^


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
function TForm7.istda(Host:String):boolean;
  var
//    MS: Integer;
    ICMP: TidIcmpClient;
  begin
    ICMP:= TidICMPClient.Create(nil);
    ICMP.ReceiveTimeout:=300;
    result:= False;
    ICMP.Host:= host;
    ICMP.Ping;
//    MS:=ICMP.ReplyStatus.MsRoundTripTime;
    result:= ICMP.ReplyStatus.ReplyStatusType <> rsTimeOut;
    ICMP.Free;
  end;

function TForm7.getIPs: Tstrings;
type
  TaPInAddr = array[0..10of PInAddr; 
  PaPInAddr = ^TaPInAddr; 
var 
  phe: PHostEnt;  
  pptr: PaPInAddr; 
  Buffer: array[0..63of Char;  
  I: Integer;
  GInitData: TWSAData;
begin 
  WSAStartup($101, GInitData);  
  Result := TstringList.Create;
  Result.Clear;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I    := 0;
  while pPtr^[I] <> nil do
  begin
    Result.Add(inet_ntoa(pptr^[I]^));
    Inc(I);  
  end;  
  WSACleanup;
end;

function TForm7.getsubnet(IP :string):string;
var i,j:integer;
text1 :string;
begin
text1:='';
for i := 1 to Length(IP) Do
  text1:=IP[i] + text1;
j:=1;
For j := 1 to 3 DO
   Begin
    If (text1[1] <> '.'THEN
    delete(text1,1,1);
   end;
for i := 1 to Length(text1) Do
result:=text1[i] + result;

end;

procedure TForm7.BitBtn3Click(Sender: TObject);
begin
form9.Show;

form9.datensenden;
end;

end.


das ist ein ausschnitt ausder anderen unit, hier wird zum einen das Subnet festgestellt, zum anderen die Ip und außerdem die Procedure datensenden aufgerufen


UGrohne - So 26.10.03 23:00

setz das Connect doch einfach in einen try..except-Block, dann hast Du keine Probleme, dass die entstehende Exception Dir Deine Schleife verlässt ;-)


achterburg - So 26.10.03 23:21

DELUXE, es funktioniert. Wenn mir jetzt noch jemand sagen kann, wie ihc das scannen mit mehreren Threads machen kann, weil ja ein pingen an 254 Rechner auch so seine Zeitbraucht, ist alles perfekt!

Abererstmal vielen Dank nochmal