Ist es möglich (und sicher), einen akzeptierenden Socket nicht blockierend zu machen?

8

Ich suche nach einer Möglichkeit, einen accept() Aufruf für eine Blockierung zu unterbrechen Steckdose. Das Verwenden von Signalen ist keine Option, da dies in einer Bibliothek vorgesehen ist und ich die Benutzersignale nicht stören möchte. Die Verwendung von select() ist eine andere Option, buf aus verschiedenen Gründen ist es in meinem Fall nicht sehr ansprechend.

Was gut funktioniert, wenn möglich, ist, den Socket auf den nicht blockierenden Modus zu setzen (mit fcntl() und O_NONBLOCK ) aus einem anderen Thread, während der Socket bei einem accept() -Aufruf blockiert ist. Das erwartete Verhalten ist, dass der Aufruf accept() mit EAGAIN oder EWOULDBLOCK in errno zurückkehrt.

Würde es tatsächlich so funktionieren? Ist es sicher? Tragbar?

Wenn Sie die Anwendbarkeit dieser Methode in Windows kennen (wo Sie WSAIoctl() und FONBIO ), ich bin auch interessiert.

    
Norswap 12.10.2012, 15:06
quelle

1 Antwort

5

Keine Ahnung von Windows, aber das von Ihnen gewünschte Verhalten wird von POSIX garantiert:

  

Wenn die Listenwarteschlange keine Verbindungsanforderungen enthält und O_NONBLOCK für den Dateideskriptor für den Socket nicht festgelegt ist, muss accept () blockieren, bis eine Verbindung vorhanden ist. Wenn die listen () - Warteschlange leer von Verbindungsanforderungen ist und O_NONBLOCK für den Dateideskriptor für den Socket gesetzt ist, wird accept () fehlschlagen und errno auf [EAGAIN] oder [EWOULDBLOCK] setzen.

Quelle: Ссылка

Außerdem kann select oder poll verwendet werden, um nach eingehenden Verbindungen zu suchen, indem nach dem hörenden Socket im Lesesatz gesucht wird.

    
R.. 12.10.2012, 15:09
quelle

Tags und Links