FD_ISSET... (eher ne semantische frage)
-
jo huhu,...
das problem ist wie folgt, ein socket ist im FD 'gesetzt' aber der client sendet nÜx, dann würde es ja blockieren oder??
also:
while(1){ FD_ZERO($fdSet); FD_SET(acceptSocket,&fdSet);
is ja soweit klar, hier nehme ich alte sockets wieder ins set
for(int i=0; i<client.size(); ++i) { if(i!=client.size()){ //sicher ist sicher { if(client[i].GetSock()!=INVALID_SOCKET) { FD_SET(client[i].GetSock(),&fd_Set); } } }
sooo jetzt kommt select, soweit ich weiß setzt ja select in fdSet
n bit ob gerade da was angekommen ist, (in den jeweiligen deskriptoren ?!),ierror=select(0,&fdSet,NULL,NULL,&timeout);
d.h. wenn ich jetzt mittels FD_ISSET(client[i].GetSock(),$fdSet)
schmeisst der jetzt nachm select ein nur true bei den verbindungen raus wo etwas passiert ist gell??
alsoFD_ISSET(acceptSocket,&fdSet)==true
wenn eine neue verbindung eingeht... bzw.
FD_ISSET(client[i].GetSock(),&fdSet)==true
falls auf schon (durch oben gesetzte verbindung), eine bestehende verbindung etwas rÄinkommt?!
d.h. recv kann nach einer FD_ISSET abfrage gar net blockieren, sondern bekommt min. eine '0' zurück,...richtÜg?
mfg
-
Äh... Hä?
Ja, im Grunde stimmt das soweit. Und wenn recv nach dem select auf einem gesetzten (verbundenen) Socket 0 zurückgibt, wurde die Verbindung vom Gegenüber geschlossen. Blockieren würden weder recv noch accept in diesem Fall.
Aber:
Das wird bei Dir so nicht funktionieren, denn der erste Parameter von select erwartet die Anzahl der zu überwachenden Bits, also den höchsten Wert aller gesetzten Verbindungen + 1. Das heisst bei Dir (erster Parameter == 0), dass garkeine Sockets überwacht werden und demnach das fd_set unverändert zurück kommt. Du müsstest also den höchsten Socket in der Schleife ermitteln.BTW:
- "sicher ist sicher" - wtf? - die for-Schleife bricht ab, wenn der Zähler == size() ist. Wir sind hier doch nicht bei der Wahrscheinlichkeitsprogrammierung.
- "x == true" ist doppelt gemoppelt. If überprüft den Ausdruck in Klammern auf true. D.h. Du überprüfst, ob "FD_ISSET(...) == true" == true ist.
- arbeite mal etwas an Deinen Formulierungen
-
wegen dem select, naja bei winsock kann ich da ruhig ne null reinklatschen,... allerdings net bei einem *nix sys net,... jo,..
http://www.c-worker.ch/tuts/select.php
-nfds: Dieser Parameter wird unter Windows eigentlich gar nicht benötigt und ist nur für die Kompatibilität mit Unix vorhanden. Dort muss dieser Parameter auf den grössten Socket in den Arrays + 1 gesetzt werden.wegen dem doppelt gemoppelt,.. jo
war als pseudo gemeint, aber hier nochmal:
if(FD_ISSET(client[i].sock,&fdSet)){..}
Ja, im Grunde stimmt das soweit. Und wenn recv nach dem select auf einem gesetzten (verbundenen) Socket 0 zurückgibt, wurde die Verbindung vom Gegenüber geschlossen. Blockieren würden weder recv noch accept in diesem Fall.
jo thx,. . :xmas1: