![]() |
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 |
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. |
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: |
Re: Client-Server-Kommunikation im LAN
Zitat:
![]() 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! |
Re: Client-Server-Kommunikation im LAN
Danke, funktionieren wunderbar die Komponenten und sind gegenüber den Indys ne Wohltat :mrgreen:
|
Re: Client-Server-Kommunikation im LAN
Mein Reden! 8)
|
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? |
Re: Client-Server-Kommunikation im LAN
Ich habe das ganze mit jeweils zwei WSockets gebaut gehabt, die folgendermaßen gestartet wurden:
Code:
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).
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; 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. |
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 |
Re: Client-Server-Kommunikation im LAN
Zitat:
Mehr fällt mir aber auch nicht mehr ein, ausser, das es eigentlich funktionieren müsste. :-D |
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: |
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 |
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: ![]() |
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 |
Re: Client-Server-Kommunikation im LAN
Ups :oops: natürlich ist die Maske 255.0.0.0
|
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 |
Re: Client-Server-Kommunikation im LAN
Firmenintern kann man doch Adressen vergeben wie man lustig ist. Warum denn nicht?
|
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 |
Re: Client-Server-Kommunikation im LAN
Is ja auch Sache meines Admins. Und der hat nun mal keine Ahnung :mrgreen:
|
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 |
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? |
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 |
Re: Client-Server-Kommunikation im LAN
Senderseite:
Delphi-Quellcode:
Auf der Empfängerseite hab ich nur den Stream und speicher den dann irgendwo hin. Das ist ja irrelevant.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; so schauts aus:
Delphi-Quellcode:
Aber die Daten kommen in Etappen wenn mich nicht alles täuscht?!
Stream1.Setsize(WSocket.BuffSize);
WSocket.Receive(Stream1.Memory,WSocket.BufSize); Wie bastle ich die zusammen? |
Re: Client-Server-Kommunikation im LAN
Zitat:
Zitat:
Delphi-Quellcode:
Frei modifiziert nach dem Ereignis das im Beispiel UDPLSTN definiert ist, was ich auch schon geschrieben hatte.
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; |
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: |
Re: Client-Server-Kommunikation im LAN
Zitat:
|
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 ![]() Gruß, Fischy |
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 |
Re: Client-Server-Kommunikation im LAN
Zitat:
|
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