select()
-
Hi, da arbeite im Mom mit Netzwerkprogrammierung und komme um select() wohl nicht rum... die grund idee von select() klappt auch mann kann mehrere Sockets überprüfen usw... aber dennoch friert select das ganze Programm ein bis etwas ankommt... So.. Aber wie kann man es nun ein Chat Programm in der Konsole realisieren ? Es gibt ja den Tastatur Puffer...
char buffer[256]; if(kbhit()) { int ascii = getchar(); sprintf(buffer, "%g" , ascii); }Allerdings müsste diese Abfrage andauernd passieren... Also wie kann man parallel zum select aufruf z.B. die grad gezeigte Abfrage starten ? oder ist in der Konsole überhaupt keine flexibles Chat Programm möglich ?
Also ein Programm das nich nach dem Schema :
Senden:
Empfangen:
Senden:
Empfangen:
arbeitet, sondern z.b. nach dem Schema:
Senden:
Senden:
Empfangen:
Senden:
Empfangen:
Empfangen:
usw..Also welche Anregungen und Tipps habt ihr für mich ?
mfg FoX
-
du müsstest auf jeden fall mit threads arbeiten, einer zum senden einer für die ausgabe, oder du rufst in eine while schleife auf:
string sendbuff; while (sendbuff != string("/q")) { // austrittsbedingung if (select()) { ausgabe(); // liesst aus dem socket und schreibt message } char zeichen = getch(); // holt zeichen aus tastaturpuffer, liefert 0 wenn keins vorhanden if (zeichen != 0) if (zeichen != ENTER) { // auf enter-taste prüfen sendbuff.append(zeichen); print_zeichen_in_ausgabe(); // eine statische zeile die dein eingabefeld darstellt } else { // wenn enter-taste gedrückt dann senden senden(); } } } }
-
hmm ,ansich gute idee aber wie kann ich ein char zeichen in einem string speichern ? mit
char buffer; string input.append(buffer); funkioniert es nicht!mfg
-
sorry mein fehler versuch es mal mit
char zeichenpuffer[2] = {0,0}; // wegen der stringterminierung durch eine null zeichenpuffer[0] = getch(); // schreibt nur ein zeichen, die terminierende null bleib unverändert. string t; t.append(zeichenpuffer);beim senden musst du natürlich den string löschen
t.clear() oder so ähnlich
-
Versuch' mal push_back().
-
oder so, ignorier einfach den unsinn den ich da verzapft hab ^^
-
danke für die schnelle antwort

mfg
-
Hi, also anscheinend schaff ich das doch nich

eure ideen waren zwar gut aber... die send funktion benötigt ein char array...
und ich hab keine ahnung wie ich den inhalt eines strings in ein chararray rein kloppen kann
Also, wie geht das ? Oder erklärt mir was push_back sein soll...
bei google kommt man da nich weit
mfg
-
push_back() hängt einen Buchstaben an das Ende des Strings an. (also das, was Ceos oben mit append() versucht hat)
Und um den Inhalt des Strings als char-Array zu verwenden, kannst du die Methode c_str() verwenden.
-
hmm... zwar weiß ich nun was pushback ist aber wie es benuzt weiß ich nun immer noch nich ... und sagt jetzt nich : "goooogle" mal .... denn da findet man zu dem Thema für Anfänger NIX geeignetes ! Also vlt ein kleiner Beispiel code oder ähnliches ?

mfg
-
char buffer; string input; input.push_back(buffer);
-
Ich würde den String sowieso eher in einem std::vector<char> sammeln, und dann erst am Ende mittels
std::vector<char> buffer; // ... std::string str(buffer.begin(), buffer.end());in einen std::string verwandeln.
-
Warum würdest du das so machen?
-
jetzt schlag mich bitte nicht gleich, aber basiert string nicht auf nem vector ?
-
@Braunstein: weil std::vector<> garantiert dass push_back im Schnitt mit O(1) läuft, std::string soweit ich weiss aber nicht.
@Ceos: std::string KANN auf std::vector aufsetzen wenn es möchte (z.B. private von std::vector ableiten oder nen std::vector als Member haben), MUSS aber nicht. Und ist wohl in den meisten STL Implementierungen auch nicht so.
-
hustbaer schrieb:
@Braunstein: weil std::vector<> garantiert dass push_back im Schnitt mit O(1) läuft, std::string soweit ich weiss aber nicht.
ich glaub, dass hier keine optimierung erforderlich ist, immerhin ist dies keine zeitkritische komponente

Foxx90 schrieb:
hmm... zwar weiß ich nun was pushback ist aber wie es benuzt weiß ich nun immer noch nich ... und sagt jetzt nich : "goooogle" mal .... denn da findet man zu dem Thema für Anfänger NIX geeignetes ! Also vlt ein kleiner Beispiel code oder ähnliches ?

und du glaubst, dass du für threads und sockets genug erfahrung hast?
-
JA

@ otze
Außerdem frag ich im Forum wenn ich was nicht weiß, dafür sind sie da
Du hast bestimmt nicht anders angefangen ... Oder studierst du erst bevor du dich traust einen Thread aufzumachen ?
mfg
-
Threads sind der Horror. Wobei das schlimmste daran ist dass fast jeder Anfänger glaubt dass ja eh alles einfach und kein Problem ist -- weil viele Dinge eben so einfach aussehen. Und auch 99.9% der Zeit funktionieren, auch wenn man was falsch macht.
Threads sind der Horror.
-
vor allem wenn threads auf gemeinsame daten zugreifen oder untereinander in irgendeiner form abhänig sind Q_Q (critical sections in kombination mit schlecht konstruierten dtoren sind echt pöhse)