2016-05-14 1 views
2

Hallo Kollegen Programmierer.Turn Stream in Funktion Argument für die Verwendung von Telnet und Ncurses

Ich entwickle ein C/C++ Programm mit Sockets, die über Telnet mit dem Server verbunden werden sollen.

void writeline(int socketfd, string line) 
{ 
    string tosend = line + "\n"; 
    write(socketfd, tosend.c_str(), tosend.length()); 
} 

Gibt es eine Möglichkeit, ein Stream-Objekt wie cout zu schaffen, cerr, verstopfen oder sogar eine Datei (: Ich bin mit diesem funcion

Um Text und ANSI-Codes an den Telnet-Remote-Terminal zu senden von C) das sendet alles, was es zu einer Funktion bekommt?

Zum Beispiel:

clientout << "Hello World"; 

so etwas wie diese nennen würde:

writeline(clientout.str()); //or alike 

Ich habe so etwas wie dies im letzten Jahr, als ich einen Mikroprozessor programmiert (mit AVR) und stdout in eine Funktion umgeleitet das hat alles an die USART-Verbindung gesendet. Ich hatte gehofft, dass ich jetzt so etwas machen könnte. Diese

ist, wie ich es tat, dann:

static int usart_putchar(char c, FILE *stream) 
{ 
    while (!(UCSR0A & (1<<UDRE0))); 
    UDR0 = c; 
    return 0; 
} 

static FILE usart_stream = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE); 

int main() 
{ 
    //(...) 
    stdout = &usart_stream; 
    //(...) 
} 

Ich bin daran interessiert, weil, abgesehen davon, ein einfacher Weg, um in den entfernten Terminal zu drucken, ich auch nur zu denken über die Verwendung von ncurses einen Strom benötigen mit mein Programm. Um es zu benutzen, brauche ich this Funktion, die einen Strom für die Eingabe und einen anderen für die Ausgabe benötigt.

Ich entschuldige mich für die lange Frage. Vielen Dank im Voraus.

Antwort

2

Ja, es ist möglich, dies zu tun, aber es ist ziemlich viel Arbeit.

Im Grunde müssen Sie eine Unterklasse von implementieren, die die virtuellen Methoden std::streambuf implementiert, um direkt vom Socket zu lesen und zu schreiben, oder rufen Sie die Wrapperfunktionen auf, die Sie in Ihrer Frage zeigten. Es ist nicht wirklich viel Arbeit, es ist nur eine Handvoll von virtuellen Methoden, aber Sie müssen ihre obskuren Semantik verstehen, und implementieren sie richtig, 100%. Kein Spielraum für Fehler.

Sobald Sie Ihre std::streambuf Unterklasse haben, können Sie dann instanziiert ein std::istream, std::ostream und/oder std::iostream (die einen Konstruktor, der einen Zeiger auf eine std::streambuf nimmt).

Jetzt haben Sie Ihren Stream, der liest und/oder in den Socket schreibt.

+0

Ich sehe zu implementieren. Gibt es eine Möglichkeit, die "FILE" von einem "Streabuf" zu bekommen? Es ist nur so, dass Ncurses nicht für C++ gemacht wird. Die Definition der Funktion lautet "SCREEN * newterm (char * type, FILE * outfd, FILE * infd)". Vielen Dank. –

+0

Ich habe jede geschützte virtuelle Funktion in streambuf überprüft, konnte aber nicht verstehen, wie Sie das, was Sie sagten, implementen. http://www.cplusplus.com/reference/streambuf/streambuf/ können Sie mir sagen, wie ich es tun kann? –

+0

'FILE' ist C, nicht C++. Sie können den C 'FILE'-Zeiger nicht irgendwie an ein C++' std :: streambuf' anhängen. Was die Unterklassen 'std :: streambuf' betrifft, so wird es leider viel mehr als 500 Zeichen benötigen, um in einen stackoverflow.com-Kommentar zu kommen, um ein Tutorial für die Unterklasse' std :: streambuf' zu schreiben. –

Verwandte Themen