NonBlocking Sockets -> Problem mit accept



  • Hallo ich möchte NonBlocking sockets verwenden leider bekomme ich dann bei accept immer ein "ressource is temporarily unavailable"

    if(fcntl(*sock,F_SETFL,flags | O_NONBLOCK) == SOCKET_ERROR)   // Add non-blocking flag
        {
    		printf("Failed to set socket %d to non-blocking. ERROR: %s\n", sock,strerror(errno));
    		return 0;
    	}
    

    so setz ich das flag auf nonblocking, mein accept funktion schaut so aus

    int		s;
    	int		len = sizeof(struct sockaddr);
    
    	s = accept(sock, (struct sockaddr *)addr, &len);
    
        if(s == SOCKET_ERROR)
        {
    		printf("Failed to accept socket %d, ERROR: %s\n", sock,strerror(errno));
    	}
    

    danke schon mal für eventuelle tipps



  • Es ist eben nonblocking. Wenn keine Verbindung für accept da ist, dann meldet accept eben EAGAIN bzw. EWOULDBLOCK als Fehler. Normalerweise nimmt man ja so etwas wie epoll und das sagt ja, wann man eine Verbindung annehmen soll und ruft dann erst accept auf.



  • Hilfreich ist immer wieder die man-page man: accept(2):

    EAGAIN or EWOULDBLOCK
    The socket is marked non-blocking and no connections are present to be
    accepted. POSIX.1-2001 allows either error to be returned for this case, and
    does not require these constants to have the same value, so a portable appli-
    cation should check for both possibilities.

    Also wie rüdiger richtig sagte, epoll, poll oder select wäre die Möglichkeit. Oder willst Du eventuell doch am accept blockieren und eigentlich den akzeptierten Filedesriptor auf non-blocking setzen? Dann hättest Du einen Denkfehler.



  • hmm also verbindungen kommen auf jeden fall rein aber accept gibt immer -1 zurück. Werde mir die vorschläge mal genauer anschauen. Ich denke aber so ganz hab ich das problem noch nicht verstanden... Danke trotzdem schonmal für die antworten



  • sD3nnis schrieb:

    hmm also verbindungen kommen auf jeden fall rein aber accept gibt immer -1 zurück. Werde mir die vorschläge mal genauer anschauen. Ich denke aber so ganz hab ich das problem noch nicht verstanden... Danke trotzdem schonmal für die antworten

    Wenn Du nicht weißt, was non-blocking überhaupt macht, wieso willst Du dann non-blocking sockets?

    Mache mal folgenden Test, vielleicht wird Dir dann klar was passiert:
    In Deinem Programm setze den Socket non-blocking, mach dann einen Sleep von 10 Sekunden, und dann den accept-Aufruf. Innerhalb dieser 10 Sekunden connectest Du Dich mit der Anwendung. Dann wird accept nicht mehr -1 zurückgeben.



  • sD3nnis schrieb:

    accept gibt immer -1 zurück.

    Mach dir klar, was nonblocking bedeutet: Dass accept nicht blockiert (also nicht auf Verbindungsversuche wartet).



  • das ist mir shcon bewusst. Dachte aber, dass wenn dann eine verbindung ankommt sie auch angenommen wird, was ja nicht da fall ist da immer -1



  • Der Zeitraum zwischen listen und accept ist so kurz, dass Du manuell nie und nimmer rechtzeitig einen Connect hinbekommst. Das Verhalten verwundert also nicht im geringsten.


Anmelden zum Antworten