2012-09-27 15 views
6

Estoy cambiando una conexión de socket en una secuencia de comandos a una conexión sin bloqueo. En un tutorial encontré las líneas:utilizando una conexión de socket sin bloqueo en C

x=fcntl(s,F_GETFL,0);    // Get socket flags 
fcntl(s,F_SETFL,x | O_NONBLOCK); // Add non-blocking flag 

Así que las agregué después de crear mi socket y antes de la declaración connect. Y ya no bloquea :) pero tampoco se conecta. No recibo ningún error, la conexión solo devuelve -1. Si comento estas líneas, se conecta.

¿Qué más necesito agregar para obtener una conexión sin bloqueo para conectar?

Respuesta

6

Comprueba el valor de retorno de connect(2) - deberías estar obteniendo -1, y EINPROGRESS en errno(3). A continuación, agregue el descriptor de archivo de socket a un conjunto de sondeo y espere con select(2) o poll(2).

De esta manera puede tener varios intentos de conexión al mismo tiempo (así es como lo hacen los navegadores) y poder tener tiempos de espera más cortos.

4

connect probablemente devolverá de inmediato un error EINPROGRESS. Lea sobre el uso de select.

Tenga en cuenta que probablemente desee ajustar su llamada para seleccionar en la macro TEMP_FAILURE_RETRY.

+0

Hmm, ¿cuál es el punto aquí? ¿En qué se diferencia de * blocking * 'connect'? –

+0

@NikolaiNFetissov Punto razonable, he editado mi respuesta para eliminar el fragmento de código como potencialmente engañoso y enfatizo el uso de TEMP_FAILURE_RETRY – simonc

Cuestiones relacionadas