Einlesen von der Konsole
-
wie gesagt, ein telnet client sendet ungepuffert. das macht der mit API calls. (edit: oder auch nicht, alles ist relativ...)
dein (tcp?) server bekommt vom telnet client im normalfall einzelne zeichen sofort zugeschickt.
edit: lol, hier lernt man nie aus:
http://www-ccs.ucsd.edu/c/stdio.html#setvbufviele terminals sind aber weiterhin zeilengepuffert. das kannst du dann wirklich nur mit API calls beeinflussen.
-
Das Problem liegt doch nicht am Socket. Es liegt einfach daran das ich die Zeichen ( die eingegeben wurden und die ich erst bekomme nach dem ich enter drücke ) zu spät bekomme. Ich will die Zeichen auf dem Server ( bzw. auf der anderen Seite ) auch schon sehen, wenn ich sie eingebe, aber noch nicht mit Enter oder Return bestätigt habe.
-
ich sag es doch schon die ganze zeit:
die pufferung kannst du nicht mit ansi c beeinflussen, wenn sie durch das terminal verursacht wird.
benutze API calls oder irgendwelche libraries und finde dich damit ab.
-
Was denn für API calls? Also ich habe gerade versucht die funktion setvbuf zu benutzen. Angeblich kann man damit ja ungepuffert lesen, wenn man IONBF mitgibt. Allerdings kennt er dieses define nicht einmal.
Ist die Seite noch aktuell?
-
Das Makro heisst laut meiner Manpage _IONBF und setvbuf gilt wohl nur für _Output_-_Streams_.
-
es gilt scheinbar fuer alle streams, aber wenn das terminal gepuffert ist, kann ansi c nichts machen.
@OP: such dir eine plattform raus und ich verschieb dich in ein anderes unterforum. mit ansi c gehts leider nicht.
-
tja das will ich aber nicht. Es ist Anforderung, dass es unter windows genauso läuft wie unter linux....
-
du kannst versuchen, ob du conio.h auf beiden plattformen benutzen kannst.
die hat naemlich getch(), welches eigentlich ungepuffert lesen sollte.
curses.h hat auch ein getch(), also koenntest du mit #ifdefs bedingt jeweils den einen oder anderen header inkludieren.ist aber kein ansi c. ich kann dir da echt nicht weiterhelfen.
wieso willst du so zwanghaft solche speziellen features crossplattformkompilierbar haben?
schreib doch fuer jede plattform einen extra client und server.
die kernfunktionen kannst du ja auslagern, weil sie auf allen plattformen gleich sind. lediglich die konsolenein/ausgabe musst du doppelt schreiben.
-
conio.h unter Linux wirds nicht finden...
Tja, WENN die Anforderung ist, dass es unter beiden Plattformen gehen soll UND es keine ANSI-gerechte Methode gibt das Buffering zu kontrollieren, DANN:
a) Arschgekniffen, Aufgabe unlösbar (das wäre der Programmierer, der gefeuert wird)
b) Mittels bedingter Kompilierung eine Funktion schaffen, die auf jeder Plattform die dort benötigte Aufgabe erfüllt.Für Linux könnte ich Dir bei Interesse sogar ein Schnippsel zukommen lassen (ohne ncurses sogar).
-
Bitte löschen (BTW: Wenn ihr Spenden braucht damit das Forum nicht täglich mindestens einmal lahm liegt, ich würde mich bereiterklären).
-
warum löschen?
Ja an einem Codeschnipsel für linux wäre ich interessiert. Bedingte Kompilierung ist auch OK.
-
Hier die Linux-Variante (es empfiehlt sich beim Beenden die zweite Funktion aufzurufen, da sonst das normale Terminal anschliessend auch unbuffered ist):
#include <termios.h> #include <unistd.h> termios oldattr; void make_term_unbuffered(void) { int c; struct termios attr; tcgetattr(STDIN_FILENO, &oldattr); memcpy(&attr, &oldattr, sizeof(struct termios)); attr.c_lflag &= ~ICANON; tcsetattr(STDIN_FILENO, TCSANOW, &attr); } void make_term_normal(void) { tcsetattr(STDIN_FILENO, TCSANOW, &oldattr); }
EDIT: Löschen weil ich dreimal "Absenden" klicken musste ohne nen Timeout vom Board zu erhalten, der Beitrag aber später dreimal vorhanden war...
-
super dein code funktioniert....
hast du vielleicht noch eine idee wie man das echo rauskriegt?
-
hab schon, ist schon gut! aber ihr könnt mir mal sagen ob der gcc ein makro hat was man verwenden kann, um das OS zu bestimmen oder ob man sein eigenes anlegen muss.
Gruß
-
http://gcc.gnu.org/onlinedocs/gcc-4.0.2/cpp/Predefined-Macros.html
http://gcc.gnu.org/onlinedocs/gcc-4.0.2/cpp/System_002dspecific-Predefined-Macros.html
-
danke schön. unter linux funktioniert das jetzt perfekt. Unter windows muss ich erst gucken ob der aufruf von getch reicht. meld mich dann nochmal
Aber danke schonmal