![]() |
UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner ausfä
Hallo Wissende,
ich habe folgendes Problem. In einem lokalen Netzwerk von 12 oder mehr Rechnern gibt es einen SQL-Server, der bei Änderungen XML-Strings verteilt, welche die Clients per UDP erhalten und in ihrer Anzeige (TWebbrowser) aktualisieren. Das Ganze funktioniert ganz gut. Das Problem besteht darin, dass es vorkommt, dass ein oder mehrere Rechner auf einmal keine Protokolle mehr verarbeiten, weil scheinbar die UDP-Komponente inaktiv ist. Ich habe folgendes eingestellt. Port ist 8091 und HOST 255.255.255.255. Die Property Activ steht schon bei Start auf True. Ich vermute, dass es auch zu Problemen kommt, wenn das Programm gestartet wird und Protokolle einlaufen. Scheinbar ist das Problem so gravierend, dass davon auch andere Rechner betroffen sind, die bis zu diesem Zeitpunkt keine Probleme hatten. Wenn das der Fall ist, kommt es vor, dass dann gleich mehrere Rechner das Protokoll nicht mehr verarbeiten. Ich habe an meiner Hauptverwaltungsapplikation auch einen Button eingerichtet, der einen String per UDP sendet, welcher die Clients dazu auffordert selbst eine Nachricht per UDP zu senden und der Hauptapplikation ihren Rechnernamen mitzuteilen. Nach dem Ausfall eines Clients waren von vormals 12 Clients nur noch 3 in der Lage ihren Namen zu senden. Die Clients senden auf dem Port 8090, also einem eigenen Port. Nun meine Fragen. Wie kann ich dieses Problem umgehen/lösen? Macht es Sinn Active := True erst bei OnShow der Applikation zu setzen? Kann es sein, dass ein Rechner gleich mehrere Rechner mit "runter reisst"? Gibt es Ports, die besonders "stabil" sind? Was kann sonst noch die Ursache für das hier vorliegende Problem sein? |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Also da ich noch keine Antwort erhalten habe, werde ich mal schildern, was ich nun getan habe, um das Problem einzugrenzen und zu minimieren.
Der UDPServer wird erst 3 Sekunden nach dem OnShow des Hauptformulares Active:=True gesetzt. Damit will ich erreichen oder sicherstellen, dass einlaufende Protokolle die UDP-Komponente nicht direkt beim Start "deaktiviert". Heute war also wieder ein grosser Livetest und 9 Clients liefen ca. 2 Stunden stabil und haben die verarbeiteten Daten ordentlich verarbeitet. Leider stieg dann irgendwann der erste Client aus, erhält also keine Daten mehr. Und direkt danach stieg der nächste aus. Zur Zeit sind nach 3 Stunden nur 7 da. Wie würdet Ihr das lösen? Soll ich vielleicht nen Timer einbauen, der 1 mal pro Minute den Aktivitätszustand prüft und notfalls die Komponente wieder aktiviert? Aber auf der anderen Seite muss es ja einen Grund haben, dass die Dinger immer wieder mal gern offline gehen. Wird die Komponente vielleicht deaktiviert, wenn der DatenString zu gross ist, oder wird das nur der Überschuss abgeschnitten?? Ich würde mich über hilfreiche Kommentare freuen... |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Hi,
Wenn das keine Ultraschnellen Verbindungen sein sollen, würd ich das ganze noch einmal mit TCP neu auflegen/ändern. Bei TCP wird sichergestellt das Pakete auch ankommen. Zudem solltest du das nicht mit OnSHow lösen, da dieses beim Programmstart u.U. mehrmals ausgefürt wird. So far, inh3r1ted |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Das Problem ist, dass ich hier vor Ort nicht mehr kurzfristig auf TCP umstellen kann...
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Des is blöd.
Ich würde erstmal sichergehen das sie überhaup non-active sind, indem du mit einem timer dies überprüfst. Nimmst du Indy-UDP oder die Sockets? Wenn Indy, welche Version, 9 oder 10 |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Danke für Deine Antwort.
Ja, ich nehme die UDPClient und UDPServer von Indy. Wenn es läuft ist wirklich alles prima und falls mal EIN Protokoll nicht ankommt, ist das nicht so wild, aber das die Dinger gar nichts mehr machen, ist unschön. Ich werde auf jeden fall mal einen Timer den Zustand überprüfen lassen und schreibe mir mal bei OnClose den Zusatand in eine Ini, um sehen zu können, ob es wirklich daran liegt. Noch einen Vorschlag? Ich habe auch die Freeze von Indy mit drauf, weiss aber nicht genau, was die eigentlich tun soll.... |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Du meinst Anti-Freeze ;)
Schau mal in die Hilfe, da stehts. Ich würde auch noch überprüfen wie weit/unweit die pakete kommen. |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Zitat:
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Ob sie tatsächlich verschickt werden, dann ob sie esbis zum anderen pc schaffen nur möglicherweise vom udp ignoriert da er vllt non-active ist
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Naja ich habe ja an meinem Verwealtungstool einen Client und einen Server und mit dem Client sende ich die Daten. Ich kann auch nen String schicken, der den Empfänger dazu zwingt dem Verwaltungstool einen String mit seinem PCNamen zu senden. Die empfengenen Namen trage ich dann in eine Listbox ein. Dadurch weiss ich, welcher Rechner noch per UDP kommuniziert und welcher nicht. Meinstest Du das vielleicht?
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Und der Server sendet garnichts?
Wie regelst du das mit der Kommunikations, steuerst du die Clients via deren IP-Adressen an? Möglicherweise liegt das Problem daran, das sich die IP-Adresse spätestens alle 24 stunden ändert |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Also nochmal ausführlicher:
Verwaltungsprogramm (welches die Inhalte an die Clients sendet) besitzt: UDPClient (zum senden der Inhalte) UDP Server (zum eventuellen Empfang der ClientNamen) Clientrechner besitzt UDPClient (zum Senden des PCNamen) UDP Server (zum Empfang aller Nachrichten und Inhalte) --------------------------------------------------- Verwaltungsprogramm sendet einen String als Stringarray
Delphi-Quellcode:
---------------------------------------------------
SendMessage('UpdateSSP$$' + SSPContent);
Client erhält den String und splittet ihn bei $$ Wenn Strings[0], wie hier im Beispiel = UpdateSSP ist, weiss das Tool, was es zu tun hat. Steht da aber SendPCName, sendet der Client per UdpClient an das VerwaltungsTool seinen Namen. Mehr nicht. Das funzt ja auch alles ganz toll, aber leider scheint die UDPServer-Komponente an den Clients, welche die Daten ja empfängt, gern mal abzuschmieren. Alle Clients verhalten sich immer gleich, weshalb ich sie nicht steuern muss. Sie tun es einfach selbst, wenn denn Daten ankommen, bzw. wenn die UDPServer aktiv ist, was hier das Problem zu sein scheint. Mit der Ip der Clients stelle ich gar nix an, noch nicht. |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Laufen server und client auf dem selben port?
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Nein, das ist natürlich abgestimmt. Es funktioniert ja auch in der Masse. Daran kanns also nicht liegen.
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Habt ihr vieleicht einen DHCP Server laufen wenn ja is das ein Windows Server oder ein Router.
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Hm, interessante Frage, aber wir haben bei uns keinen DHCP-Server laufen. Jeder Rechner hat seine eigene zugewiesene IP.
Ich bin nun an dem Punkt, wo ich nicht mehr weiter weiss, denn ich hatte eben den Fall, das ein Rechner nicht mehr auf eingehende Protokolle reagiert hat. Ich habe dann das Programm beendet und in die Ini geschaut. UDPServer und UDPClient waren zum Zeitpunkt des Programmendes aktiv. Dann wird mir wohl auch ein Timer nix nützen, der den Zustand der beiden Komponenten überprüft und notfalls aktiviert. Noch irgendwelche Ideen oder Vorschläge? |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Sendest du wirklich auf die richtige Broadcast-IP?
Wenn deine SubNetzMask z.B. 255.255.255.0 ist und deine IP-Adresse wäre 10.2.2.120, dann müsstest du auf 10.2.2.255 senden, um alle Rechner in deinem Netzwerksegment zu erreichen. Sind alle Rechner im gleichen Segment oder gibt es da einen Router, der UDP weiterleitet? |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Hast du mal probiert ob es wieder funktioniert wenn du, nachdem er streik via eines buttons den zustand auf inaktiv und anchließend wiedr auf aktiv zu setzen?
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Hallo Shmia,
Zitat:
Netzwerksegmenttechnisch haben aber alle Clients eine IP in diesem Bereich: 192.168.2.x. Die Clients haben ein eigenes Netzwerk und nur der "Server" kommt noch in ein anderes Netzwerk. Demnach müsste ich auf 192.168.2.255 senden!? Aber was macht das besserer und/oder sicherer und vor allem stabiler. Ich frage nicht kritisch, nur neugierig, denn ich versteh die Welt nicht mehr, wenn es daran liegen sollte. Ich bin dankbar für jeden Tipp und werde das hier auf jeden Fall ausprobieren. |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Zitat:
EDIT: Nach nun 10-stündigem Dauerbetrieb sind von anfangs 9 Clients nur noch 5 "OnAir". Normal ist das nicht, aber gestern waren nach 2 Stunden schon alle Clients weg. |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Also das hört sich so an als würde der UDPClient irgenwie aussetzen.
Ich hatte das mal mit dem TCPClient und bei mir wahr das das die Netztwerkkarte irgendwann in den Energiesparmodus geschlatet hat, nachdem ich das in der Netzwerkkarte abschaltet hatte wahr das weg. |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Um Gottes Willen. Das fehlte mir gerade noch. Naja aber die Karte schläft doch nur ein, wenn kein Traffic ist...Oder? Wir haben hier maximal ne Pause von 20 Minuten. Ansonsten herscht in dem Netzwerk Dauerbetrieb. Ist aber ein Interessanter Ansatz.
|
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Ich würde mal den gesamten Netzwerkverkehr mit Ethereal sniffen ... dazu muss die Infrastruktur über einen Hub laufen, oder du verwendest Cain und ARP-Spoofing damit alle Daten über einen bestimmten PC laufen (könnte das Ergebnis verfälschen) ...
Dann kannst du kontrollieren, ob die Pakete ins Netz rausgehen, und ob eine Antwort kommt und nur nicht verarbeitet wird ... Evtl. richtest du noch ein, dass bei erhalt einer Nachricht eine Message an den Absender geschickt wird ... dann siehst du beim Sniffen gelich, auf wessen Seite die Antwort fehlt. mfG Markus |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Puh Sniffen und Etheral lese ich heute zum erstenmal. Aber selbst wenn ich weiss, welcher Client nicht mehr reagiert bringt mich das doch nur bedingt weiter, weil die Komponente selbst ja aktiv zu sein scheint. Wie soll ich darauf reagieren?
Ich habe da 2 Ansätze: 1. Ich lass ein Extra-Tool mitlaufen, welches per UDP-Befehl die Client-Software restartet. Dies setzt natürlich voraus, dass dieses Tool auch auf das UDP-Protokoll anspringt und sich nicht auch noch aufhängt... :wink: 2. Ich gehe persönlich zu dem Client und reboote ihn... Ist beides nicht so prall oder? Ich habe leider nicht viel Ahnung vom Sniffen etc...Ich kann natürlich ein Tool mitlaufen lassen, welches alles protokolliert, aber ich zeichne ja schon am Haupttool den Ausgang komplett mit. Dat Ding is stabil und wie schon erwähnt - Gestern abend liefen nach 12 Stunden noch 4 von 9. Es funzt also grundsätzlich, ist aber sehr unstabil. Steigt ein Client einmal aus, dann auch für immer bis zur Termination... |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Ein Sniffer ist ein Programm, welches den Netzwerkverkehr mitschneidet ...
Das hat folgenden Vorteil ... du kannst zurzeit nicht garantieren, dass die Nachrichtenpackete bei den Clients angekommen sind ... mit einem Sniffenden PC kannst du verfolgen, welche Datenpackete von Wo nache Wo gehen ... Dann hast du den Beleg, dass die Daten am Ziel ankommen ... es könnte genausogut sein, dass sich dein Server verschluckt und die Daten gar nicht rausgehen ... Das Problem ist, dass dein Haupttol ja evtl. einen Fehler macht ... deshalb ist eine unabhängige und sicher Funktionierende kontrolle praktisch. mfG Markus |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Zitat:
Aber da ich ja weiss, welche Clients nicht mehr laufen, kann ich vielleicht VIA Netzwerk die Applikation beenden und neu starten??? Das würde mir schon sehr weiterhelfen. Ginge das? Ich weiss neue Frage - neuer Thread, aber in diesem Fall hängt das irgendwie zusammen... |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Dazu bräuchtest du aber eine ständig offen Verbindung, bevorzugt über TCP, um sicherzustellen, dass der CLient reagiert ...
Und wegen dem Sniffer ... ich hab keine Ahnung, wie das UDP-Protokoll genau aufgebaut ist, vielleicht verschluckt sich der Client an einer Überschneidung zwischen senden und empfangen oder so ... ich kenne mich nich so gut auf diesem Gebiet aus ... Vielleicht einfach bei den Clients alle ... 5 Min einen zweiten Sender/Empfänger starten, und dann den alten Auflösen ... mfG Markus |
Re: UDP-Protokolle laufen nicht mehr ein, wenn ein Rechner a
Ich schau mal, wie ich das lösen kann...
BTW. Seit 2,5 Stunden läuft alles stabil...keiner ausgestiegen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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