Winsock "Recv übergehen"?



  • ach danke für eure hilfe ^^
    aber es is der client also bringt mir select() garnichts ... (oder?)

    ich versuchs nun mit ioctlsocket() ...

    nun habe aber direkt ein problem ^^

    wenn ich den non blocking mode anmache kann der client aufeinmal nicht mehr connecten ...

    nun .. wo ist mein problem?

    u_long sockmode = 1;
       ioctlsocket(sock, FIONBIO, &sockmode);
    
       // Verbinden
       memset(&addr,0,sizeof(SOCKADDR_IN));
       addr.sin_family=AF_INET;
       addr.sin_port=htons(1234);
       addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    
       con=connect(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR));
       if(con==SOCKET_ERROR)
       {
           printf("Konnte nicht Connecten\n");
           Sleep(1999);
       }
       else
       {
           printf("Connected\n");
       }
    

    danke lukas



  • Mit select() kannst Du natürlich auch den Socket des Client prüfen.

    So zum Beispiel:

    bool readable(SOCKET socket)
    {
        FD_SET fdSet;
        TIMEVAL timeout;
        timeout.tv_sec = 0;
        timeout.tv_usec = 0;
        long status;
    
        FD_ZERO(&fdSet);
        FD_SET(socket,&fdSet);
        status = select(0,&fdSet,0,0,&timeout);
        if (status <= 0) FD_ZERO(&fdSet);
        if (!FD_ISSET(socket,&fdSet)) return false;
        return true;
    }
    
    int main()
    {
        SOCKET s;
    
        // ...
    
        if (readable(s))
        {
            //Daten sind vorhanden -> recv()
        }
    }
    

    lg Max

    PS:
    Sry, hab nen Fehler beim timeout gemacht, ist jetzt korrigiert.



  • Du könntest einfach das ioctlsocket erst nach dem connect machen.

    connect schlägt in deinem Beispiel fehl weil die Verbindung im Non-Blocking Mode im Hintergrund hergestellt wird. Mit select kannst du warten bis die Verbindung hergestellt wurde.


Anmelden zum Antworten