Winsock. Empfangen dabei Eingabe nicht blockieren
-
ich will aber, dass die eingabe jederzeit möglich ist. das geht in deiner variante doch nich oder täusch ich mich da? ich will ja, dass er im hintergrund ständig überprüft udn ich trotzdem etwas eingeben kann
-
Doch es geht schon...
Es überprüft ständig, ob neue Daten zum Empfangen vorhanden sind. Sind welche vorhanden, werden sie empfangen... (aber nur wenn wirklich welche vorhanden sind...)... int i; char c[150]; ... i = 0; while (...) { if (select-funktion) { empfange_daten(); printf ("er: "); daten_ausgeben(); } else; if (kbhit()) { c[i] = getch(); if (kbhit()) c[i] = getch(); if (c[i] == 13) { c[i] = 0; i=0; printf ("ich: %s",c); strcpy(c,""); } else i++; } }
So ungefähr in der Art könnte ein kleiner Chat aussehen...
Es wird in jedem Durchgang der Schleife überprüft ob Daten zum Empfangen vorhanden sind und ob eine Taste gedrückt wurde.
Sollten Daten da sein, werden sie empfangen und unter "er: <daten>" ausgegeben. Wurde eine Taste gedrückt wird der Buchstabe bzw. in dem Fall auch Pfeil- und andere Tasten in c gespeichert. Wurde Enter (13) gedrückt, wird die Zeichenfolge mit 0 abgeschlossen und ausgegeben unter "ich: <zeichenfolge>". I wird auf 0 zurückgesetzt.Mit dem Erklären hab ichs noch net so.. Hoffe es ist verständlich.
Mfg Dago
-
Die Variante mit dem Thread geht natürlich auch ;). Aber mit ...select() hast du weniger Konflikte und musst auf weniger achten.
-
while(kbhit()) { c=getch(); if(c==13) { rc=send(s,inpBuf,inpBufPos,0); inpBuf[0]='\0'; inpBufPos=0; } else { inpBuf[inpBufPos++]=c; } } inpBuf[inpBufPos]='\0';
ist das so richtig? => http://www.c-worker.ch/winsock/selectchatclient.cpp
-
Probier mal anstatt c=getch(); zweil mal c=getch();... Also so:
c=getch(); if(kbhit()) c=getch();
Warum machst du while(kbhit())? Du kannst doch genauso gut if(kbhit()) machen. Oder täusche ich mich da?
-
ich weiß nich. die methode is ja, ich lese zeichen für zeichen er packt sie hintereinander und sobald ich enter drück wird die schleife verlassen, aber irgendwie läuft das nich so rund mit der eingabe
das problem is halt, dass man nich sieht, was man schreibt
-
Damit man sieht was geschrieben wird kannst du ja anstatt getch(); getche(); benutzen. Du kannst aber auch getch(); benutzen und dann halt z.B. mit
printf("%c",c);
ausgeben welche Taste gedrückt wurde.
-
Dann doch lieber getche()
Die Schleife stimmt übrigens. Es sollen ja mehrere Zeichen eingelesen werden.
-
Hallo.
Ich ahbe leider zu starke Kopfschmerzen und werde es dir jetzt nciht erklären können.
Aber einen Tipp: Vergiss was 'Dabo' geschrieben hat und seh dir die Doku zur funktion select() genauer an.
Er hat MÜLL gepostet und sein Code ist sogar als Pseudocode inakzeptabel...
Mfg. Tolga.
-
die select() funktion prüft, wie gesagt nun ob was empfangen werden kann und mehr. zusätzlich kannst du ihr ein timeout übergeben. wenn man das auf null setzt, wird einmal geprüft und springt dann zurück.
nun kannst du eine schleife bauen
- schau ob daten anliegen
- ja: empfangen + ausgeben
- schau ob taste gedrückt
- ja: einlesen + puffern, bei enter: ausgeben + puffer löschen
-
habs längst mit select() gelöst.
danke