![]() |
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. |
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. |
Re: Server Suche mit Sockets
Hi
Zitat:
Für mich macht das dort gar keinen Sinn. Es dient zum Ausstieg aus einer Schleife. Gruss |
Re: Server Suche mit Sockets
Vielleicht nützt dir das was
Delphi-Quellcode:
Das sucht alle LAN-IPs und speichert sie in eine Liste, die kann man dann durchgehen und den Server suchen.
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; |
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