netcat mit c++ bedienen



  • Die Klassen habe ich Dir doch schon geliefert, die kannst Du erst mal so nehmen. Dein 'Aufwand' besteht dann nur noch darin, im og Testprogramm die richtigen Befehle an doCommand() zu übergeben.
    zB:
    doCommand("echo foobar | nc -v -L -p 8888");

    etc.

    Die Klassen erledigen für Dich das von PI erwähnte umlenken des Standard-Eingabe-Streams.



  • okay, vielen dank! ich habe verstanden, dass ich quasi nurnoch den letzten code anpassen müsste. ich dachte nur dass es ein problem ist was mit einem befehl oder so ähnlich gelöst werden könnte.

    Ich habe keine erfahrung damit selbst klassen anzulegen. müsste ich für jeden code eine datei erstellen und nacheinander ausführen (wenn ja ist der dateiname entscheidend?) oder alles in eins?



  • Du könntest das ganze auch mit WIN Sock machen und ganz auf Netcar verzichten.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspx (Englisch)

    Und da ich ebenfalls der Held von Google bin habe ich noch mehr Links für dich. 😃

    http://www.c-worker.ch/tuts.php (Deutsch, is aber C und kein C++ aber ist leich in C++ umzuändern. )

    http://www.madwizard.org/programming/tutorials/netcpp/ (Englisch )( Auf der Seite nach ganz unten Scrollen und rechts steht dann "Networking introduction" und ab da gehts weiter. )



  • Ach mist, zu spät geantwortet aber ich glaube du solltest dir diesen Link mal anschauen:

    http://www.cpp-tutor.de/cpp/le09/klassen.html



  • jasdefer schrieb:

    Ich habe keine erfahrung damit selbst klassen anzulegen. müsste ich für jeden code eine datei erstellen und nacheinander ausführen (wenn ja ist der dateiname entscheidend?) oder alles in eins?

    Üb mal. Du legst die Dateien an, pipe.h, pipe.cpp, myConsole.h, myConsole.cpp und test.cpp wie oben.
    Dann navigierst Du mit Deiner Visual Studio - Eingabeaufforderung in das Verzeichnis und gibst ein:
    cl /EHsc test.cpp pipe.cpp myconsole.cpp

    dann sollte das fertige Programm test.exe entstehen.
    Wenn Du damit Probleme haben solltest, solltest Du evtl. erst noch ein paar Grundlagen lernen, bevor Du Dich mit weiterführenden Problemen beschäftigst.



  • Belli schrieb:

    ja, und? Ist im Eingangsposting doch auch schon Windows-Code.

    Naja, bis auf das <windows.h> nicht und das habe ich übersehen. 😉



  • @Belli ist dies auch mit anderen compilern möglich? ich benutze dev-c++ und nicht visual studio.

    @Held vom MSDN !: ist es besser es nicht mit netcat zu machen? soweit funktioniert mit netcat eigentlich alles recht gut



  • @Belli. yeah 😃 es hat geklappt. habs hinbekommen. VIELEN DANK EUCH ALLEN



  • jasdefer schrieb:

    @Belli ist dies auch mit anderen compilern möglich? ich benutze dev-c++ und nicht visual studio.

    Klar, funktioniert ein wenig anders in der Aufrufsyntax, aber das Prinzip ist identisch.
    Wie ich sehe, hast Dus ja auch schon geschafft 🙂
    @Ethon:
    Gerade wegen des windows.h habe ich diesen Entwurf gepostet, ohne explizit darauf hinzuweisen, dass es eine Windows-Lösung ist. Ich hatte einen guten Teil des Codes hier rumfliegen, weil ich vor ein paar Tagen einen Vorschlag für eine Klasse im Konsolenforum gepostet hatte, wo es darum ging, die Programme zu starten und die Ausgabe abzufangen.



  • ja man musste ein projekt erstellen und dort dann klassen hinzufügen und dein code da reinkopieren.

    mein mainprogramm sieht jetzt so aus

    #include <cstdlib>
    #include <iostream>
    #include "pipe.h"
    #include "myconsole.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        myConsole mc;
    
        mc.doCommand("d:");
        mc.doCommand("cd netcat");
        mc.doCommand("nc -L -v -p 9999>E:\\Desktop\\testing\\PROJEKT\\data.txt");  
    }
    

    er soll auf eine verbindung warten und die eingehenden daten in eine datei speichern. wenn ich jetzt mit einem zweitem fenster per netcat eine verbindung dazu aufbaue klappt auch alles wunderbar. nur wird in dem jetzt manuell von mir geöffnetem fenster das wort exit ausgegeben. warum das?



  • Ach und noch eine Frage, wie funktioniert jetzt die syntax mit doCommand wenn ich variablen senden möchte?
    es scheint ja so zusein, dass dahinter nur n string erwartet wird (laut der myconsole.h datei) oder kann ich da jetzt einfach n zweiten befehl hinzufügen wo dann ein zB int erwartet wird. wenn ja wie(syntax mäßig)?^^



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


Anmelden zum Antworten