AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Server Suche mit Sockets
Thema durchsuchen
Ansicht
Themen-Optionen

Server Suche mit Sockets

Ein Thema von mdogg · begonnen am 8. Okt 2007 · letzter Beitrag vom 8. Okt 2007
Antwort Antwort
mdogg

Registriert seit: 8. Okt 2007
13 Beiträge
 
#1

Server Suche mit Sockets

  Alt 8. Okt 2007, 19:46
Hi
erstmal vorne weg, ich benutze Delphi 6.


Ich möchte für meinen Chat die Möglichkeit programmieren den Server automatisch anhand einer IP-Range zu finden.
Ich habe zum testen jeweils einen simplen Server und einen simplen Client geschrieben.

Anhand der Suche habe ich einige Ansätze gefunden und diese kombiniert.
Wenn ich die Suche mit den gegebenen Parametern starte erscheint im Memo jeweils ein 'Trying : 192.168.0.X'
und danach 255 mal '192.168.0.254 failed because 10049'

Kann mir jemand einen Tip geben?

Hier die Quell Codes:

Server
Code:
unit test_server;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Edit1: TEdit;
    SpinEdit1: TSpinEdit;
    Button1: TButton;
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  showMessage('client connected @ '+ServerSocket1.Socket.RemoteAddress);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ServerSocket1.Port := SpinEdit1.Value;
 ServerSocket1.Open;
end;

end.

Client
Code:
unit test_client;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ClientSocket1: TClientSocket;
    SpinEdit5: TSpinEdit;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ip: string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const Point = '.';
var
ip_1a,ip_1b,ip_2a,ip_2b,ip_3a,ip_3b,ip_4a,ip_4b: integer;
begin
ClientSocket1.Port := SpinEdit5.Value;
ip_1b := StrToInt(Edit5.Text);
ip_2b := StrToInt(Edit6.Text);
ip_3b := StrToInt(Edit7.Text);
ip_4b := StrToInt(Edit8.Text);
 for ip_1a := StrToInt(Edit1.Text) to ip_1b do begin
  for ip_2a := StrToInt(Edit2.Text) to ip_2b do begin
   for ip_3a := StrToInt(Edit3.Text) to ip_3b do begin
    for ip_4a := StrToInt(Edit4.Text) to ip_4b do begin
     ip := IntToStr(ip_1a)+point+IntToStr(ip_2a)+point+IntToStr(ip_3a)+point+IntToStr(ip_4a);
     try
      Memo1.Lines.Add('Trying: '+ip);
      ClientSocket1.Host := ip;
      ClientSocket1.Open;
     except
      Memo1.Lines.Add(ip+' failed');
      ClientSocket1.Close;
      end;
     end;
    end;
   end;
  end;
 end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  break;
  showMessage(ip+'was successfull');
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Memo1.Lines.Add(ip+' failed because: '+IntToStr(ErrorCode));
  ErrorCode := 0;
end;

end.


Auch sehr interessant:
Das 'break;' im Connect Event konnte ich auf einem Rechner kompilieren, aber auf dem Rechner daneben nicht...
Beide beuntzen die gleiche Delphi Version...

Danke schon mal.
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Server Suche mit Sockets

  Alt 8. Okt 2007, 19:54
Hallo,

musst du zwingend immer einen Server Client Connect aufbauen?
Viel schneller geht doch die IP-Range such über Pings.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Server Suche mit Sockets

  Alt 8. Okt 2007, 20:08
Hi

Zitat:
Auch sehr interessant:
Das 'break;' im Connect Event konnte ich auf einem Rechner kompilieren, aber auf dem Rechner daneben nicht...
Beide beuntzen die gleiche Delphi Version...
Und was glaubst Du, wozu das break gut sein sollte ?
Für mich macht das dort gar keinen Sinn. Es dient zum Ausstieg aus einer Schleife.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

Re: Server Suche mit Sockets

  Alt 8. Okt 2007, 20:21
Vielleicht nützt dir das was
Delphi-Quellcode:
procedure TMainForm.GetLANPCs(List: TStrings);

  procedure EnumFunc(NetResource: PNetResource);
  var
    Enum: THandle;
    Count, BufferSize: DWORD;
    Buffer: array[0..16384 div SizeOf(TNetResource)] of TNetResource;
    i: Integer; S: String;
  begin
    if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NetResource,
    Enum) = NO_ERROR then
    try
      Count := $FFFFFFFF;
      BufferSize := SizeOf(Buffer);
      while WNetEnumResource(Enum, Count, @Buffer, BufferSize) = NO_ERROR do
        for i := 0 to Count - 1 do
        begin
          if Buffer[i].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER then begin
            S:=Buffer[i].lpRemoteName;
            Delete(S,1,2);
            List.Add(S);
          end;
          if (Buffer[i].dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then
            EnumFunc(@Buffer[i])
        end;
    finally
      WNetCloseEnum(Enum);
    end;
  end;

begin
  EnumFunc(nil);
end;
Das sucht alle LAN-IPs und speichert sie in eine Liste, die kann man dann durchgehen und den Server suchen.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
mdogg

Registriert seit: 8. Okt 2007
13 Beiträge
 
#5

Re: Server Suche mit Sockets

  Alt 8. Okt 2007, 20:59
@thkerkman:
Macht auch keinen Sinn... Hatte vorher eine Schleife in diesem Event und hab das break übersehen.
Ändert ja aber nichts an der Tatsache, dass ich es auf einem Rechner kompilieren kann...

Das Programm soll auch im Internet funktionieren, da ich meine Range dort auch auf 2*255 eingrenzen kann.
Kann mir jemand sagen, wie ich den Client dazu bekomme die Connections richtig aufzubauen und wieder zu schließen, falls er keine Antwort bekommt?

Danke nochmal!
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:39 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