AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Die Variable ServerIP herausfinden!(Scannen)
Thema durchsuchen
Ansicht
Themen-Optionen

Die Variable ServerIP herausfinden!(Scannen)

Ein Thema von ATwardz · begonnen am 12. Mai 2003 · letzter Beitrag vom 19. Mai 2003
Antwort Antwort
Seite 1 von 3  1 23      
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#1

Die Variable ServerIP herausfinden!(Scannen)

  Alt 12. Mai 2003, 20:20
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]
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#2
  Alt 13. Mai 2003, 09: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;
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#3

Problem nit behoben

  Alt 13. Mai 2003, 15:56
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!
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4
  Alt 14. Mai 2003, 01:16
Mit welche Komponente arbeitest du denn hier, und auf welchem Port soll die Kommunikation erfolgen. (Dann könnte man das mal ausprobieren).
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#5
  Alt 14. Mai 2003, 14: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
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#6
  Alt 14. Mai 2003, 15: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
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#7

Es ist zum verrückt werden!

  Alt 15. Mai 2003, 00:04
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!
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!

  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#8
  Alt 15. Mai 2003, 00: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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#9
  Alt 15. Mai 2003, 00: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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
ATwardz

Registriert seit: 12. Mai 2003
205 Beiträge
 
Delphi 7 Professional
 
#10
  Alt 15. Mai 2003, 15: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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 Uhr.
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