Est-il possible (et sûr) de rendre une socket acceptante non bloquante?

Je cherche un moyen d’interrompre un appel accept() sur une socket bloquante. L’utilisation de signaux n’est pas une option, car cela est censé être dans une bibliothèque et je ne veux pas encombrer les signaux des utilisateurs. Utiliser select() est une autre option, mais pour différentes raisons, ce n’est pas très attrayant dans mon cas.

Ce qui fonctionnerait bien, si possible, est de définir le socket en mode non bloquant (à l’aide de fcntl() et O_NONBLOCK ) à partir d’un autre thread, alors que le socket est bloqué lors d’un appel accept() . Le comportement attendu est que l’appel accept() retourne avec EAGAIN ou EWOULDBLOCK dans errno .

Cela fonctionnerait-il vraiment comme ça? Est-ce sûr? Portable?

Si vous connaissez l’applicabilité de cette méthode à Windows (où vous devez utiliser WSAIoctl() et FONBIO ), je suis également intéressé.

Aucune idée de Windows, mais le comportement que vous souhaitez est garanti par POSIX:

Si la queue d’écoute est vide des demandes de connexion et que O_NONBLOCK n’est pas défini sur le descripteur de fichier de la socket, accept () sera bloqué jusqu’à ce qu’une connexion soit présente. Si la queue listen () est vide des demandes de connexion et que O_NONBLOCK est défini sur le descripteur de fichier de la socket, accept () doit échouer et définir errno sur [EAGAIN] ou [EWOULDBLOCK].

Source: http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html

De plus, select ou poll peut être utilisé pour vérifier les connexions entrantes en interrogeant le socket d’écoute dans le jeu de lecture.