netcat mit c++ bedienen



  • 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?



  • Okay, das Problem habe ich glaube ich verstanden, warum das so ist, weiß ich nicht.
    Es könnte aber sein, dass das Schreiben in die Datei nur deshalb beginnt, weil das zugehörige myConsole - Objekt zerstört wird. Wenn es Dich nicht stört, dass Du danach keine Kontrolle mehr über das gestartete netcat hast, könntest Du das ja mal versuchen, indem Du das myConsole - Objekt in einem Scope erzeugst, Deine Befehle an netcat absetzt, und dann den Scope verlässt und beobachtest, ob jetzt die Datei gefüllt wird.



  • Ich habe gerade einen kleinen Test gemacht:
    Folgendes Testprogramm

    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	while(++i < 1000000)
    	{
    		cout << "chrrrrrr ...\n";
    		Sleep(300);
    	}
    }
    

    via

    mc.doCommand("test > test.txt");
    

    gestartet und dann einfach mal abgewartet. Es ist nicht so, dass in die test.txt nicht geschrieben wird, es dauert einfach eine Weile, bis das Testprogramm seine Buffer mal flusht. Auch das Startprogramm lief noch, das myConsole - Objekt existierte noch, und nach einer ganzen Weile wurde die test.txt dann doch mal gefüllt. Vermutlich muss erst eine ganze Menge Daten zum Schreiben angefallen sein. Keine Ahnung, ob man das Buffer flushen von außen beeinflussen kann ...



  • hm wielange hat es denn bei dir gedauert? ich hab jetzt schonmal n paar mins gewartet und es ist trotzdem nichts in der txt datei erschienen. erst als ich das haupptfenster wieder geshclossen habe.

    wie würde ich denn das myconsole objekt in einem scope erzeugen?



  • jasdefer schrieb:

    hm wielange hat es denn bei dir gedauert? ich hab jetzt schonmal n paar mins gewartet und es ist trotzdem nichts in der txt datei erschienen. erst als ich das haupptfenster wieder geshclossen habe.

    wie würde ich denn das myconsole objekt in einem scope erzeugen?

    Mit meinem og Testprogramm wurde das erste Mal in die txt-Datei geschrieben, als etwa 350 Zeilen erzeugt waren.

    Eine Variable in einem Scope erzeugen? Na, entweder in einer Funktion, oder so:

    ...
    {
    myConsole mc;
    ...
    }

    Wenn die Funktion beendet wird, oder im obigen Fall die schließende Klammer erreicht wird, wird mc zerstört und der Destruktor aufgerufen.
    Hat bei meinen Experimenten aber nix gebracht ...



  • ich hab auch noch einmal das programm ausgeführt und sehr viel text übertragen lassen. mehr als 350 zeilen. trotzdem wurde die txt datei nicht aktualisiert.

    ach das ist mit scope gemeint. das habe ich auch noch einmal probiert, hat aber leider auch nicht funktioniert.

    Fällt dir noch eine möglichkeit ein, wie man das Problem lösen könnte? Das würde mir sehr doll helfen



  • ach noch etwas interessantes. Wenn ich das netcat lauschen mit strg+c beende und das hauptfenster schließe wird die textdatei garnichtmehr aktualisiert. also wenn ich mit strg+c die verbindung beende, gehen die informationen die in die txt datei geschrieben werden sollen verloren 😕


Anmelden zum Antworten