Chat-Tool, gleichzeitiges Senden und Empfangen des Clients
-
Hallo,
ich möchte ein einfaches Chat-Tool schreiben. Das verbinden mit dem Server funktioniert einwandfrei. Aber nun möchte ich am Client einerseits auf Eingabe warten (fgets), aber gleichzeitig auch etwas empfangen können.
Wie funktioniert dies? Und wie läuft das mit der Ausgabe? Hat jemand dafür ein Beispiel?Dankeschön!
-
Ich glaube was Du brauchst ist Threading. Und zwar ein Thread der auf eingehende Nachrichten wartet während der andere sie verschickt.
Hier mal ein Link zur MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcekernl/html/_wcesdk_Win32_CreateThread.asp
-
MSDN bringt mir nichts, soll unter Linux laufen.
An Threads habe ich auch schon gedacht, aber so lange wie ich auf eine Eingabe warte, werden empfangene Daten ja nicht angezeigt.
-
Mit fgets? O_o .. Ka.
select() + recv() + send() sind deine Freunde.
-
@feigling: Das ist leicht gesagt, aber wie soll das mit select gehen? Sobald ich was einlese stoppt ja alles andere.
-
Du ließt aber doch nur was ein, wenn es auch was zum Einlesen gibt. Dafür ist doch eben select da. Nach dem Einlesen gehst du wieder in die "select Schleife".
void socket_loop(void) { struct timeval tval; fd_set read_flag; tval.tv_sec = 0; tval.tv_usec = 500000; FD_ZERO(&read_flag); FD_SET(socket, &read_flag); if(select(socket + 1, &read_flag, NULL, (fd_set *) 0, &tval) < 0) return; if(FD_ISSET(socket, &read_flag)) { FD_CLR(socket, &read_flag); socket_receive(); } }
In der socket_receive rufst du recv() auf und senden via send() kannst du im Grunde immer.
socket_loop packst du einfach in eine while() Schleife.
-
Also hier ist der select ganz gut beschrieben: http://www.c-worker.ch/tuts/select.html
Für mich hört es sich aber so an, als ob select nur für die Handhabung mehrerer gleichzeitig bestehender Sock-Verbindungen da ist.
-
select() ist für alle Arten von Filedescriptoren gedacht. Wenn's unter Windows nur mit Sockets läuft, ist das Windows' Problem
-
Erstmal danke für alle bisherigen Antworten. Ich komme aber leider immer noch nicht weiter, darum bitte ich noch mal um weitere Hilfe.
Erstmal kommt bei mir nichts an, wenn ich den Code von feigling benutze. Nun gut, vielleicht benutze ich ihn noch falsch, aber selbst wenn ich damit prüfen kann ob etwas ankommt, kappiere ich nicht wie das mit der Eingabe laufen soll.
Bei einer normalen Eingabe auf der Konsole, wird ja das Programm blockiert, somit würde eigentlich nie etwas ankommen können, außer man hat gerade mal was abgeschickt. Aber selbst wenn ich das in 2 Threads packe wird ja alles blockiert oder nicht? In C++ habe ich wohl eine Möglichkeit gefunden, aber in C nicht.Und dann habe ich noch die Schwierigkeit, dass der Empfange Text möglichst über der aktuelle Eingabezeile erscheint und vor allem nicht die aktuelle Zeile (wo evtl. schon Text drin steht) überschrieben oder gelöscht wird.
Ihr seht, Fragen über Fragen. Im Internet habe ich aber auch überhaupt kein Beispiel oder Ansatz für so einen Chat-Client finden können.
Wäre nett, wenn ihr mir nochmal etwas Hilfestellung geben könntet.
-