2009-05-26 11 views

Respuesta

1

Soy consciente de un error en un operativo de escritorio popular donde O_NONBLOCK sockets TCP, en particular los que se ejecuta sobre la interfaz de bucle de retorno, a veces pueden volver EAGAIN de recv() después select() informes el zócalo esté listo para la lectura. En mi caso, esto sucede después de que el otro lado cierra a medias el flujo de envío.

Para obtener más información, consulte el código fuente t_nx.ml en la biblioteca NX de mi distribución de entorno de aplicación de red OCaml. (link)

+1

El enlace parece estar roto – Thomas

+0

Es curioso, en el menú de edición, se puede hacer clic en él. :RE – thejh

2

Es posible, pero solo en una situación donde tienes múltiples hilos/procesos tratando de leer desde el mismo socket.

+0

Me alegra oír eso. Mi aplicación es de un solo hilo, así que estoy bien. – mrvincenzo

4

Para recv() obtendría EAGAIN en lugar de EWOULDBLOCK, y sí es posible. Ya que sólo se ha comprobado con select() entonces una de dos cosas sucedieron:

  • Otra cosa (otro hilo) ha drenado el buffer de entrada entre select() y recv().
  • Se estableció un tiempo de espera de recepción en el socket y expiró sin que se recibieran datos.
+0

En caso de tiempo de espera, select() devuelve 0, por lo que no me preocupa. – mrvincenzo

+3

#define EWOULDBLOCK EAGAIN/* La operación bloquearía */- se encuentra en muchos sistemas operativos – blaze

+0

POSIX.1-2001 permite que se devuelvan errores al leer en un socket no bloqueante (y no requiere que tengan el mismo valor.) –

0

Es posible en un entorno multiproceso donde dos hilos están leyendo desde el zócalo. ¿Es esta una aplicación multiproceso?

+0

Es una aplicación de un solo hilo. – mrvincenzo

+0

Incluso si hay un tiempo de espera en el socket en lugar de solo un parámetro para 'select()'? ¿Qué pasa si el tiempo de espera ocurre entre 'select()' y 'recv()'? – dwc

+0

En este caso, no debería ver este comportamiento. – mikelong

0

Si no llama a ningún otro syscall entre select() y recv() en este conector, entonces recv() nunca devolverá EAGAIN o EWOULDBLOCK.

No sé lo que significan con recv-timeout, sin embargo, el estándar POSIX no lo menciona aquí por lo que puede estar seguro llamando a recv().

0

Aunque mi aplicación es de un solo subproceso, noté que el comportamiento descrito no es raro en RHEL5. Ambos con sockets TCP y UDP que se establecieron en O_NONBLOCK (la única opción de socket que se establece). select() informa que el socket está listo, pero el siguiente recv() devuelve EAGAIN.

Cuestiones relacionadas