Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Die Variable ServerIP herausfinden!(Scannen) (https://www.delphipraxis.net/4811-die-variable-serverip-herausfinden-scannen.html)

ATwardz 12. Mai 2003 19:20


Die Variable ServerIP herausfinden!(Scannen)
 
Chat Internetfähig machen!!!?!?!?!??!?!?!?!?[/color]

Mein Programm soll im Internet laufen, da ich keine feste IP habe benötige ich ein scanntool, das mir die ServerIP herausfindet, nur wie!

Newbee sucht Hilfe!

Dieser vereinfachte Code zeigt mein Problem!

Delphi-Quellcode:
PROCEDURE SCAN;
VAR i:Integer;
Begin
  For i:=0 to 255 do
  Begin
    Client.host:='192.168.2.'+inttostr(i);
    Client.open;
    If Client.socket.connected=true then
    Listbox1.items.add('Client.host');
    Client.close;
  end;
end;
Wenn nun die Verbindung versucht wird aufzubauen kommt eine Fehlermeldung, logisch und das Programm bleibt stehn! Wieverhindere ich diese Fehlermeldung, so das alle 255 Möglichkeiten ausprobiert werden und hinterher nur noch die richtigen ips in der Listbox stehen!

Habe schon mit Try und Except experimentier, hat aber den gleichen Effekt!

Bitte um Hilfe!

Thx

[Edit=Sakura]Delphi-Tags eingefügt.[/Edit]

Captnemo 13. Mai 2003 08:36

Es gibt sicherlich bessere Möglichkeiten, aber versuchs mal hiermit:

Delphi-Quellcode:
PROCEDURE SCAN;
VAR
 i:Integer;
Begin
 For i:=0 to 255 do
 Begin
  Client.host:='192.168.2.'+inttostr(i);
  Try
   Client.open;
   If Client.socket.connected=true then
   Listbox1.items.add('Client.host');
   Client.close;
  except
   //irgentwas - Vielleicht ne Meldung
  end;
 end;
end;

ATwardz 13. Mai 2003 14:56

Problem nit behoben
 
Das habe ich auch schon versucht, aber das Problem bleibt das gleiche!

Asynchronous socket error 10049

Das Problem is , das ich diese Fehlermeldung nicht umgehen kann!
Ich müsste ihm irgendwie begreiflich machen, das er dann abbricht und die Schleife fortsetzt!

Trotzdem vielen Dank!

Captnemo 14. Mai 2003 00:16

Mit welche Komponente arbeitest du denn hier, und auf welchem Port soll die Kommunikation erfolgen. (Dann könnte man das mal ausprobieren).

ATwardz 14. Mai 2003 13:21

Port 25555

Ich arbeite mit Delphi 6 enterprise und den normalen Winsockets, also Serversocket und clientsocket!
Zu einer IP, die das pro. geöffnet hat kann ich eine Verbindung herstellen, daher habe ich eine Fehleinstellung ausgeschlossen!

Ich glaube das Problem ist, dass sich try und client.open nit vertrangen!

Naja , bin dankbar für jede Hilfe!

Thx schon mal

Captnemo 14. Mai 2003 14:36

Hi ATwardz,

ich hab mal ein bischen ausprobiert.

In folgender procedure:

Delphi-Quellcode:
procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
    ListBox2.Items.Add(ClientSocket1.Address);
    ErrorCode:=0;
end;
Wenn du den ErrorCode auf 0 setzt wird keine Exception ausgelöst. Du muß dann nur noch eine Variable setzen, und deren Wert in deiner Schleife abfangen, damit Sie unterbrochen wird.

Oder du setzt die Variable in ClientSocket1Connect damit deine Schleife bei einer erfolgreichen Verbindung abbricht.

Bei mir funktionierts :mrgreen:

ATwardz 14. Mai 2003 23:04

Es ist zum verrückt werden!
 
Vielen dank! Jetzt gehts!

Juchu , leider noch nit ganz!

Es gibt jedoch noch ein Problem!

Das Programm soll alle Falschen IP's ( nur zur Kontrolle in Listbox2 auflisten und die richtige in Listbox1);

Das Problem liegt eindeutug daran, das der Befehl Client.open erst nach der Procedure ausgeführt wird! :cry:
Die Schleife wird erst komplett ausgeführt , dann die Error Procedure und dann die Connect Procedure!Da Onconnect erst nach der Schleife ausgeführt wird und dort die Variable geändert wird, läuft die Schleife auf jedenfall bis zum ende! Und es wird die letzte IP in die Listbox geschrieben!

Delphi-Quellcode:

procedure TForm1.BT_tryClick(Sender: TObject);
VAR i:Integer;
Begin
i:=103;
While i<104 do
Begin
  Client1.host:='192.168.2.'+inttostr(i);
  Try
   client1.open;
   If client1.Socket.Connected=true then
   Begin
     Listbox1.Items.Add(client1.Host);
     exit;
   end;
  finally
   beep;
  end;
  i:=i+1;
end;
end;

procedure TForm1.Client1Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode:=0;
  Listbox2.Items.Add(Client1.Host);
end;
Ich habe auch schon versucht die For-Schleife durch eine While-Schleife zu erstzen, aber der Effekt ist der Gleiche!

Es ist zum verrückt werden,
nun funktioniert der Scan aber ich kann die richtige IP nit rausfiltern!

:freak:

Captnemo 14. Mai 2003 23:14

Versuchs mal hiermit
Delphi-Quellcode:
Client1.Open
Application.ProcessMessages;  <<<<<<<<<<<<<<<<
if Client1.Socket.Connected then
...
Wenn das auch nicht klappt, dann mach doch den Open mal über einen Timer, und werte die OnConnect und OnError Ereignisse aus.

Hatte das vorhin mal in D6 ausprobiert.
Ich such nochmal.

PS: Das =True hinter Client1.Socket.Connected kannst du dir sparen, da Client1.Socket.Connected schon ein True oder False zurückliefert.

Captnemo 14. Mai 2003 23:44

Ich habe jetzt mal was Ausprobiert.
Hier mein Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ExtCtrls, ScktComp, Buttons;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    ClientSocket1: TClientSocket;
    BitBtn1: TBitBtn;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    i: Integer;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     ClientSocket1.Address:='192.168.0.'+inttostr(i);
     Try
     ClientSocket1.Open;
     if ClientSocket1.Active then begin
      ListBox1.Items.Add(ClientSocket1.Address);
      ClientSocket1.Close;
     end else
      ListBox2.Items.Add(ClientSocket1.Address);
     finally
     ClientSocket1.Close;
     i:=i+1;
     if i=21 then timer1.Enabled:=False;
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     i:=1;
     Timer1.Enabled:=true;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
    //ListBox2.Items.Add(ClientSocket1.Address);
    ErrorCode:=0;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
     //ListBox1.Items.Add(ClientSocket1.Address);
     //ClientSocket1.Close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 i: Integer;
begin
     ListBox1.Clear;
     ListBox2.Clear;
     For i:=1 to 20 do begin
      ClientSocket1.Address:='192.168.0.'+inttostr(i);
      Try
       ClientSocket1.Open;
       Application.ProcessMessages;
       if ClientSocket1.Socket.Connected then
        ListBox1.Items.Add(ClientSocket1.Address)
       else
        ListBox2.Items.Add(ClientSocket1.Address);
       ClientSocket1.Close;
      except
        beep;
      end;
     end;
end;

end.
Wenn du den Button1 benutzen willst, dann muß du die Auskommentierung unter OnError und OnConnect wieder rausnehmen.

Aber mir ist dabei ein Phänomen aufgefallen:

die Timer-Lösung funktioniert richtig (Gefällt mir aber nicht)

die BitBtn-Lösung liefert erst ab dem 2. Klick die richtige IP-Adresse.
Eigentlich müsste das schon beim 1. Klick so sein. Liegt warscheinlich daran, das beim Open nicht wirklich gewartet wird, bis die Verbindung aufgebaut ist. Und wenn das dann zu lange dauert, wird eine IP ausgegeben, die nicht stimmt, da die Schleife schon weiter ist.

Also folgende Lösung sollte dann aber auch das Problem lösen.
Du setzt eine Globale Booleanvariable 'test' auf False.
Nach dem Open läßt du dann eine While-Schleife laufen, die auf ein test=True wartet.
Im OnConnect und OnError setzt du die dann auf True.
Dann geht das aufwärtzählen der IP nur weiter, wenn die Open-Procedure abgeschlossen ist. So oder so.

Zur Sicherheit kannst du dann ja noch einen Timer mit einem Timeout von 30 Sek vor der While-Schleife starten, der auf jeden Fall Test auf True setzt.

Probier das doch mal.

ATwardz 15. Mai 2003 14:28

Ahhhh bei mir geht weder die eine noch die andere Lösung!

Ich habe ein testprogramm mit nur diesen Procedure erstellt!

Timer-Lösung!

Listet mir alle Ip's bis auf die Letzte auf, aber alle nur in die Listbox2!

BitBtn-Lösung!

Listet mir alle Ip's auf jedoch ebenfalls nur ind die Listbox2!

Mit F7 sieht man , das die onconnect Procedure nicht ausgeführt wird!
Ich weiss nit woran es liegt, vielleicht ist mein delphi kaputt oder verarscht mich einfach nur!

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, Buttons, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Timer1: TTimer;
    Button1: TButton;
    BitBtn1: TBitBtn;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    i:Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Form1.Caption:='Connected';
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Form1.Caption:='Disconnected';
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Errorcode:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     ClientSocket1.Address:='192.168.0.'+inttostr(i);
     Try
     ClientSocket1.Open;                      
     if ClientSocket1.Socket.Connected then begin
      ListBox1.Items.Add(ClientSocket1.Host);
      ClientSocket1.Close;
     end else
      ListBox2.Items.Add(ClientSocket1.Address);
     finally
     ClientSocket1.Close;
     i:=i+1;
     if i=110 then timer1.Enabled:=False;
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     i:=100;
     Timer1.Enabled:=true;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: Integer;
begin
     ListBox1.Clear;
     ListBox2.Clear;
     For i:=100 to 110 do begin
      ClientSocket1.host:='192.168.0.'+inttostr(i);
      Try
       ClientSocket1.Open;
       Application.ProcessMessages;
       if ClientSocket1.Socket.Connected then
        ListBox1.Items.Add(ClientSocket1.Host)
       else
        ListBox2.Items.Add(ClientSocket1.Host);
       ClientSocket1.Close;
      except
        beep;
      end;
     end;
end;


end.
Ich werde noch verrückt! :freak:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz