Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Server Suche mit Sockets (https://www.delphipraxis.net/101126-server-suche-mit-sockets.html)

mdogg 8. Okt 2007 19:46


Server Suche mit Sockets
 
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.

little_budda 8. Okt 2007 19:54

Re: Server Suche mit Sockets
 
Hallo,

musst du zwingend immer einen Server Client Connect aufbauen?
Viel schneller geht doch die IP-Range such über Pings.

thkerkmann 8. Okt 2007 20:08

Re: Server Suche mit Sockets
 
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

Progman 8. Okt 2007 20:21

Re: Server Suche mit Sockets
 
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.

mdogg 8. Okt 2007 20:59

Re: Server Suche mit Sockets
 
@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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.

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