FD_ISSET() hilfe
-
Hallo,
bin neu hier und muss gleich mal mit einem problem um die ecke kommen
und zwar hab ich probleme mit FD_ISSET(), entweder versteh ich das nicht oder ich mach was falsch
könnt ihr mir sagen warum der print mit "Kein neuer Client" nur nach der annahme eines neuen Clients ausgefürt wird?
ach fast vergessen, es handelt sich hier um ein Winsock2 Server unter Win7
der aus ein Tutorial stammt -> http://www.c-worker.ch/tuts/select.phpBitte helft mir ich versuche schon seid tagen eine lösung zu finden. Google mag mich schon nicht mehr
while(1) { FD_ZERO(&fdSet); // Inhalt leeren FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen // alle gültigen client sockets hinzufügen (nur die die nicht INVALID_SOCKET sind) for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdSet); } } rc=select(0,&fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben if(rc==SOCKET_ERROR) { printf("Fehler: select, fehler code: %s\n",WSAGetLastError()); return 1; } // acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat) if(FD_ISSET(acceptSocket,&fdSet)) { // einen freien platz für den neuen client suchen, und die verbingung annehmen for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); printf("Neuen Client angenommen (%d)\n",i); //break; } } } else printf("Kein neuer Client"); }
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
crischan schrieb:
könnt ihr mir sagen warum der print mit "Kein neuer Client" nur nach der annahme eines neuen Clients ausgefürt wird?
Wie kommst du zu der Annahme?
man FD_ISSET schrieb:
FD_ISSET(fd, &fdset) is non-zero if fd is a member of fdset, zero otherwise.
Wenn der Client gültig ist, wird doch der if-Zweig ausgeführt.
-
Du gibst select als timeout - Parameter NULL mit. Damit ist das ein blockierender Aufruf, der erst zurückkommt, wenn irgendwas mit Deinem fdset passiert ist.
Solange noch gar kein Client verbunden ist, kann das ausschließlich von einem Client kommen, der sich verbinden möchte.
Wenn dann ein Client verbunden ist, können auch andere Ereignisse, nämlich die, die mit diesem Client zu tun haben, zum rückkehren der select - Funktion führen, so dass erst dann der else - Zweig angesprungen werden kann.
-
Danke Belli
mit timeout - Parameter läuft es wie ich es mir vorgestellt hab
mfg