Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Client ausfindig machen (https://www.delphipraxis.net/46843-client-ausfindig-machen.html)

Rastaman 1. Jun 2005 15:00


Client ausfindig machen
 
Hallo. Ich hätte da eine Frage zu den Sockets.
Und zwar habe ich einen server und mehrere Clienten verbinden.
Die Clienten senden Text. Nun möchte ich herausfinden von welchem der Text kam.
Ungefähr so.

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ShowMessage('Nachricht von Client Nr.' + IntToStr(?) + ' empfangen');
end;
Was muss ich für das ? einsetzen??
Danke schonmal.

freak24 1. Jun 2005 15:10

Re: Client ausfindig machen
 
Zitat:

Zitat von Gerrit89
Was muss ich für das ? einsetzen?

Also du kannst das Handle anzeigen lassen
Delphi-Quellcode:
Socket.SocketHandle
Möglich wäre auch die Adresse/Hostname
Delphi-Quellcode:
Socket.RemoteAddress
Socket.RemoteHost
Ich hoffe du kannst damit was anfangen.

Rastaman 1. Jun 2005 15:41

Re: Client ausfindig machen
 
Nein.
Wenn 2 Clienten verbunden sind muss die zahl für das ? entweder 0 oder 1 sein.

Phistev 1. Jun 2005 15:56

Re: Client ausfindig machen
 
Erstelle eine Liste / ein Array, indem du einer Adresse eine ID (0,1,2,...) zuweist. Benutz dann die Adresse, um die ID herauszufinden.

Rastaman 1. Jun 2005 15:59

Re: Client ausfindig machen
 
Öhm, das versteh ich nicht wirklich.
Dadurch weiß ich doch auch nicht welcher Client gesendet hat.

Grendel 1. Jun 2005 16:04

Re: Client ausfindig machen
 
Zitat:

Zitat von Gerrit89
Dadurch weiß ich doch auch nicht welcher Client gesendet hat.

Ja aber sicher doch.
Wenn Du eine Zuordnung von IP+Port zu einer eindeutigen ID hast kannst Du soch sagen, daß Der Client, der auf Port xyz von IP abc sendet die ID 123 hat.

Bis neulich ...

Rastaman 1. Jun 2005 16:07

Re: Client ausfindig machen
 
Könntest du da mal n konkretes Beispiel schreiben?

Phistev 1. Jun 2005 16:12

Re: Client ausfindig machen
 
Delphi-Quellcode:
type TIPID = record
  adress: string; //oder integer
  ID: integer;
end;
type TIPIDArray = array of TIPID

Rastaman 1. Jun 2005 16:32

Re: Client ausfindig machen
 
Öhm und dann?
Wie siehts dann mit OnClientConnect und OnClientRead aus ?

Phistev 1. Jun 2005 16:37

Re: Client ausfindig machen
 
Erstelle in der Klasse TForm1 eine Variable vom Typ TIPIDArray, und greife dann darauf zu. In OnClientConnect machst du (evtl.) das Array mit SetLength größer und hängst die IP mit der ID an, in OnClientRead durchsuchst du dann einfach das Array.

Rastaman 1. Jun 2005 16:43

Re: Client ausfindig machen
 
Sorry ich peil das nicht :wall: :wall: :wall: :wall:

alcaeus 1. Jun 2005 16:53

Re: Client ausfindig machen
 
Hallo Gerrit,

also, jedes Socket das sich zu deinem Server verbindet hat ein eindeutiges Handle. Sobald sich jemand verbindet, fuegst du dieses Handle einer Liste hinzu. Im OnClientRead verwendest du dann Socket.SocketHandle um das Handle des sendenden Sockets herauszufinden, und gehst durch das Array um die interne ID des Sockets zu finden. Diese zeigst du dann an.

Greetz
alcaeus

Rastaman 1. Jun 2005 17:22

Re: Client ausfindig machen
 
Delphi-Quellcode:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Clienthwnd: Array[0..1] of Hwnd;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.Active := True;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  If Socket.Handle = ClientHWND[0] then
    ServerSocket1.Socket.Connections[0].SendText('hallo')
  else
   ServerSocket1.Socket.Connections[1].SendText('hallo');
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  If ClientHWND[0] <> 0 then
  begin
    ClientHWND[0] := Socket.Handle;
    exit;
  end else if ClientHWND[1] <> 0 then
    Socket.Disconnect(2)
  else
    ClientHWND[1] := Socket.Handle;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  If socket.Handle = ClientHWND[0] then
  begin
    ClientHWND[0] := ClientHWND[1];
    ClientHWND[1] := 0;
  end else if socket.Handle = ClientHWND[1] then
    ClientHWND[1] := 0;
end;

end.
Mag dumm aussehen aber mal schaun was ihr so sagt ...
Es dürfen maximal 2 Clienten verbinden.

Zitat:

Zitat von Phistev
Du willst mir doch nicht sagen, du wüsstest nicht, wie man mit dynamischen Arrays umgeht?

Ich denke doch. Ist das schlimm oder findest du das komisch ?

Phistev 1. Jun 2005 17:31

Re: Client ausfindig machen
 
Die Position von Clienthwnd ist evtl. nicht optimal (globale Variablen sind umstritten, Clienthwnd könnte genauso gut in TForm1 stehen)
Zitat:

Ich denke doch. Ist das schlimm oder findest du das komisch ?
Ich war nur etwas genervt, solche Aussagen wie "Das peil ich nicht" oder "Wie macht man das?" hör ich im Informatik-Unterricht ständig. Ich komme manchmal gar nicht mehr zum Arbeiten. :evil:

Rastaman 1. Jun 2005 17:34

Re: Client ausfindig machen
 
Und deswegen schreibst du mir eine PM ob ich denn wirklich so blöd bin und das nicht verstehe?

alcaeus 1. Jun 2005 17:37

Re: Client ausfindig machen
 
Phistev, Gerrit,

bitte klaert eure kleinen Differenzen nicht hier, sondern per PN oder sonstwo.
Wenn jemand etwas nicht kann, ist dies keinen Grund, ihn als "bloed" darzustellen. Genau deshalb gibt es das Forum.
Gerrit, such mal in der DP nach Hier im Forum suchenDynamische arrays.
Falls du nur 2 Clients zulassen willst, kannst du auch mit Delphi-Referenz durchsuchenTServerSocket.ActiveConnections die Anzahl der verbundenen Clients rausfinden, und beim 3. Client die Verbindung verweigern.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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