WSAEINVAL bei select



  • Hi,
    ich habe hier vor ein paar Tagen schon eine Frage gestellt und ihr konntet mir schnell weiterhelfen.
    Nun stehe ich vor dem nächsten Problem (zum gleichen Thema), dass ich alleine nicht bewältigen kann.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-245981.html

    Ich habe mich am Tutorial http://www.c-worker.ch/tuts/select.php versucht,
    und darauf basierend eine kleine Anwendung geschrieben, die so etwas wie ein Proxy werden soll.

    In diesem Tutorial wird innerhalb der Hauptschleife gleich am Anfang jedes mal das FD_SET neu definiert,
    das halte ich irgendwie für sinnlos, da man das Set ja eigentlich auch einfach anpassen kann.

    while(1)
      {
        FD_ZERO(&fdSet); // Inhalt leeren
        FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen
        ...
    

    normalerweise sollte es doch ausreichen wenn man folgendes schreibt

    FD_ZERO(&fdSet); // Inhalt leeren
    FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen
    
    while(1)
      {
        ...
    

    so ähnlich habe ich das in meinem Programm gemacht, ich lösche die Clienten einfach mit FD_CLR() raus, wenn ich sie nicht mehr brauche.

    Mein Problem ist, dass select() so damit nicht zufrieden ist und ich nicht rausfinden kann wieso.
    Der Fehler den WSAGetLastError() liefert ist WSAEINVAL.

    WSAEINVAL 10022
    Invalid argument.
    Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function).
    In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

    Es funktioniert nur wenn ich das Set jedes mal neu erstelle in der Hauptschleife, so wie im Tutorial.
    Wieso ist das so?
    Wo ist das Problem?

    Der Code zum nachvollziehen: http://pastebin.com/m68c4a590
    Wichtig sind hier die Zeilen: 21-23 und 72.

    Danke schon im voraus, Doll



  • Für alle die jemals das selbe Problem haben sollten:

    Es gibt noch eine andere Fehlerbeschreibung für WSAEINVAL:
    The time-out value is not valid, or all three descriptor parameters were null.

    Es liegt also daran, dass kein Sockets mehr im ReadSet ist,
    da der ListenSocket ja rausgelöscht wird, wenn er einmal keine Verbindung liefern sollte.

    Des Rätsels Lösung ist also einfach

    FD_SET(wsListen.getId(), &fdsSocks);
    

    innerhalb der Hauptschleife auszuführen.

    Freundliche Grüße - Doll


Anmelden zum Antworten