Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Socket-Text an mehrere Rechner nacheinander im Netzwerk send (https://www.delphipraxis.net/90877-socket-text-mehrere-rechner-nacheinander-im-netzwerk-send.html)

Maikiboy 25. Apr 2007 11:07


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:
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;
Ist kein guter Quelltext, ich weis aber wie gesagt, sollte nichts grosses sein daher bissel Spaghetti Code.


gruss und schonmal DAnke

Maik

SirThornberry 25. Apr 2007 11:11

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.

Maikiboy 25. Apr 2007 11:20

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

SirThornberry 25. Apr 2007 11:26

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:
Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen');
UND
Delphi-Quellcode:
Memo1.Lines.Add('Socket zu ' + tempip + ' konnte nicht geschlossen werden');
direkt hintereinander aufrufst wird logischer Weise auch beides hintereinander gemacht.
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"

Maikiboy 25. Apr 2007 11:29

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;

Gruber_Hans_12345 25. Apr 2007 11:31

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;

Maikiboy 25. Apr 2007 11:31

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Jop, so ist es auch bzw. so hab ichs eben geändert.

SirThornberry 25. Apr 2007 11:33

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.

Maikiboy 25. Apr 2007 11:37

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:

Es sind zwischenzeitlich neue Beiträge zu diesem Thread hinzugekommen oder es wurden welche editiert.
Vielleicht magst Du einen Blick auf die Themen-Vorschau (unten auf dieser Seite) werfen und die neuen Beiträge ggf. berücksichtigen. Neue bzw. editierte Beiträge sind farblich hervorgehoben.
An die Macher: Das ist doch mal eine geile Funktion! :-)

Abbrechen tut er mit nem asynchronen Socketfehler

Apollonius 25. Apr 2007 12:53

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?

SirThornberry 25. Apr 2007 12:55

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!

Apollonius 25. Apr 2007 13:01

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;

SirThornberry 25. Apr 2007 13:09

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.

Maikiboy 26. Apr 2007 14:59

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Zitat:

Und auf der anderen Seite gibt es wirklich einen TServersocket, der auf dem selben Port lauscht?
Jap, das funktioniert.

Zitat:

warum trennst du die verbindungen wenn du sie danach wieder aufbaust?
Es wird aber zu einer anderen IP aufgebaut!

Zitat:

Dein Fehler könnte darin liegen das der Server nicht erreichbar ist
Doch, die Rechner sind alle an und erreichbar.

Zitat:

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!
Wie lange soll ich da warten? Bzw. wie würde ich das am besten machen?

Apollonius 26. Apr 2007 16:45

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Habe ich schon geschrieben...
Delphi-Quellcode:
repeat
application.processmessages
until clientsocket1.active;
Ist vielleicht nicht elegant, aber es funktioniert. Wenn es dir die CPU zu sehr auslastet, bau halt ein sleep rein.

Maikiboy 26. Apr 2007 16:57

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?

Apollonius 26. Apr 2007 17:01

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Sollte so eigentlich funktionieren.

Maikiboy 26. Apr 2007 17:07

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Nein, tut es nicht. Er macht nach
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;
irgendwie nichts mehr.

Apollonius 26. Apr 2007 17:16

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.

Maikiboy 26. Apr 2007 17:17

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:
    Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geschlossen');
das macht er immer

Delphi-Quellcode:
    Memo1.Lines.Add('Socket zu ' + tempip + ' erfolgreich geöffnet');
und das.

Aber die danachfolgenden sachen wie SendText scheint er anscheinend net zu machen. Auch die ausgaben in das memo feld passieren nicht.

Maikiboy 26. Apr 2007 17:47

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;

Maikiboy 27. Apr 2007 12:40

Re: Socket-Text an mehrere Rechner nacheinander im Netzwerk
 
Was ist eigentlich mit Client.Free, muss man damit noch irgendwie arbeiten?

Delphi-Quellcode:
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;
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?

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 :-)

Apollonius 27. Apr 2007 14:00

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;

Maikiboy 27. Apr 2007 14:37

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
    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 funktionierts, danke für die Hilfe.

Maikiboy 8. Mai 2007 14:03

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:
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;
gruss Maik

Maikiboy 9. Mai 2007 12:11

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