netcat mit c++ bedienen



  • Ich weiß nicht, was netcat macht oder ist. Sendet es eventuell Daten an das manuell geöffnete Fenster?
    Dann könnte es am Destruktor der Klasse myConsole liegen. Der geht nämlich davon aus, dass die im Konstruktor geöffnete Konsole noch aktiv ist, und sendet dieser den exit-Befehl. Kannst das ja an der Stelle mal auskommentieren und dann testen.



  • jasdefer schrieb:

    Ach und noch eine Frage, wie funktioniert jetzt die syntax mit doCommand wenn ich variablen senden möchte?

    Die Frage verstehe ich nicht. Du kannst das senden, was Du im Falle, Du würdest die Konsole manuell bedienen, eintippen würdest. Statt einzutippen, packst Du jetzt Deine Eingabe in einen String, den Du doCommand als Parameter übergibst.



  • Also um das Problem mit dem 'exit' zu lösen, wäre wohl der richtige Weg, dem Programm nc den Befehl sich zu beenden zu senden, damit dann die Konsole den exit - Befehl bekommen kann.



  • also wenn ich jetzt diese verbindung aufgebaut habe möchte ich variablen versenden. also sowas wie
    int u=2;
    mc.doCommand("u"); nur eben, dass er u nicht als text sondern als die vorher definierte variable sendet.

    das mit dem exit gucke ich mir eben nochmal an

    €: mitm exit gehts jetzt. ich hab eine ein cin.get(); hinzugefügt, sodass das hauptfesnter offen bleibt, dann sendet es auch kein exit befehl^^

    €²: hm das ist doch keine gute lösung, die test.txt datei wird erst dann beschrieben wenn sich das hauptfenster schließt o.O



  • jasdefer schrieb:

    also wenn ich jetzt diese verbindung aufgebaut habe möchte ich variablen versenden. also sowas wie
    int u=2;
    mc.doCommand("u");

    Soll also letztendlich in ein
    mc.doCommand("2");
    münden?
    Dann musst Du Deinen int-Wert vorher in einen String konvertieren und dann den String senden.



  • also quasi

    int i = 5;
    std::string s;
    std::stringstream out;
    out << i;
    s = out.str();
    mc.doCommand(s);
    

    okay, das geht super:) vielen dank nochmals^^

    also mit der exit problematik. wenn ich das main programm ausführe, öffnen sich ja zwei fenster. eins mit nc und einmal das "hauptprogramm". solange das hauptprogramm offen ist, wird der text nicht in die .txt datei geschrieben. warum auch immer^^ aber wenn ich sie schließe wird über das nc fenster das wort exit an den verbindungspartner gesendet. das ist erstmal nicht so schlimm, aber auch nicht wirklich schön^^



  • Da ich nc nicht kenne, vermute ich mal:
    wenn Du in die Konsole nc eintippst, startest Du ein Programm (netcat), dass Dir nun einen Eingabecursor zur Verfügung stellt, und Du kannst Eingaben für netcat machen. Alles was Du eintippst, wird an eine Gegenstelle gesendet.
    Ist das soweit korrekt?
    Das würde nämlich bedeuten, dass, wenn der Destruktor von myConsole 'exit' sendet, das als Eingabe in Dein netcat geht und eben an die Gegenstelle gesendet wird. Ich könnte mir aber vorstellen, dass es auch einen Befehl gibt, um netcat wieder zu beenden. Falls das so ist, benutz den via doCommand, damit der anschliessende exit-Befehl auch wirklich an die Konsole geht. Die soll nämlich damit eigentlich ordnungsgemäß geschlossen werden.
    Anderenfalls kannst Du wie gesagt auch das Senden von exit im Destruktor testweise mal auskommentieren.



  • Jops, netcat sollte aber laufen bleiben, weil es ständig auf einkommendene daten wartet. ich hab jetzt den exit senden befehl bei myconsole rausgenommen. jetzt funktioniert alles einwandfrei 😃 vielen dank belli, du warst mir eine sehr sehr große hilfe 🙂

    jetzt sollte erstmal alles klar sein und ich probiere weiter das programm zu schreiben damit es das macht was ich möchte^^ geht btw darum daten von gps trackern zu empfangen und auszuwerten^^



  • jasdefer schrieb:

    Jops, netcat sollte aber laufen bleiben, weil es ständig auf einkommendene daten wartet.

    Aber das netcat, was Du mit dem C++-Programm startest, willst Du doch beenden? Du musst ihm STRG-C senden, soviel hab ich gegoogelt, allerdings hab ich den zugehörigen String nicht parat, vielleicht willst Du selbst mal danach googeln. Viel Spaß noch damit, freut mich, wenn ich Dir helfen konnte.



  • nene, das soll die ganze zeit offen bleiben^^ der lauscht quasi einen bestimmten port ab an den vom gps tracker kontinuierlich daten gesendet werden. deswegen sollte der offen bleiben. aber hast recht mit strg+c könnte man die verbindung unterbrechen.



  • Geht das denn nicht sowieso zu, wenn das C++-Programm beendet wird, das diese Konsole gestartet hat?



  • Jedenfalls weiß ich jetzt, wie man STRG-C senden könnte:
    mc.doCommand(string(1, 0x03));
    oder, einfacher:
    mc.doCommand("\x03");

    Nee, das muss ich wohl noch mal revidieren. Da kommt zwar das ASCII-Zeichen 3 an, aber es hat nicht dieselbe Wirkung wie STRG-C ... mhm.

    So, jetzt aber:
    Wenn das myConsole - Objekt zerstört wird, schließt es implizit das Write-Ende der Pipe zur Konsole; das veranlasst die Konsole, sich zu schließen. Das Senden von 'exit' ist also obsolet, da das die einzige Aktion im Destruktor ist, ist der ganze Destruktor von myConsole überflüssig.



  • [quote="Belli"]Geht das denn nicht sowieso zu, wenn das C++-Programm beendet wird, das diese Konsole gestartet hat?[/quote]

    nein, glücklicherweise nicht^^ das extra fenster bleibt offen und das hauptfenster kann geschlossen werden.

    es ist also genauso wie ichs brauche, nachdem ich den exit senden befehl herausgenommen habe. der exit befehl hat nie zum schließen der konsole geführt, da sie das als string interpretiert und per netcat weitergesendet hat



  • Ja, wie erwähnt, kannst Du eigentlich den ganzen Destruktor rausschmeißen. Aber interessant ist es schon. Ich habe mal zum Testen ein kleines Programm in der gestarteten Konsole gestartet, welches nur auf eine Eingabe auf dem Standard-Eingabestrom wartet. Das jedoch terminiert, wenn ich im Hauptprogramm das myConsole-Objekt zerstöre, und die gestartete Konsole schließt sich dann auch. Das netcat muss irgendeine Besonderheit haben, die verhindert, dass das passiert. Aber Du kannst dem netcat dann keine Befehle mehr geben, das ist doch richtig, oder?



  • hm netcat scheint wirklich da irgendwelche lebenserhaltenen maßnahmen zu ergreifen. also netcat lauscht die ganze zeit, deswegen kann man da auch keine befehle mehr senden, ich guck mal was passiert, wenn man mit strg + c das lauschen abbricht, ob man dann befehle senden kann



  • aha, wenn ich diesen lauschmodus mit strg+c abbreche und das hauptfenster geshclossen ist, schließt sich auch das nc fenster.



  • Ja, das ist schon klar, der Standardeingabestrom ist ja umgelenkt und kann nur noch von dem Hauptprogramm aus gefüttert werden. D.h., sobald das myConsole-Objekt zerstört ist, kannst Du keine Eingaben mehr liefern. Und wenn Du mit STRG-C netcat beendest, stellt die Konsole bei ihrer Rückkehr fest, dass sie keinen funktionierenden Eingabestrom mehr hat, und ich denke, dass sie sich deshalb dann schließt.

    Die Ströme gehen seltsame Wege ... lol.



  • also ein problem ist noch:

    Es werden ja per netcat alle angekommenden daten in die .txt datei geschrieben.

    Die möchte ich nun auswerten, aber solange das hauptfenster offen ist erscheint kein text dadrin. erst wenn man das hauptfenster schließt wird die .txt quasi aktualisiert und der ganze empfangen text wird angezeigt.

    kann man das irgendwie anders machen, dass der text sofort verfügbar ist?



  • Keine Ahnung ...
    im Moment ist mir Dein Szenario nicht klar:
    Du startest das C++-Programm, dieses wiederum startet eine Konsole, in der netstat ausgeführt wird. Außerdem öffnest Du manuell noch eine Konsole, in der Du manuell netstat ausführst?
    Welches der beteiligten Programme schreibt nun eine txt-Datei, und wie macht es das?



  • Also hast es schon recht gut beschrieben.
    ich startet dsa c++ programm, welches mit myconsole eine konsole öffnet wo netcat gestartet wird. netcat lauscht dann an einem port und schreibt alles was an den port gesendet wird in eine text datei. Im endeffekt wird ein GPS tracker positionsdaten an den port senden. ich simuliere jetzt das den tracker in dem ich ein weiteres cmd fenster öffne und mit netcat fake gps daten an den port sende.

    mit dem c++ programm will ich nun die .txt datei in die die gps daten geschrieben werden auslesen. also die koordinaten in variablen packen um sie weiter verarbeiten zu können.

    jetzt ist das problem, dass die gps daten erst in die txt datei kommen, wenn ich das fenster vom c++ programm schließe oder mit return(0); beende. also wenn ich die txt datei öffen, wenn das c++ fenster noch offen ist, bleibt die txt datei leer, erst wenn ich das fenster schließe, wird die datei vllt "refreshed" und die daten sind lesbar.

    das ist ein problem^^ ist es so ungefähr klar?


Anmelden zum Antworten