Autor Beitrag
Maikiboy
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 27.04.07 14:10 
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.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 27.04.07 15:40 
ausblenden 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 >= 20then
        AllCommandTimer.Enabled := False;
end;


So hats letzendlich funktioniert.

Trotzdem danke
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 27.04.07 16:10 
Moin und :welcome: im Forum!

user profile iconMaikiboy 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:
ausblenden 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;
  // --- hier geht´s im OnConnect oder im OnError des Sockets weiter
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; // Verbindung trennen
  // --- hier geht´s dann im OnDisconnect weiter
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;
  // --- hier geht´s dann wieder im OnConnect oder im OnError des Sockets weiter
end;

// im OnError-Ereignis des Sockets dann noch den Fehler behandln/loggen und ErrorCode := 0 setzen,
// damit keine Exception ausgelöst wird.

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 hin. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Maikiboy Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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!