Prog hängt - TCP/IP - Telnet Client
-
Hallo allerseits,
ich bin der Neue. Ich will gleich zur Sache kommen:
Ich beschäftige mich derzeit mit C++/VCL; seit knapp 2 Wochen bin ich nun in Gange. Dabei kommt es mir irgendwie kaum zugute, dass vor einigen Jahren im Studium auch mal ein Semester C++ im Programm war. Die Syntax ist irgendwie abstrakter geworden und Windows-Programmierung hatten wir damals schon garnicht
(warum eigentl. nicht? - war ja erst 2003, wer weiß ob Windows jemals bekannt wird...!?).Auf jeden Fall habe ich jetzt hier ein Kommunikationsmodul für das sog. Fast Ethernet (100Mbit/s), welches mir ermöglicht mit einem Gerät mit RS232-Schnittstelle über's LAN zu kommunizieren. Es gibt zu dem K.Modul ein Testprogramm vom Modulhersteller, mit welchem eine Kommunikation (Übertragung von Steuerzeichen und Antwort vom Gerät) über TCP/IP Port 23 -Telnet- bereits erfolgreich stattfand. Nun möchte ich jedoch ein eigenes Programm zur Nutzung des K.Moduls schreiben und bin schon fleißig dabei.
Übrigens: meine Fragen kennzeichne ich mit vorangestelltem: (Zahl)Zum Programm: Ich habe mich dafür entschieden einen Client zu erstellen. (1) Das sollte doch reichen, um mich per PC mit einem Client im Netzwerk zu verbinden!?? Ich dachte da für's Erste an eine Art Terminalprog. Dafür hab' ich mich umgeschaut und in BDS2006 (siehe Signatur) eine fertige Komponente gefunden - TIdTelnet. Super Sache!
Nur leider hängt sich das Prog bei hergestellter Verbindung immer auf... 
Das eine Verbindung besteht, habe ich bereits mit netstat -a geprüft: Nach dem "Connect" im Prog. gibt es in Windows eine neue aktive Verbindung (Protokoll: TCP, Lokale Adresse: <benutzer>:telnet, Remoteadresse: xxx.xx.x.xxx:telnet, Status: hergestellt). Diese Verb. besteht auch nachdem
das Prog hängt weiter. Erst wenn ich das Prog über "sofort beenden" schließe, verschwindet die Verbindung.
(2) Warum hängt sich das Prog auf (
die wichtigste Frage dieses Beitrages)? Eigentlich besteht doch nun eine Verb. und gut!?!In diesem Zshg. irritiert mich, dass kein OnConnected-Ereignis stattfindet. (3) Wenn ich mich richtig informiert habe, findet doch vor dem Aufbau der Verb. das OnConnect-Ereignis statt und nach erfolgreichem Verbindungsaufbau das OnConnected-Ereignis!? Mein Prog. reagiert jedoch laut eingebauten Statusmeldungen nur auf das OnConnect... (4) oder ist es möglich, dass das Prog nur zeitlich "nicht mehr schafft" auf das OnConnected zu reagieren?

Damit das Ganze noch transparenter wird, hier der Code:
#include <vcl.h> #pragma hdrstop #include "Unit1_UNIGATEClient.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TIndyTelnetClient *IndyTelnetClient; //--------------------------------------------------------------------------- __fastcall TIndyTelnetClient::TIndyTelnetClient(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- AnsiString UniIP; bool ReIPStat= false; bool ConStat= false; bool LocalIPStat= false; void __fastcall TIndyTelnetClient::RemoteIPBtnClick(TObject *Sender) { if (ReIPStat == false) { UniIP = RemoteIP->Text; IdTelnet1->Host= UniIP; RemoteIPBtn->Caption= "Remote-IP ändern"; RemoteIP->Enabled= false; ReIPStat= true; if (LocalIPStat==true) { ConBtn->Enabled= true; } } else if (ReIPStat== true) { RemoteIP->Text= "xxx.xx.x.xxx"; RemoteIPBtn->Caption= "IP verwenden"; RemoteIP->Enabled= true; ReIPStat= false; ConBtn->Enabled= false; } } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::ConBtnClick(TObject *Sender) { if (ConStat== false) { RemoteIPBtn->Enabled= false; ConBtn->Caption= "Trennen"; ConStat= true; IdTelnet1->Connect(3000); } else if (ConStat== true) { RemoteIPBtn->Enabled= true; ConBtn->Caption= "Verbinden"; ConStat= false; IdTelnet1->Disconnect(); } } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::IdTelnet1Connect(TObject *Sender) { ConStatMsgL->Caption= ("verbinde zu " + AnsiString(UniIP)); } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::IdTelnet1Connected(TObject *Sender) { ConStatMsgL->Caption= ("verbunden zu " + AnsiString(UniIP)); MsgL->Visible= true; } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::IdTelnet1Disconnect(TObject *Sender) { ConStatMsgL->Caption= ("trenne " + AnsiString(UniIP)); } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::IdTelnet1Disconnected(TObject *Sender) { ConStatMsgL->Caption= "nicht verbunden"; } //--------------------------------------------------------------------------- void __fastcall TIndyTelnetClient::GetLocalIPBtnClick(TObject *Sender) { LocalIPL->Caption= IdIPWatch1->LocalIP(); IdTelnet1->BoundIP= IdIPWatch1->LocalIP(); LocalIPStat= true; if (ReIPStat== true) { ConBtn->Enabled= true; } } //---------------------------------------------------------------------------So, dann bin ich frohen Mutes Eure Antworten zu lesen!
MfG
Kolumbus - C++NeuEntdecker
-
Guten Morgen,
hab ich zuviel geschrieben oder sind die Fragen zu "einfach" (blöd)? Einen guten Teil konnte ich mir schon selbst beantworten... Eigene Erkenntnisse sind die Schönsten!
Zu (1): Ja, es funktioniert!
Zu (2): An der Stelle hängt das Prog. nicht mehr. Habe in die Connect-Methode das hier eingefügt:
IdTelnet1->SendCh(0x0D);Zu (3): Das OnConnect-Ereigniss findet statt, wenn die Verbindung aufgebaut wurde und ich habe keine Ahnung wann das OnConnected-Ereignis stattfindet. Connected / Disconnected habe ich ersatzlos gestrichen.
Zu (4): Hat sich mit Klärung von Frage (2) und (3) erledigt!
Inzwischen ist natürlich eine neue Frage aufgekommen:
(1) Mein Prog hängt sich immernoch auf. Das kommt an 2 Stellen vor:
a) wenn ich das Programm mit X schliessen will
b) wenn ich die folgende Zeichenkette sende:
IdTelnet1->SendCmd ("01.01.2000 00:00 Datenuebertragung erfolgreich!");Warum nur? SendCh kann ich sooft machen, wie ich will, da ist alles friedlich....

MfG
-
Mahlzeit,
ist das nicht schön, wenn sich einer so gut unterhalten kann???

Ich arbeite jetzt nur noch mit SendCh - Alles Andere macht bei TIdTelnet zum Senden wohl keinen Sinn.
Damit ist Problem (1)b) dann auch gelöst...
Jetzt muss ich nur noch rausfinden was (1)a) Zugrunde liegt...
-
Hallo.
Schau doch einfach mal in die Hilfe, um Dir den Unterschied zwischen OnConnect und OnConnected zu erarbeiten.Ich vermute mal, dass Dein Programm sich nicht mit dem Telnet-Server verbinden kann und solange "hängt" wie das TimeOut noch nicht abgelaufen ist. Da OnConnected nicht aufgerufen wird, spricht das dafür.
-
Rostfrei[] schrieb:
Ich vermute mal, dass Dein Programm sich nicht mit dem Telnet-Server verbinden kann und solange "hängt" wie das TimeOut noch nicht abgelaufen ist. Da OnConnected nicht aufgerufen wird, spricht das dafür.
Das ist nicht ganz das Problem, da ich ohne Server arbeite. Ich arbeite momentan mit einer Client-Client-Verbindung. Diese funktioniert derzeit auch, dh. eine Verbindung kann hergestellt werden. Ich übertrage schon erfolgreich Daten.
Rostfrei[] schrieb:
Schau doch einfach mal in die Hilfe, um Dir den Unterschied zwischen OnConnect und OnConnected zu erarbeiten.
Hier liegt immernoch mein Problem:
OnConnect findet statt, bevor eine socket-Verbindg. geöffnet wird...
OnConnected findet statt, wenn eine Verb. erfolgreich aufgebaut wurde...
Soweit war mein Informationsstand (aus der Hilfe!) schon beim Eröffnen des Thema's. Das ist aber nur die Theorie - in der Praxis findet in meinem Prog OnConnected VOR OnConnect statt... Also doch wieder die Frage:
(1) Wer kennt hier Details bzw. kann mir sagen, wie sich das mit diesen beiden Ereignissen verhält?
MfG
PS: Das Problem 1b ist inzwischen gelöst -> siehe Thema "Prog Fehler beim Schliessen" (oder ähnlich) von mir.