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??
    also

    FD_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:


Anmelden zum Antworten