¿Cómo puedo intentar leer datos del socket con tiempo de espera? Lo sé, select, pselect, poll, tiene un campo de tiempo de espera, pero su uso desactiva "tcp fast-path" en tcp reno stack.
La única idea que tengo es usar recv (fd, ..., MSG_DONTWAIT) en un bucle
Respuestas:
Puede utilizar la función setsockopt para establecer un tiempo de espera en las operaciones de recepción:
Según se informa, en Windows, esto debe hacerse antes de llamar
bind
. He verificado mediante un experimento que se puede hacer antes o despuésbind
en Linux y OS X.fuente
struct timeval tv;
, ¿significa que select () no funcionará también? Intenté portar mi código select () a Windows y simplemente se agota inmediatamente, parece que está ignorando el valor que estoy configurando en timeval.Aquí hay un código simple para agregar un tiempo de espera a su
recv
función usandopoll
en C:fuente
poll
esperará recibir al menos un byte o timeout, mientras que al llamar a larecv
función esperarásizeof(buf)
bytes, provocando que se bloquee nuevamente si aún no ha llegado este conteo, pero esta vez sin tener timeout.// funciona también después de la operación de vinculación para WINDOWS
fuente
Instale un controlador para
SIGALRM
, luego usealarm()
oualarm()
antes de un bloqueo regularrecv()
. Si la alarma se dispara,recv()
devolverá un error con elerrno
ajuste aEINTR
.fuente
LINUX
VENTANAS
NOTA : ha puesto esta configuración antes de la
bind()
llamada de función para una ejecución adecuadafuente