Entwickler-Ecke
Internet / Netzwerk - Socket-Text an mehrere Rechner nacheinander im Netzwerk send
Maikiboy - Fr 27.04.07 14:10
Titel: Socket-Text an mehrere Rechner nacheinander im Netzwerk send
Hallo,
Ich hab ein kleines Netzwerkverwaltungstool geschrieben, ist nichts grosses ohne grosse Spielerein.
Ich wähle die IP's ganz einfach aus ner Listbox und wähle die Aktion. Nun will ich aber das alle Rechner nacheinander aus der ListBox Text gesendet bekommen.
Ein Timer durchläuft auch ganz gut die Listbox, aber irgendwie kommt nie was beim "Server" an.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.AllCommandTimerTimer(Sender: TObject); var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; Memo1.Lines.Add('Befehl wäre:' + AllCommand); try Client.Close; Client.Host := tempip; Client.Open; sleep(100); Client.Socket.SendText(AllCommand); Memo1.Lines.Add('Erfolgreich Befehl ' + AllCommand + ' an IP ' + tempip + ' gesendet'); except Memo1.Lines.Add('IP ' + tempip + ' konnte nicht abgearbeitet werden'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; |
Ist kein guter Quelltext, ich weis aber wie gesagt, sollte nichts grosses sein daher bissel Spaghetti Code.
Hab auch schon mehrere Varianten Probiert bin aber nie zu einem brauchbaren Ergebnis gekommen.
gruss und schonmal DAnke
Maik
Maikiboy - Fr 27.04.07 15:40
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.AllCommandTimerTimer(Sender: TObject); var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try begin Client.Close; Client.Host := tempip; Client.Open; repeat sleep(100); application.processmessages; until client.active; Client.Socket.SendText(AllCommand); if (Client.Active) then Memo1.Lines.Add('Client ist aktiv.'); Memo1.Lines.Add('Erfolgreich Befehl ' + AllCommand + ' an IP ' + tempip + ' gesendet'); end; except Memo1.Lines.Add('IP ' + tempip + ' konnte nicht abgearbeitet werden'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= 20) then AllCommandTimer.Enabled := False; end; |
So hats letzendlich funktioniert.
Trotzdem danke
Narses - Fr 27.04.07 16:10
Moin und :welcome: im Forum!
Maikiboy hat folgendes geschrieben: |
So hats letzendlich funktioniert. |
Auch wenn es soweit du es verwendest "funktioniert", ist die Vorgehensweise mit der Pollingsschleife für die Socket-Komponenten (im non-blocking-mode) "gegen den Strich gebürstet"... :?
Du solltest das vernünftig ereignisorientiert machen, also auch ohne diesen Timer. Ansatz wäre in etwa so:
Du startest den Versand der Nachricht(en) z.B. mit einem Button:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.Button1Click(Sender: TObject); begin Client.Close; Client.Host := ListIp.Items.Strings[ListIp.Itemindex]; Client.Open; end;
procedure TForm1.ClientOnConnect(Sender: TObject; Socket: TCustomWinSocket); begin Client.Socket.SendText(AllCommand); Memo1.Lines.Add('Erfolgreich Befehl ' + AllCommand + ' an IP ' + Socket.RemoteAddress + ' gesendet'); Client.Socket.Close; end;
procedure TForm1.ClientOnDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin if (ListIp.ItemIndex < ListIp.Count) then ListIp.ItemIndex := ListIp.Itemindex + 1; Memo1.Lines.Add('Verbindung getrennt, nächste Verbindung: '+ListIp.Items.Strings[ListIp.ItemIndex]); Client.Host := ListIp.Items[ListIp.Itemindex]; Client.Open; end;
|
Auf diese Weise hast du eine Ereigniskette und die Socketkomponente wird "designgerecht" verwendet. ;)
Hinweis am Rande: man kann in deinem Code zwar nicht erkennen, wie du das Protokoll für deine Anwendung ausgelegt hast, aber falls du mal Probleme mit den Befehlen kriegst, dann schau mal
hier [
http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html] hin. ;)
cu
Narses
Maikiboy - Fr 27.04.07 16:31
Danke für diesen Tipp, ist auch nur son spaghetti code geworden weil ich zeitdruck hatte.
Werde das die Woche mal irgendwann überarbeiten, wenn wieder zeit ist.
DAnke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!