![]() |
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. Eine Schleife durchläuft auch ganz gut die Listbox, aber irgendwie kommt nie was beim "Server" an.
Delphi-Quellcode:
procedure TForm1.MassSend(Command:String);
begin; ListIp.ItemIndex := 0; AllCommand := Command; AllCommandTimer.Enabled := true; end;
Delphi-Quellcode:
Ist kein guter Quelltext, ich weis aber wie gesagt, sollte nichts grosses sein daher bissel Spaghetti Code.
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); //das gibt er immer aus Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); //das gibt er immer aus Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; try Client.Socket.SendText(AllCommand); Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); //das gibt er immer aus Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; gruss und schonmal DAnke Maik |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
du schreibst das die schleife die Listbox durchläuft. Aber im Quelltext ist nirgends eine Schleife zu sehen sondern nur das du den ItemIndex auf 0 setzt.
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Naja, nicht wirklich ne Schleife :D
Das war mein erster Ansatz, den ich aber verworfen hatte weil ich dachte das das zwecks anti spam oder so net geht, was eigentlich auch blödsinn ist :-) Jetzt ist es folgendermassen: Beim Click auf den Button wird ein Timer aktiviert der jede Sekunde durchläuft. So, bei onTimer wird dann der ItemIndex jeweils 1 höher gemacht und die entsprechenden befehle werden gesendet. also praktisch ne TimerSchleife :D gruss Maik |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
was versuchst du eigentlich mit dem "try" zu erreichen? Was ist der Sinn davon?
wenn du
Delphi-Quellcode:
UND
Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen');
Delphi-Quellcode:
direkt hintereinander aufrufst wird logischer Weise auch beides hintereinander gemacht.
Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden');
Nur seh ich eben den Sinn nicht warum du 2 gegensetzliche Meldungen ausgibst. Das ist wie die Aussage: "Der Erde ist eine Scheibe und die Erde ist Rund und die Erde ist eine Elypse und die Erde existiert gar nicht" |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
rofl :D
OK, das war mein Fehler :D Hatte was falsch gepastet weil ich die kommentare noch fett machen wollte. So ist er eigentlich:
Delphi-Quellcode:
procedure TForm1.AllCommandTimerTimer(Sender: TObject); var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; try Client.Socket.SendText(AllCommand); Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); except Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
wenn schon dann so
Delphi-Quellcode:
procedure TForm1.AllCommandTimerTimer(Sender: TObject); var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); Client.Close; except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); Client.Open; except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; try Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); Client.Socket.SendText(AllCommand); except Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Jop, so ist es auch bzw. so hab ichs eben geändert.
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
jetzt wäre es noch sinnvoll zu wissen von welchem Typ Client ist und mit welcher Meldung er abbricht.
@Gruber_Hans_12345: Beim besten willen, aber so ist es falsch. Denn so würde die Meldung das es erfolgreich war auch kommen wenn ein Fehler kam und anschließend kommt noch die Meldung das es nicht erfolgreich war. Also widersprüchlich! Und es macht ja nicht wirklich sinn generell erstmal eine Erfolgsmeldung auszugeben und erst danach den Befehl wirklich auszuführen der dann am Ende eventuell gar nicht erfolgreich ausgeführt wurde. |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Client ist vom Typ TClientSocket
Nochma der aktuelle QCode:
Delphi-Quellcode:
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; try Client.Socket.SendText(AllCommand); Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); except Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; Zitat:
Abbrechen tut er mit nem asynchronen Socketfehler |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Und auf der anderen Seite gibt es wirklich einen TServersocket, der auf dem selben Port lauscht?
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
warum trennst du die verbindungen wenn du sie danach wieder aufbaust? Dein Fehler könnte darin liegen das der Server nicht erreichbar ist oder darin das du open aufrufst und danach gleich den Text sendest ohne zu warten das die Verbindung hergestellt wurde. Open ist so weit ich mich erinnere nicht blockierend!
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
@Sir Thornberry:Ach, da war doch was...
Ich hab das immer so gelöst:
Delphi-Quellcode:
client.open;
repeat application.processmessages; until client.active; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
wäre eine Möglichkeit welche die CPU aber reichlich auslastet. Dann doch lieber die Events der Klasse nutzen.
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Habe ich schon geschrieben...
Delphi-Quellcode:
Ist vielleicht nicht elegant, aber es funktioniert. Wenn es dir die CPU zu sehr auslastet, bau halt ein sleep rein.
repeat
application.processmessages until clientsocket1.active; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Delphi-Quellcode:
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; repeat application.processmessages until Client.active; try Client.Socket.SendText(AllCommand); Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); except Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; Ist doch richtig oder? |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Sollte so eigentlich funktionieren.
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Nein, tut es nicht. Er macht nach
Delphi-Quellcode:
irgendwie nichts mehr.
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; repeat application.processmessages until Client.active; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Wie hoch ist das Intervall des Timers? Und step das Ganze mal mit dem Debugger durch.
|
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Intervall ist auf 1000
Debuger kommt glei Im Projekt pClient ist eine Exception der Klasse ESocketError mit der Meldung Asynchroner Socket-Fehler 10060 aufgetreten. Das kommt aber erst ganz zum schluss, also nachdem er die letzte von 20IP's aufgerufen hat, und der rechner ist net an. Also irgendwie klappt das net so ganz.
Delphi-Quellcode:
das macht er immer
Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen');
Delphi-Quellcode:
und das.
Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet');
Aber die danachfolgenden sachen wie SendText scheint er anscheinend net zu machen. Auch die ausgaben in das memo feld passieren nicht. |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
So, habs jetzt nochmal mit Sleep gemacht, folgt aber genau der gleiche Mist.
Er öffnet zwar sockets und so alles korrekt, aber er sendet merkwürdigerweise den Text nicht.
Delphi-Quellcode:
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen'); except Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden'); end; Client.Host := tempip; try Client.Open; Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet'); except Memo1.Lines.Add('Socket zu ' + tempip + ' nicht geöffnet'); end; sleep(900); try Client.Socket.SendText(AllCommand); Memo1.Lines.Add('IP ' + tempip + ' erfolgreich'); except Memo1.Lines.Add('IP ' + tempip + ' nichterfolgreich'); end; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= ListIp.Count) then AllCommandTimer.Enabled := False; end; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Was ist eigentlich mit Client.Free, muss man damit noch irgendwie arbeiten?
Delphi-Quellcode:
Solangsam werd ich verrückt, hab schon soviel Versucht, und so wie ichs jetzt gerade gepostet habe muss es doch eigentlich funtzen oder seh ich das falsch?
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; begin tempip := ListIp.Items[ListIp.Itemindex]; try Client.Close; Client.Host := tempip; Client.Open; sleep(100); Client.Socket.SendText(AllCommand); Memo1.Lines.Add('Erfolgreich IP ' + tempip + ' abgearbeitet'); 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; Er gibt zwar immer aus Erfolgreich IP lala abgearbeitet, aber den text sendet er nie wirklich. Habe auch gerade nochmal getestet ob tempip und AllCommand gesetzt sind, und alles ist korrekt. Komisch, komisch :-) |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Mach mal direkt nach dem sendtext eine if-Abfrage rein, ob client.active auch wirklich wahr ist. Und mit dem sleep meint ich eigentlich nur Folgendes, um die Auslastung der CPU zu verringern:
Delphi-Quellcode:
repeat
sleep(100); application.processmessages; until client.active; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
Delphi-Quellcode:
so funktionierts, danke für die Hilfe.
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; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
So, ich habe das ganze jetzt noch etwas umgeschrieben und habe den komischen fehler das er nicht disconnectne mag und somit das Event OnDisconnect nicht ausgelösst wird.
Einer ne idee?
Delphi-Quellcode:
gruss Maik
procedure TForm1.AllCommandTimerTimer(Sender: TObject);
var tempip:String; var error:Byte; begin error:=0; tempip := ListIp.Items[ListIp.Itemindex]; GlobalCommand := AllCommand; GlobalIP := tempip; Client.Close; ListIp.ItemIndex := ListIp.Itemindex + 1; if (ListIp.ItemIndex >= 20) then AllCommandTimer.Enabled := False; end; procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin if (AllCommandTimer.Enabled = true) then begin Memo1.Lines.Add('Connect erfolgreich --> Sende ' + GlobalCommand); Client.Socket.SendText(GlobalCommand); end; end; procedure TForm1.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin if (AllCommandTimer.Enabled = true) then begin Memo1.Lines.Add('Disconnect erfolgreich --> Verbinde auf ' + GlobalIP); Client.Host := GlobalIP; Client.Open; end; end; |
Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
*push
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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