Autor Beitrag
Tristan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 14:26 
Hallo,

[Vorwort]
ich habe im Monent leider ein sehr dringendes Problem. Und zwar muss ich morgen meine Jahresarbeit www.delphi-forum.de/...52829&highlight=vor einem Komitee vorstellen und bewerten lassen. Als ich heute jedoch einen Probelauf mit den Laptops der Schule machte funktionierte rein gar nix, ihr könnt euch vorstellen dass es morgen relativ plamabel wäre :(
Man opfert über ein Jahr seine Freizeit für dieses Projekt und dann scheitert die gesamte Programmvorführung an einem Connectionsproblem. Gestern abend lief alles wunderbar, in meinem Netzwerk. Als ich dann heute früh einen Test ohne Verbindung zum Internet startete, lief nichst. Es scheitert glaube ich immer an der Hostauflösung bzw. DNS.

[Funktionierende Konfiguration]
Mein Rechner ist mit einem Swtich und einem Notebook gekoppelt. Der Switch hängt an einem Router und verbindet mich mit dem Internet.
IP Einstellungen (Mein Rechner):
IP Adrs. 192.168.1.3
Subnetmaske: 255.255.255.0
Standartgateway: 192.168.1.1 (Das ist der Router)
Bevorz. DNS: 192.168.1.1
-NetBios über TCP/IP aktivieren

IP Einstellungen (Notebook):
IP Adrs. 192.168.1.7
Subnetmaske: 255.255.255.0
Standartgateway: 192.168.1.1 (Das ist der Router)
Bevorz. DNS: 192.168.1.1
-NetBios über TCP/IP aktivieren

Alles funktioniert wunderbar.
jetz wird die Verbindung zwischen Switch und Router getrennt und der gateway+dns ausgetragen:
[Nichtfunktionierende Konfiguration]

IP Einstellungen (Mein Rechner):
IP Adrs. 192.168.1.3
Subnetmaske: 255.255.255.0
Standartgateway:
Bevorz. DNS:
-NetBios über TCP/IP aktivieren

IP Einstellungen (Notebook):
IP Adrs. 192.168.1.7
Subnetmaske: 255.255.255.0
Standartgateway:
Bevorz. DNS:
-NetBios über TCP/IP aktivieren

Fehler: Kein Befehl wird übertragen stattdessen kommt immer nur eine "Leerzeile" an. In meiner Log steht, "Server nicht gefunden oder verbindung nicht akzeptiert" Teilweise kommt auch etwas an, das dauert aber 20-30sekunden.

Der Code zum Senden und Empfangen sieht wie folgt aus:
[Steuerprogramm]
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:
29:
30:
<span style="color: blue">//Verbindung herstellen:</span>
With BefehleSocket do
 Begin
  Active:=False;
  Host:=ListView1.Selected.Caption; (In dieser Liste steht der Host z.b. "Station1"
  Active:=True;
 End;
<span style="color: blue">
//Befehl senden Bsp:</span>
var text:string;

text:=InputBox('Nachricht schicken''''');
text:='Nachricht'+text;
Befehlesocket.Socket.SendText(text);

<span style="color: blue">//Lesen von Client</span>
procedure TForm1.BefehlesocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var ReceiveStatus:string;
begin
ReceiveStatus:=Socket.ReceiveText;
//Alle Rückantworten/Status von Aktionen etc. werden über den Befehlesocket empfangen

if Pos('Status',receivestatus)>0 then //Wenn Status in String vorkommt Status rauslöschen und in Statusbar schreiben
 begin
 Delete(receiveStatus,1,6);
 StatusBar2.Panels[1].Text:=ReceiveStatus;
 Logmemo.Lines.Add(TimetoStr(Time) + '  ' + ReceiveStatus);
 end;
end;


[Teilnehmerprogramm]
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<span style="color: blue">//Befehle von Steuerprog. empfangen</span>

procedure TForm1.BefehlesocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var receivetext:string;
begin
receiveText:=Socket.ReceiveText);
Aktionen.receiveText:=receivetext; //Status übertragen

<span style="color: red">-->hier kommt teilweise eine Leerzeile an?!</span>

//Status holen
Aktionen.Status;

//Nachricht empfangen
if pos('Nachricht',receivetext)=1 then
Aktionen.Nachricht;

end;



Bitte helft mir dieses Problem zu beseitigen. Ich muss das Programm morgen um 7:30Uhr vorstellen. Ich somit nur noch "wenige" Stunden.

Danke jede Antwort ist willkommen.


Zuletzt bearbeitet von Tristan am Di 06.06.06 14:31, insgesamt 1-mal bearbeitet
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 14:29 
hat das irgendwas mit der DNS Auflösung vom Router zu tun?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 14:59 
Moin!

user profile iconTristan hat folgendes geschrieben:
hat das irgendwas mit der DNS Auflösung vom Router zu tun?

Ja, schätze ich mal; wenn du kein DNS hast, kannst du auch keine Hostnamen ("Station1") auflösen. ;)

Nimm mal die IPs der Rechner, nicht die Namen, dann sollte das auch ohne DNS klappen.

cu
Narses

//EDIT: wenn ich mir so deinen (Empfangs-)Code ansehe, dann fürchte ich, du hast das hier noch nicht gelesen... :|

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 15:19 
@Narses: Nein dein Tutorial kenne ich leider noch nicht. Ich habe mich jezt mal kurz reingelesen und muss sgane dass ist ja wirklich sehr umfangreich was du da zusammengestellt hast. Du verwendest ja das Trennzeichen #13. Bei mir wird der Befehl immer mit Pos rausgesucht. Das ist sicherlich verbesserungswürdig.

Könntest du mir trotzdem helfen, eine möglichst einfache, schnelle Variante zu finden das mein Code wieder funktioniert?

Oder müsste ich nur
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 
With BefehleSocket do
 Begin
  Active:=False;
  Host:=ListView1.Selected.Caption; (In dieser Liste steht der Host z.b. "Station1"
  Active:=True;


mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
With BefehleSocket do
 Begin
  Active:=False;
  adress:='192.168.1.3'; (hier muss die IP rein?)
  Active:=True;

ersetzen.

Und wie löse ich die Hosts dann in IP Adressen auf?

Gruß Tristan
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 15:26 
Moin!

user profile iconTristan hat folgendes geschrieben:
Könntest du mir trotzdem helfen, eine möglichst einfache, schnelle Variante zu finden das mein Code wieder funktioniert?

Ich hab kein Problem damit, wenn du nicht auf meine Tuts zurückgreifst. ;) Ich möchte dich nur darauf gefasst machen, dass es da Probleme geben kann - und wenn dein Lehrer genau da den Finger drauf legt, könntest du (unvorbereitet) ins "Schleudern" kommen... :mrgreen:

user profile iconTristan hat folgendes geschrieben:
Oder müsste ich nur
[...]
mit
ausblenden Delphi-Quelltext
1:
  adress:='192.168.1.3'; (hier muss die IP rein?)					

ersetzen.

Ja, das sollte reichen.

user profile iconTristan hat folgendes geschrieben:
Und wie löse ich die Hosts dann in IP Adressen auf?

Kurz gesagt, gar nicht. :D Ohne DNS, keine IPs zu Hostnamen :arrow: keine Arme, keine Kekse... ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 15:55 
user profile iconTristan hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
With BefehleSocket do
 Begin
  Active:=False;
  adress:='192.168.1.3'; (hier muss die IP rein?)
  Active:=True;

ersetzen...


Funktioniert leider auch nicht - es kommen wieder nur "Leerzeilen" an

Mit dem Lehrer ist das nicht ganz so schlimm nur ich möchte wenigstens die Funktionen zeigen die immer funktioniert haben. Und das geht im Moment leider noch nicht Warum auch immer
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 16:03 
Moin!

Firewall, Virenscanner, etc. pp., die "üblichen Verdächtigen" halt als Ursache schon ausgeschlossen? ;)

Ansonsten: pack mal den Code als ZIP hier rein, mit den paar Fragmenten da oben kann ich nicht wirklich was anfangen. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 16:28 
du hast Post :o
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 16:42 
Moin!

Klassisches Problem: du sendest bereits, ohne auf ein entsprechendes Connect-Ereignis gewartet zu haben. Guckst du. ;)

Das sollte es schon bringen, schätze ich. Hab noch nicht viel weiter gelesen, weil das ist auf jeden Fall erstmal ein Fehler. Gib mal Laut. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 17:21 
Das senden von Befehlen erfolgt in meiner Software aber eiegentlich getrennt. Dass heißt man verbindet sich mit dem Client wenn man auf das Item klickt und wenn man dann einen Button drückt, wird der Text zum Client gesendet. Es ist damit eigentlich eine recht große Pause zwischen connecten und senden.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 17:26 
Moin!

Und woher weißt du denn, dass du verbunden bist? Du reagierst ja nicht auf ein OnConnect (z.B: um die Buttons zu enablen...)? ;)

//EDIT: Was aber vermutlich sehr viel schlimmer ist, ist die Tatsache, dass du dich implizit auf die Ereignisse als Signalisierung verläßt (mein Link in die FAQ oben), das solltest du auf jeden Fall mit einem Buffer (z.B. ein String, der die empfangenen Zeichen sammelt) absichern. Noch besser wäre natürlich ein Protokoll, aber dafür wird dir jetzt einfach die Zeit fehlen, schätze ich... :|

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 19:48 
Nabend Narses,

ich hab mir dein Chatprogramm mal näher angeschaut.
bei mir siehts jetzt so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.BefehlesocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var receivetext, befehl:string;
      i:Integer;
begin
i := Clients.Items.IndexOfObject(Socket); // Client identifizieren
  if (i > -1then begin // Client ist in der Liste, Index "i" ist gültig
    ReceiveBuffer.Strings[i] := ReceiveBuffer.Strings[i] +Socket.ReceiveText; // Daten lesen

     if (ReceiveBuffer.Strings[i] <> ''then // wenn Daten da sind...
     Memo1.lines.addstrings(receivebuffer)


Das Memofeld beim Client hingegen so:
ausblenden Quelltext
1:
2:
3:
4:
5:
Nachrichtb

NachrichtbSperren

NachrichtbSperrenShutdown2

Wie kann ich die Befehle nun einzeln, in der richtigen Reihenfolge verarbeiten. Bzw. wie funktioniert das mit diesem trennzeichen?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 19:54 
Moin!

Du mußt an den einzelnen Datenfeldgrenzen ein Trennzeichen einfügen, z.B. das vorgeschlagene #13. Dann kannst du mit .Text der TStringList das ganze zerlegen (hat aber einen kleinen Haken -> siehe Tut). Besser ist die TParserStringList aus dem Tut, aber es macht hier jetzt sicher keinen Sinn, das Tut nochmal aufzurollen... :? Dann kannste das auch gleich lesen. ;)

cu
Narses

//EDIT: Ich hab nochmal deinen Code überflogen (muß ja nicht, dass du damit morgen auf der Nase liegst :|), und ich würde sagen, dass dein bisheriger "Protokoll-Ersatz" sich eigentlich locker in 2-3h auf einen Protokoll-Parser wie in meinem Tut vorgestellt, umrüsten läßt. Ich kenne aber dein Projekt zu wenig, um das mal eben machen zu können - jedenfalls nicht mal eben.

Versuch das umzusetzen, bei Fragen hier melden, ich will sehen, was ich machen kann. ;)

//EDIT2: Ach ja, deine Testausgabe läßt mich stark vermuten, dass es sich tatsächlich um das Signalisierungs-Problem (wie im FAQ-Beitrag dargestellt) handelt. Vielleicht so zur Beruhigung, dass du an der "richtigen" Stelle bastelst. ;)

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 20:09 
Ich bin schon die ganze Zeit dabei :o


[Teilnehmer/Client]
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TForm1.BefehlesocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
clients.AddItem(Socket.RemoteHost,socket);
ReceiveBuffer.Add(''); //Empfangsbuffer anlegen
{socket.SendText('empfangen');}
end;

procedure TForm1.BefehlesocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
if Errorcode<>0 then Begin statuslabel.Caption:='B.Socket: '+NetErrMessage(ErrorCode); LogFile('ERROR Befehle Socket: '+NetErrMessage(ErrorCode)); end;
errorcode:=0;
end;

procedure TForm1.BefehlesocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var receivetext, befehl:string;
      i:Integer;
begin
Aktionen.receiveText:=receivetext; //Status übertragen}

i := Clients.Items.IndexOfObject(Socket); // Client identifizieren
  if (i > -1then begin // Client ist in der Liste, Index "i" ist gültig
    ReceiveBuffer.Strings[i] := ReceiveBuffer.Strings[i] +Socket.ReceiveText; // Daten lesen
             Memo1.Text:=ReceiveBuffer.Strings[i];

     if (ReceiveBuffer.Strings[i] <> ''then // wenn Daten da sind...
     Memo1.lines.add('fertig'); {else Befehl:=BlowFish.Dekodiere(ReceiveBuffer.Strings[i]);}
         end;     

receiveText:=Befehl;
Aktionen.receiveText:=Befehl;

//Status holen
Aktionen.Status;

//Nachricht empfangen
if pos('Nachricht',receivetext)=1 then
Aktionen.Nachricht;

//Eingabe sperren
Aktionen.Sperren;
...
end;


[Steuerprogramm/Server]
ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
//Verbindung bei klicken auf client herstellen
dxWinXPBar2.Enabled:=false;
  With BefehleSocket do
   Begin
    if active=true then   close;  //versuche zu trennen
   Host:=ListView1.Selected.Caption;
   open; //verbinden...
   End;


procedure TForm1.BefehlesocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Statusbar2.Panels[0].Text:='Verbunden mit: '+ Socket.RemoteHost;
ReceiveBuffer:=''//Empfangsbuffer initalisieren
{socket.SendText('Befehlsocket Verbunden'); }
dxWinXPBar2.Enabled:=true; //buttons aktivieren
end;

procedure TForm1.BefehlesocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
dxWinXPBar2.Enabled:=false;
if Errorcode<>0 then
LogMemo.Lines.Add('Socket Verbindung: '+NetErrMessage(ErrorCode));
errorcode:=0;
end;

procedure TForm1.BefehlesocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var ReceiveStatus:string;
begin
ReceiveStatus:=Socket.ReceiveText;
//Alle Rückantworten/Status von Aktionen etc. werden über den Befehlesocket empfangen

if Pos('Status',receivestatus)>0 then //Wenn Status in String vorkommt Status rauslöschen und in Statusbar schreiben
 begin
 Delete(receiveStatus,1,6);
 StatusBar2.Panels[1].Text:=ReceiveStatus;
 Logmemo.Lines.Add(TimetoStr(Time) + '  ' + ReceiveStatus);
 end;
end;

procedure TForm1.dxWinXPBar2Items2Click(Sender: TObject);
var text:string;
begin
text:=InputBox('Nachricht schicken''''');
text:='Nachricht'+text;
Befehlesocket.Socket.SendText((text)+#13);
end;


so siehts im Moment aus. Ich versuche gerade irgendwo die Befehle zu trennen aber das klappt noch nicht.
Krieg schon langsam zittrige Augen von dem Anstarren des Quellcodes über stunden....
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 20:19 
Moin!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
// Verbindung bei klicken auf client herstellen
  dxWinXPBar2.Enabled := FALSE;
  With BefehleSocket do Begin
    if active=true then close;  //versuche zu trennen
  Host:=ListView1.Selected.Caption;
  open; //verbinden...
End;

Das darfst du so nicht machen, das knallt. Immer auf die Ereignisse warten...

Weiter mit einem Tipp:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.dxWinXPBar2Items2Click(Sender: TObject);
var text:string;
begin
text:=InputBox('Nachricht schicken''''');
text:='Nachricht'+#13+text+#13;
Befehlesocket.Socket.SendText(text);
end;

So muss das ungefähr laufen, dann haste die einzelnen Elemente in der Stringliste des Empfängers in einzelnen Strings (mit dem Protokoll-Parser).

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 22:19 
user profile iconNarses hat folgendes geschrieben:
Moin!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
// Verbindung bei klicken auf client herstellen
  dxWinXPBar2.Enabled := FALSE;
  With BefehleSocket do Begin
    if active=true then close;  //versuche zu trennen
  Host:=ListView1.Selected.Caption;
  open; //verbinden...
End;

Das darfst du so nicht machen, das knallt. Immer auf die Ereignisse warten...


Wie kann ich denn das Ereignis abgreifen? Bzw. darauf warten bis die Verbindung wirklich beendet ist.

Achso und ich hänge gerade wieder an der Bufferliste. Ich bekomms irgendwie nicht gebacken. Die Variante mit deinem Bufferprotokoll bekomme ich auf die Schnelle leider nicht hin. Wie gesagt, das Teil soll morgen halbwegs funktionieren. Ob ein paar Fehler drinne sind ist egal, aber besser als gar nichts so wie es gerade der Fall ist. Ist echt ne richtig miese Situation, dass der Fehler mir erst gestern abend aufgefallen ist.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
i := Clients.Items.IndexOfObject(Socket); // Client identifizieren
  if (i > -1then begin // Client ist in der Liste, Index "i" ist gültig
    ReceiveBuffer.Strings[i] := ReceiveBuffer.Strings[i] +Socket.ReceiveText; // Daten lesen

     commands.Text:=ReceiveBuffer.Strings[i];

     if (ReceiveBuffer.Strings[i] <> ''then // wenn Daten da sind...
      begin
       For i:=commands.Count-1 downto 0 do
        Begin

  receivetext:=commands.Strings[i];
   memo2.Lines:=commands;


Wenn ich eine Liste mit Befehlen habe (commands) die z.B. wie folgt aussieht:
sperren
nachricht:test
herunterfahren

wie kann ich die abarbeiten bzw. die schon ausgeführten Befehle löschen.
ich dachte eigenltich mit for i:=commands.count-1 downto 0 do
Begin
if pos('sperren',commands.strings[i])>0 then
Begin nachrichtanzeigen etc. commands.delete(i) end.
End;

Wie gesagt soll nur halbwegs funktionieren, ich mach mir langsam nen Knoten ins Gehirn. Die präsentation für morgen muss ich mir auch noch reinziehen
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 22:28 
mir ist gerade noch eine "unsaubere" Lösung eingefallen: was ist, wenn ich einen timer mit 500ms den ReceiveText des Sockets abfragen lasse? Dann bin ich unabhängig vom Ereignis und bekomme als strings? oder lieg ich da falsch
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.06.06 22:48 
Moin!

user profile iconTristan hat folgendes geschrieben:
mir ist gerade noch eine "unsaubere" Lösung eingefallen: was ist, wenn ich einen timer mit 500ms den ReceiveText des Sockets abfragen lasse? Dann bin ich unabhängig vom Ereignis und bekomme als strings? oder lieg ich da falsch

Kurz gesagt: ja. ;) Der Timer-Ansatz verlagert die Problematik nur, aufheben kannst du das nicht. Dafür erzeugst du dann massig CPU-Last... :|

user profile iconTristan hat folgendes geschrieben:
Wie kann ich denn das Ereignis abgreifen? Bzw. darauf warten bis die Verbindung wirklich beendet ist.

Der "Trick" ist, den Button nur dann anklickbar zu machen, wenn die Verbindung sicher getrennt oder sicher hergestellt ist. Dazu eine Variable nehmen, die 3 Zustände haben kann: (getrennt, schwebend, verbunden) -> Button nur anklickbar, wenn Var = getrennt | verbunden. Var-Zustand ändern in den Ereignissen: OnConnect, OnDisconnect, OnError (siehe Tut, da läuft das auch so).

user profile iconTristan hat folgendes geschrieben:
Achso und ich hänge gerade wieder an der Bufferliste. Ich bekomms irgendwie nicht gebacken. Die Variante mit deinem Bufferprotokoll bekomme ich auf die Schnelle leider nicht hin.

Das ist schade, wird dann aber wohl so sein. :(

user profile iconTristan hat folgendes geschrieben:
Wie gesagt, das Teil soll morgen halbwegs funktionieren.

Hmm, knapp daneben ist auch vorbei :arrow: halb-funktionierend ist auch kaputt... ;)

user profile iconTristan hat folgendes geschrieben:
Ob ein paar Fehler drinne sind ist egal, aber besser als gar nichts so wie es gerade der Fall ist.

Du brauchst einfach einen wasserdichten Puffer-Ansatz; wie der konkret aussieht, ist egal; ob´s jetzt mit dem Code aus dem Tut läuft oder mit anderem, die funktionalen Elemente müssen drin sein, sonst wird das nix. Da hapert´s aber bei dir noch, fürchte ich. :?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
i := Clients.Items.IndexOfObject(Socket); // Client identifizieren
  if (i > -1then begin // Client ist in der Liste, Index "i" ist gültig
    ReceiveBuffer.Strings[i] := ReceiveBuffer.Strings[i] +Socket.ReceiveText; // Daten lesen

     commands.Text:=ReceiveBuffer.Strings[i];
// hier muss jetzt diese while-Schleife aus dem Tut rein, dazu das Syntax-Array,
// sonst kommst du da nicht weiter


user profile iconTristan hat folgendes geschrieben:
Wenn ich eine Liste mit Befehlen habe (commands) die z.B. wie folgt aussieht:
sperren
nachricht:test
herunterfahren

wie kann ich die abarbeiten bzw. die schon ausgeführten Befehle löschen.

Das kriegst du nur hin, wenn du irgendwo die Anzahl der Argumente greifbar hast -> Syntax[]-Array aus dem Tut.

user profile iconTristan hat folgendes geschrieben:
ich dachte eigenltich mit for i:=commands.count-1 downto 0 do
Begin
if pos('sperren',commands.strings[i])>0 then
Begin nachrichtanzeigen etc. commands.delete(i) end.
End;

Das kannst du mit einer for-Schleife nicht leisten, du mußt das doch von vorne durchgehen. Also: while-Schleife -> das wiederum bringt uns auf die Anzahl Argumente im Kommando -> Syntax[]-Array.

Sorry, aber du kannst nicht Teile des Protokoll-Ansatzes verwenden, auch nicht mit der "hauptsache läuft bischen"-Vorstellung. Das Tut baut da logische Abhängigkeiten auf, die ineinander greifen, das kann man eigentlich nur ganz-oder-garnicht verwenden, sonst funktioniert es genauso wenig, wie dein Code bisher. Worauf ich hinaus will: hör auf, an dem Code rumzudoktoren und zieh dir das Tut in den wesentlichen Teilen rein (hab ich dir schon genannt), dann kannst du das vielleicht noch umsetzen.

Alternative: nimm deine Testumgebung von zuhause mit in die Schule; wenn´s darauf lief, dann läuft´s auch dort. Wenn´s nur darauf ankommt, dass es genau morgen einmal läuft, was soll´s... ? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 06.06.06 23:31 
ich habe nun doch die Timervariante genommen. Damit gehts -zumidnest auf 2 PCs. Wenn dies morgen halbwegs läuft bin ich zufrieden. Hauptsache es funktioniert überhaupt. In den nächsten Tagen und Wochen werd ich dann dein Tut lesen und das Programm völlig neustruktorieren.

Ich danke euch für alles - ich geh langsam aber sicher ins Bett :)
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: So 11.06.06 11:31 
Übrigens das Programm lief am Tag der Präsentation einwandfrei. War alles soweit in Ordnung. Danke nochmal^^