Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Client-Server-Kommunikation im LAN (https://www.delphipraxis.net/17330-client-server-kommunikation-im-lan.html)

Schubi 3. Mär 2004 12:34


Client-Server-Kommunikation im LAN
 
Hi!

Folgendes Problem:
Im Firmennetzwerk führen einige Rechner mein Programm aus.
Die EXE liegt zentral auf einem Fileserver.
Mein Problem dabei ist, dass die EXE durchgehend in gebrauch ist (Schichtbetrieb), und ich deshalb nicht updaten kann.

Momentan ist die Sache so gelöst, dass sich die EXE beim Start mit der IP-Adresse in eine Textdatei einschreibt, und beim Beenden den Eintrag wieder entfernt.
Dann habe ich ein Programm um den Beenden-Befehl zu senden.
Die Beiden kommunizieren über TServersocket und TClientsocket miteinander.
Jedenfalls gefällt mir die Lösung überhaupt nicht.

Wie bekomm ich es am besten hin, dass ich jederzeit mein kleines Proggy starten kann und an alle Clients die gerade laufen den Beenden-Befehl senden kann, OHNE dabei über Textfiles rausfinden zu müssen, wo die Software läuft.

Die Befehle werden als Text versendet. Zusätzlich ist es möglich normale Nachrichten zu verschicken (momentan nur in eine Richtung, würde mir aber beide Richtungen wünschen).

Am besten wären wohl Indy-Komponenten, oder?
Wie stell ich das mit der Userlist an und wie bekomm ich ne zuverlässige Kommunikation in beide Richtungen hin?

Gruß, Schubi

tobster 3. Mär 2004 19:48

Re: Client-Server-Kommunikation im LAN
 
Wenn du dich wirklich nur in einem Subnet aufhältst, dann stosse ich dich mal weg von TCP auf UDP und du denkst mal über Broadcast-Messages nach.

BAHNHOF? :?:

Wie schonmal erwähnt, die Indianer sind nix für mich, kann ich dir nix zu sagen, ich persönlch setze immer die ICS von FPiette ein. Die können u.a. auch auf Ports per UDP lauschen.

Einen Broadcast schickt man wie mit TCP auf die Adresse x.x.x.255 des Subnet bzw. auf 255.255.255.255 ab. Alle deine Clients, die auf dem bestimmten Port lauschen, werden dann deine Msg erhalten, und können sich Beenden. Dein Steuerprogramm kann ja auf einem anderen Port lauschen, um die anderen Meldungen zu empfangen.

Die Userlist bekommst du mit der Kommunikationsmethode ebenfalls: Schicke einfach eine Art Ping per UDP und alle, die was empfangen, schicken ein Pong. Schon hast du alle offenen User.

Schubi 3. Mär 2004 20:28

Re: Client-Server-Kommunikation im LAN
 
Danke!
DAss es auf einen Broadcast hinausläuft, war mir fast klar.

Kannst du mir mehr über diese ICS-Komponenten sagen?
Klingt soweit schonmal sehr interessant, mir gefallen die Indys nämlich auch nicht :mrgreen:

tobster 3. Mär 2004 21:30

Re: Client-Server-Kommunikation im LAN
 
Zitat:

Zitat von Schubi
Kannst du mir mehr über diese ICS-Komponenten sagen?

Nur die Homepage vom Entwickler:
http://www.overbyte.be/

und das da zu jeder einzelnen Komponente ein voll funktionstüchtiges Beispiel-Programm beiliegt, in dem genauestens ersichtlich wird, wie sie benutzt werden. Mehr als komfortabel!

Schubi 4. Mär 2004 09:57

Re: Client-Server-Kommunikation im LAN
 
Danke, funktionieren wunderbar die Komponenten und sind gegenüber den Indys ne Wohltat :mrgreen:

tobster 4. Mär 2004 16:17

Re: Client-Server-Kommunikation im LAN
 
Mein Reden! 8)

Schubi 4. Mär 2004 19:46

Re: Client-Server-Kommunikation im LAN
 
Die Kommunikation klappt schonmal wunderbar. Nur die Broadcasts gehen nicht. die IPs liegen zwischen 10.1.1.101 und 10.1.1.135
Der Broadcast sollte also 10.1.1.255 sein.
Klappt nur leider net. Ich weiß jetzt leider net genau wie das Netzwerk aufgebaut ist bei uns, aber wird wohl ne Bridge oder ein Router oder sonstwas dazwischen liegen.

Kann ich da trotzdem irgendwie nen Broadcast drüberjagen, oder wäre es in dem Fall sinnvoller den Adressbereich einzeln durchzugehen?

tobster 4. Mär 2004 20:46

Re: Client-Server-Kommunikation im LAN
 
Ich habe das ganze mit jeweils zwei WSockets gebaut gehabt, die folgendermaßen gestartet wurden:

Code:
  with wsServer do begin
   Proto := 'udp';
   Addr := '0.0.0.0';
   Port := '16534';
   LocalPort := '0';
   Listen;
  end;
  with wsClient do begin
   Proto := 'udp';
   Addr := '255.255.255.255';
   Port := '16534';
   LocalPort := '0';
   Connect;
  end;
Das bedeutet soviel, das jeder Kommunikationsteilnehmer sowohl auf dem Port lauscht, als auch sich damit verbindet (was mit UDP natürlich physisch nicht wirklich der Fall ist).

Zum Senden nutze ich einfach die Methode SendStr (wsClient) und zum Empfang wird einfach das Ereignis OnDataAvailable (wsServer) genutzt. Das kannst du dir aber aus den Beispielen (UDPLSTN & UDPSEND) rauskopieren, funzt nämlich so schon richtig gut.

Broadcasts funktionieren wie gesagt eigentlich nur innerhalb eines Subnets und werden nicht geroutet. Ausnahmen bestätigen die Regel. Es gibt wohl Router, bei denen man das routen von Broadcasts aktivieren kann.

Schau ansonsten mal, ob du dich mit deiner IP-Adresse im selben Subnets wie die anderen Rechner befindest.

Schubi 4. Mär 2004 21:44

Re: Client-Server-Kommunikation im LAN
 
ich habs von anfang an so gemacht... bin ja net blöd :mrgreen:

Ich hab die IP 10.1.1.89 und will senden an z.B. 10.1.1.113 und so... ist also das gleiche subnet...naja...muss wohl die adressen einzeln durchlaufen, da gehts ja dann

tobster 5. Mär 2004 05:22

Re: Client-Server-Kommunikation im LAN
 
Zitat:

Zitat von Schubi
Ich hab die IP 10.1.1.89 und will senden an z.B. 10.1.1.113 und so...

Das sagt nicht unbedingt, das du dich im selben Subnet befindest, da kann man mit der Subnetmaske noch viel verbiegen.

Mehr fällt mir aber auch nicht mehr ein, ausser, das es eigentlich funktionieren müsste. :-D

Schubi 5. Mär 2004 06:40

Re: Client-Server-Kommunikation im LAN
 
Eben. Viel mehr is mir auch net eingefalln :mrgreen:
Subnetmask is die gleiche, also daran liegts nicht.
Laut unserem (nicht ganz zurechnungsfähigen) Admin ist nur ein Hub dazwischen...
Bin mir nur nicht sicher, ob man ihm das glauben sollte :mrgreen:

Fischy 5. Mär 2004 09:36

Re: Client-Server-Kommunikation im LAN
 
Auch wenn die Subnetmask gleich ist, heißt das nicht das du im Selben Subnet bist. Die Subnetmask gibt nur an welche Bits der IP-Adresse als Subnetz "mißbraucht werden". Kleines Beispiel:

IP-Adresse A:
137 . 226 . 12 . 21

IP-Adresse B:
137 . 226 . 12 . 147

Subnetmask:
255 . 255 . 255 . 192


IP-Adresse Binär A: 01111000 . 11100010 . 00001100 . 00010101
IP-Adresse Binär B: 01111000 . 11100010 . 00001100 . 10010011
Subnetmask Binär : 11111111 . 11111111 . 11111111 . 11000000

die unterstrichenen Bits repräsentieren das Subnet

=> A und B befinden sich in verschiedenen Subnetzen.

Ich glaube allerdings nicht, das ihr eure Subnetze so klein haltet, das die betroffenen Rechner in unterschiedlichen Netzen hängen. Schau dir doch mal mit nem Packetsniffer an ob der Broadcast überhaupt raus geht.
Was seid ihr eigentlich für ein Unternehmen, das ihr in nem Class-B Netzwerk hängt? Scheint ja nicht klein zu sein :D

Gruß,

Fischy

Schubi 5. Mär 2004 09:58

Re: Client-Server-Kommunikation im LAN
 
Class B? Nicht wirklich! :mrgreen:

Wir haben in etwa 80 Rechner, alle mit IP 10.1.1.X, das sind allerdings nur Intranet-Adressen. Ins Internet geht über einen Proxy.

Wir stellen Tastaturen her. Die Rechner was ich ansteuern will sind Prüfrechner wo meine Prüfsoftware läuft (Siehe Freeware-Abteilung der DP). Alle Rechner haben 0.0.0.255 als Subnet-Mask, der Broadcast geht auch raus, komtm aber nur bei einigen Rechnern an, die bei mir in der Nähe stehen. Die sind aber net das Ziel.

Ich habs jetzt mal so gelöst, dass ich die 253 möglichen Adressen einzeln durchlaufe, dauert ca 2 Sek, is also absolut in Ornung.

Hier noch unser Portal:
http://www.GETT.de

Fischy 5. Mär 2004 10:19

Re: Client-Server-Kommunikation im LAN
 
Ein Wort: Hä? :D

Was is das denn für ne doofe Subnetmask? Meinst du nicht vieleicht eher 255.0.0.0? Würde mich wundern wenn das so läuft, und wenn doch werden dadurch wohl auch deine Broadcasts nicht ankommen. Wenn einer sone Subnetmask schonmal gesehen hat wäre ich dankbar für ne Erklärung.

Gruß,

Fischy

Schubi 5. Mär 2004 10:25

Re: Client-Server-Kommunikation im LAN
 
Ups :oops: natürlich ist die Maske 255.0.0.0

Fischy 5. Mär 2004 10:38

Re: Client-Server-Kommunikation im LAN
 
Naja, die Adressvergabe versteh ich trotzdem nicht so ganz. Ist deine Firma so sehr auf dem aufsteigenden Ast, das ihr in nächster Zeit so ca 16777216 Rechner haben werdet (ohne Subnetze)? Wenn ja, sag mir wie ich mich da einkaufen kann :mrgreen:
Ich hab mich übrigens vertan, das wäre ein Class A Netz

Schubi 5. Mär 2004 10:54

Re: Client-Server-Kommunikation im LAN
 
Firmenintern kann man doch Adressen vergeben wie man lustig ist. Warum denn nicht?

Fischy 5. Mär 2004 11:15

Re: Client-Server-Kommunikation im LAN
 
Natürlich könnt ihr und ich wills euch ja auch nicht verbieten. Ich finde es halt nur ein wenig überdimensioniert. Zum Beispiel ist einer der Gründe warum jetzt IP6 eingeführt wird der, daß am anfang einfach zu viele Class A und B Netzwerke vergeben wurden, weil sich jeder dachte: "So viele Rechner wie IP-Adressen wird es nie geben". Ich bin einfach nur der Ansicht, daß ich mich wenn ich schon ein Netzwerk einrichte, auch an die Konventionen und Hintergedanken halte wenn ich es nicht muß. :warn: Aber wie du schon sagst, es ist ein Firmennetzwerk und im Prinzip könnt ihr das natürlich halten wie ein Dachdecker. Ich würds halt anders machen ;)

Gruß,

Fischy

Schubi 5. Mär 2004 11:44

Re: Client-Server-Kommunikation im LAN
 
Is ja auch Sache meines Admins. Und der hat nun mal keine Ahnung :mrgreen:

The-X 5. Mär 2004 13:52

Re: Client-Server-Kommunikation im LAN
 
bei 80 rechnern würden doch auch
IPs von 192.168.0.1 - 192.168.0.254 reichen und als
subnetmask 255.255.255.0 oder?

Damit wär's ein Class-C Net

Schubi 5. Mär 2004 14:04

Re: Client-Server-Kommunikation im LAN
 
@ The-X:
Schon klar. Wie gesagt, der Admin :mrgreen:

@ Fischy:
Ich versuch gerade verzweifelt per UDP Daten aus einem Memorystream zu versenden. Irgendwie bekomm ich die am anderen Ende nimemr zusammen. Kannst du mir helfen?

Fischy 5. Mär 2004 14:20

Re: Client-Server-Kommunikation im LAN
 
Ich versuchs mal, kann dir aber nicht versprechen, daß das in den nächsten 2 Tagen noch was wird (gleich is feierabend :) ). Du benutzt jetzt die ICS Komponenten? Wäre vieleicht hilfreich wenn du die Source postest in der du sendest bzw. empfängst.

Gruß,

Fischy

Schubi 5. Mär 2004 14:32

Re: Client-Server-Kommunikation im LAN
 
Senderseite:
Delphi-Quellcode:
   
    WSocket.Proto     := 'udp';
    WSocket.Addr      := '127.0.0.1';//'10.1.1.255';
    WSocket.Port      := PortEdit.Text;
    WSocket.LocalPort := LocalPortEdit.Text;
    WSocket.Connect;
    Stream1 := TMemoryStream.Create;
    Image1.Picture.Bitmap.SaveToStream(Stream1);
    WSocket.Send(Stream1.Memory,Stream1.Size);
    Stream1.Free;
    WSocket.Close;
Auf der Empfängerseite hab ich nur den Stream und speicher den dann irgendwo hin. Das ist ja irrelevant.

so schauts aus:
Delphi-Quellcode:
Stream1.Setsize(WSocket.BuffSize);
WSocket.Receive(Stream1.Memory,WSocket.BufSize);
Aber die Daten kommen in Etappen wenn mich nicht alles täuscht?!
Wie bastle ich die zusammen?

tobster 5. Mär 2004 15:02

Re: Client-Server-Kommunikation im LAN
 
Zitat:

Zitat von Schubi
Senderseite:
Delphi-Quellcode:
   
    WSocket.Addr      := '10.1.1.255';

Versuch mal die 255.255.255.255, die ich dir schon gepostet hatte. So funktionierts hier zumindestens.

Zitat:

Zitat von Schubi
Aber die Daten kommen in Etappen wenn mich nicht alles täuscht?!
Wie bastle ich die zusammen?

Es gibt diverse Beispiele, wo das schon drin steht. Ich suchs mal eben:

Delphi-Quellcode:
var RcvBuf: array [0..1023] of char;
    RcvLen: integer;

procedure TForm1.wsServerDataAvailable(Sender: TObject; Error: Word);
var Len,i: Integer;
    Source: TSockAddrIn;
begin
 { Receive the data that has arrived, put it after the data already here }
 Len := sizeof(Source);
 Len := wsServer.ReceiveFrom(@RcvBuf[RcvLen],SizeOf(RcvBuf)-RcvLen-1,Source,Len);
 if Len <= 0 then Exit;
 RcvLen := RcvLen + Len;
 RcvBuf[RcvLen] := #0;
 while TRUE do begin
  i := StrScan(@RcvBuf, #10) - RcvBuf;
  if i < 0 then break;
  RcvBuf[i] := #0;
  //Communication(StrPas(RcvBuf),StrPas(inet_ntoa(Source.sin_addr)));
  RcvBuf[i] := #10;
  if i >= (RcvLen-1) then begin
   RcvLen := 0;
   break;
  end;
  { Not the last line, move the next one in front of buffer }
  Move(RcvBuf[i+1],RcvBuf,RcvLen-I);
  RcvLen := RcvLen-i-1;
 end;
end;
Frei modifiziert nach dem Ereignis das im Beispiel UDPLSTN definiert ist, was ich auch schon geschrieben hatte.

Schubi 5. Mär 2004 15:08

Re: Client-Server-Kommunikation im LAN
 
Danke erstmal!
Subnet 255.255.255.255 geht auch net, hab ich längst probiert. Wie gesagt, ich sende einfach an alle Adressen nacheinander!
Werd jetzt erstmal deinen Code auseinandernehmen :mrgreen:

tobster 5. Mär 2004 15:11

Re: Client-Server-Kommunikation im LAN
 
Zitat:

Zitat von Schubi
Subnet 255.255.255.255

Ich hoffe, du meinst nicht wirklich Subnet. Das ist die Pseudo-IP, zu der du verbinden müsstest. :wink:

Fischy 5. Mär 2004 15:11

Re: Client-Server-Kommunikation im LAN
 
Ok, mal ganz auf die Schnelle die Theorie, vieleicht hilft dir das weiter:

Bei UDP werden im gegensatz zu TCP keine Empfangsbestätigungen (ACK) vom Empfänger an den Sender zurüch geschickt. Korrupte Pakete werden einfach verworfen. Außerdem sind Duplikation, Reihenfolgevertauschung und Paketverlust möglich. Das ist eben das unsichere an UDP. Du mußt die Daten nehmen wie sie kommen. Bei TCP Paketen steht im Header eine Sequenznummer (Seq) um die Reihenfolge zu bestimmen. Die gibt es bei UDP Paketen nicht. In deinem Netzwerk sollte es aber nicht zu Fehlern kommen. Was du prinzipiell machen kannst, ist deine Anwendung die ACKs übernehmen zu lassen. Ich hab grad nochmal ein par Folien gefunden, die dir bestimmt weiterhelfen.

Gruß,

Fischy

Schubi 5. Mär 2004 15:23

Re: Client-Server-Kommunikation im LAN
 
@ Tobster:
Ich dachte du sprichst auf das Subnet-Problem an. Die Verbindung mit 127.0.0.1 geht wunderbar. Warum sollte ich da 255.255.255.255 nehmen?

@Fischy: Danke erstmal

tobster 5. Mär 2004 17:12

Re: Client-Server-Kommunikation im LAN
 
Zitat:

Zitat von Schubi
@ Tobster: Die Verbindung mit 127.0.0.1 geht wunderbar. Warum sollte ich da 255.255.255.255 nehmen?

Naja, weil die 127.0.0.1 nur auf den eigenen Rechner zeigt und keinen Broadcast verursacht. Zum Testen ob überhaupt was übertragen wird ist sie natürlich geeignet.

Schubi 5. Mär 2004 19:43

Re: Client-Server-Kommunikation im LAN
 
Das Broadcast-Problem ist doch schon gelöst!
Mir gehts jetzt drum ne Datei zu übertragen, hätte ich vieleicht in einen andere Thread packen können, passt aber noch recht gut zum Topic.


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