Client verbieten sich zu verbinden
-
Hallo, ich habe eine Client und eine Server anwendung geschrieben.Habde dazu einfach jeweils für das entsprechende Programm eine Klasse von CAsyncSocket abgeleitet und dann die entsrpechenden funktionen überschrieben. Nun will ich das sich nur z.B. 3 Clients mit dem Server verbinden können. Allerdings läßt er jedesmal ein Connect zu. Wie kann ich das unterbinden habe schon vesucht Accept weg zu lassen aber das stört ihn garnet. Sobald der Server startet läßt er so viele clients zu bin mein Array voll ist. Warum???
-
zähl einfach hinter jedem 'accept' eine variable hoch. wenn die grösser als 3 wird machste einfach 'closesocket' mit dem rückgabewert von accept (also mit dem kommunikationssocket). jede beendete verbindung zählt die variable wieder eins runter
-
gar nicht erst akzeptieren
-
genau garnicht erst akzeptieren dachte ich auch also habe ich eine variable hochgezählt und ab 3 dann einfach kein Accept mehr aber der client bekommt trotzdem ein verbunden wieso? Er liefert keinen fehler beim Connect.
-
xyz44 schrieb:
genau garnicht erst akzeptieren dachte ich auch also habe ich eine variable hochgezählt und ab 3 dann einfach kein Accept mehr aber der client bekommt trotzdem ein verbunden wieso? Er liefert keinen fehler beim Connect.
weil die socket-lib die connections asynchron annimmt. ein 'accept' holt sich nur schon den schon verbundenen socket. wenn du's so machen willst, dann fummel mal mit dem zweiten parameter (backlog) von listen rum.
-
habe ich probiert aber das funktioniert auch nicht habe ihn auf 1 gesetzt. Ich verstehe das nicht wieso kann ich dem client nicht sagen das der Server grade voll ist
-
xyz44 schrieb:
habe ich probiert aber das funktioniert auch nicht habe ihn auf 1 gesetzt. Ich verstehe das nicht wieso kann ich dem client nicht sagen das der Server grade voll ist
schon mal das mit dem closesocket ausprobiert?
etwa so:int cnt = 0; void handle_connection (socket s) { while (connected) { // hier client bedienen } cnt--; } while (1) { socket s = accept(...); if (cnt >= 3) closesocket (s); else { cnt++; handle_connection (s); } }
closesocket schickt ein RST d.h. würgt die verbindung gnadenlos ab
-
ich benutze CAsyncSocket. Das klappt mit Close() nicht
-
wenn dein server auf dem port lauscht dann wirst du immer eine verbindung bekommen.
sollte sich ein client verbinden musst du das lauschen auf den port beenden. dann bekommt auch kein anderer ein verbindung.
ein typisches bespiel war der c/s im Buch Vc++ 6 in 21 Tagen. Da konnte auch nur einer verbinden weil die clients nicht verwaltet wurden. hat jedoch ein 2ter client versucht zu verbinden hat der server einfach den ersten rausgeworfen.