Programmierung eines Chatservers der mehrere Clienten verwalten kann
-
Momentan schreibe ich ein chatprogramm. Mein Client ist dabei in Win32- programmiert, der server ist aus dem grund das er eh nicht sichtbar ist eine simple Konsolenanwendung. Mein Problem ist nu, dass die Socketfunktionen ja blockierende Funktionen sind und ich wenn ich weitere Clienten verwalten will dies umstellen muss. Ich weiss dass ich das irgendwie mit select () machen muss allerdings nicht genau. Mein Problem ist das ich ja 2 Sockets habe, einen um auf anfragen zu reagieren und einen für den Datentransfer. Wie mache ich das nun? das der mir mehr clienten akzeptiert? bitte antwortet!!!
-
Du machst das am besten mit WSAAsyncSelect (siehe MSDN) und startest einfach für jeden Client einen neuen Thread. So hab ich das jedenfalls in meinem Chat, und es funktioniert einwandfrei!
PS: Überleg dir das noch mal mit "nur-console". Also ich finde es prakisch wenn ich an meinem Client schön per Mausklick und so User kicken kann die irgenteinen Müll machen oder wenn ich ihnen eine Nachricht schicken kann, etc.
cu para
-
Ja WSAsyncSelect () ist ja die windowsspezifische form von select (). Ich weiss immer noch nicht wie ich das mit nem Thread machen soll. Denn das eine Socket ist doch mit einem Client verbunden wie kann es sich dann mit mehreren verbinden? magst du mir nichtmal deinen codeausschnitt zur verfügung stellen der mir das verdeutlicht? Mir ist schon klar dass man jeedn Clienten am besten in einem Thread bearbeitet, ich habe auch keine Probleme mit Threads usw. aber ich weiss einfach nicht wie sich das mit dem Socket vereinbaren lässt! Wäre für deine Hilfe sehr verbunden, andernfalls falls du icq hast schreib mich doch mal unter 157413201 an. wäre echt klasse. WSAsncSelect geht aber nur auf windows oder? der vorteil der konsole ist natürlich, dass man mit c++ auch plattformunabhängig bleiben kann und die meisten internetrechner sind ja linuxrechner von daher mit der konsole.... habe eh noch keinen server wo ich meinen server ausführen kann *lol*
Aber danke schonmal für deine nachricht das ist genau das was ich vor habe.
-
dann schau dir mal select an
Aber der Server macht doch sowieso nix anderes als accept() oder??
-
Mein Lösungsweg, nicht grad einfach, dafuer vielleicht sauberer und besser ausbaubar, ausserdem machen es die meisten ptp protokolle so ....
Standard - Port festlegen, auf denen die Kontaktaufnahme erfolgt.
- Clinet nimmt Kontakt über diesen Port auf, das kannst mit blockierender verbindung machen ....
- Handshaking, Server und client reden mal ein bisserl miteinander, tauschen Infos aus, vielleicht Versionsnummern etc ... Berechtigung prüfen, usw ...
- bei misserfolg (irgendwas passt deinem server ned) die verbindung wieder kappen und in Wartemodus gehen .... )
- bei Erfolg, eine Portnummer (in einem gewissen bereich) uebermitteln, einen neuen Thread starten, der auf verbindung auf genau diesen Port wartet (und eventuell eine beim Handschaking ID validiert ) und dann ueber diesen Port mit dem client kommuniziert ... der Hauptthread geht wieder auf warteposition auf dem Standard-Port .... und wartet auf den naechsten CLient. Der erzeugte thread muss sich selbst beenden koennen, wenn nach gewisser Zeit keine Anfrage auf dem Port kommt ... oder die ID ned Stimmt ... etc ...Wenn du es so machst, kannst auch blockierende verbindungen machen, was IMHO einfacher ist, als assynchron zu arbeiten ....
Ciao ...
-
Danke für eure tipps... ich habe jetzt einen anderen weg gefunden und zwar mache ich das gar nicht mit select sondern speicher das in einer strukur und will nun für jedes socket einen Thread erstellen. Dabei kommt allerdings folgende Fehlermeldung:
D:\Programmierung\MyProjects\myserver\Connection.cpp(227) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target typeIch weiss nicht woran es liegt vielleicht könnt ihr mir helfen.
generell kann es 3 gründe für den Fehler geben:
1. Der Fehler rührt daher dass ich einen Array von Threads anlegen will
2. Der Fehler rührt daher dass ich die Threads in einer Klasse erstellen will
3. beides (1 und 2)An anderer Stelle im Forum habe ich erfahren dass ich mit static arbeiten muss. Ich verstehe dies nicht bitte darum auch dort um Statements. Static macht ja nix anderes als eine in einem globe scape defininierte Variable nur in ihren globe scape sichtbar zu machen darüberhinaus die Variable beim verlassen des globe spaces nicht aufzulösen und initialisierungen am Anfang einer Statischen Funktion zu überspringen.
Was hat das mit meinem Problem zu tun? ich bin total ratlos...