Tastatur ueber device lesen
-
stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.
-
DrGreenthumb schrieb:
stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.
Schön und gut, aber select meldet sich nur, wenn der User seine Eingabe mit einem CR abgeschlossen hat.
Den Filedescriptor zu einem FILE struct bekommst du von fileno(FILE *file), in diesem Fall also:
#include <stdio.h>
...
int fd_stdin=fileno(stdin);
-
Saraneus schrieb:
DrGreenthumb schrieb:
stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.
Schön und gut, aber select meldet sich nur, wenn der User seine Eingabe mit einem CR abgeschlossen hat.
davon hast du ja erst nichts gesagt. Das lässt sich mit tcsetattr abstellen (ICANON entfernen).
-
Da gebe ich dir Recht
Ich bin übrigens nicht der Fragesteller.
Lässt sich tcsetattr auch mit Daemons anwenden, die die Tastatureingabe egal welchen ttys mitlesen sollen? Nach einer solchen Möglichkeit suche ich schon lange.
-
also ich hab auch so ein multi-user-chat programm gebastelt um in netzwerk-programmierung nen bisschen rein zu kommen und sitz nu auch bei dem problem mit der tastatur.
ich habe schon die 0 ins FD_SET aufgenommen und er ruft auch die zuständige prozedur zum verarbeiten der tastatureingabe auf. jedoch hab ich probleme damit, zu gucken, was eingegeben wurde. wie bei anderen connections über recv einzulesen, um dann zu gucken was in der variablen drinsteht, scheint es nicht zu funktionieren.
-
Deine Fehlerbeschreibung ist zu vage. Musst schon mehr eingrenzen und den Effekt genauer beschreiben. Codezeilen wären natürlich zusätzlich interessant.
-
also erstma nen bisschen code:
void KeyboardInput(int i) //Prozedur, die aufgerufen wird, wenn über select { //"gemeldet" wurde, dass über die Tasta was //reinkommt. i ist hierbei 0 für den Standartinput. int get = recv(i, buffer, 1000, 0); buffer[get] = '\0'; //buffer is deklariert als char* buffer; und mit //buffer = new char[1000]; initialisiert. cout << "buffer=" << buffer << " (" << get << ")" << endl; //zu Testzweckn Ende = true; //ich hab in main() ne while-schleife, die hierbei abbricht //sollte später natürlich nur gesetzt werden, wenn man //"exit" eingegeben hat. if (buffer == "exit") //then-teil wird nicht aufgerufen { Ende = true; }; };
also wie oben schon gesagt, wird der then-teil nich aufgerufen. recv liefert immer -1.
hoffe das war ausführlich genug
bei unklarheiten bitte fragen.
-
Warum erstellst du nicht einen neuen Thread wo du nur die Netzwerksachen laufen lässt? Im Hauptthread kann doch die Tastatatur bearbeitet werden.
-
von threads hab ich noch nie was gehört.. aber ich werd mal danach googlen
danke
-
also ich hab mich da jetz ma schlau gemacht und funzt auch soweit ganz gut. jedoch muss ich eine variable haben, deren aktuellen zustand beide threads abrufen können und bei einer änderung darauf reagieren.
nun hab ichs schon mit einer globalen variable und nem pointer versucht, der an beide threads übergeben wird.
beides scheint nicht so recht funktionieren zu wollen.
wie könnte man dieses problem lösen?