¿Recv() porque tarda infinito? ...

Iniciado por Kaxperday, 29 Septiembre 2015, 11:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Código (cpp) [Seleccionar]
string respuesta;
char *bloque = new char[3000]();
while (int res = recv(victima, bloque, 3000, 0) > 0)
respuesta += string(bloque);


... mientras que esto es instantáneo? : recv(victima, bloque, 3000, 0);

¿No hay algún timeout para que salga?, o ¿no se puede hacer algo?.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Orubatosu

Si eso es una función... ¿donde está el return?
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

Kaxperday

#2
Cita de: Orubatosu en 29 Septiembre 2015, 11:37 AM
Si eso es una función... ¿donde está el return?

Si te refieres al código en su conjunto es una parte de una función, y hay funciones que no devuelven nada, void.

Si te refieres al recv(), su valor de retorno queda almacenado en la variable res, que ahora que lo dices se me ha olvidado quitarla, pues ya no la uso, hago comprobación de tamaño de la respuesta obtenida, en vez de igualar a SOCKET_ERROR (-1), así hago una mejor comprobación de errores y si no obtiene respuesta cuenta como error.

Aparte que esto no tiene que ver con el tema en cuestión, seguiré buscando hacerla de un timeout para recv(), seguro se puede.

Saludos.

Tacata && solvented:

Código (cpp) [Seleccionar]
string respuesta;
char *bloque = new char[3000]();
timeval tiempo_espera;
tiempo_espera.tv_sec = 1;
setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
while (recv(victima, bloque, 3000, 0) > 0)
respuesta += string(bloque);


Saludos ft kxd
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

Son sockets bloqueantes y estas en un bucle, cuando no haya mas que leer esperara a recibir algo desde el otro extremo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

Cita de: Eternal Idol en 29 Septiembre 2015, 13:01 PM
Son sockets bloqueantes y estas en un bucle, cuando no haya mas que leer esperara a recibir algo desde el otro extremo.

Pero sale del bucle cuando hay error (-1) o cuando ya no recibe más datos, debido a la condición, y para que no se quede esperando respuesta, cuando el timeout salta sale del bucle si no ha recibido respuesta. Luego espera al otro extremo, hasta que el timeout salta, entonces deja de esperarlo y sale.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Eternal Idol

#5
Si te referis al ultimo codigo es asi, yo me referia a la pregunta original donde SO_RCVTIMEO es 0 por defecto y por lo tanto espera para siempre hasta recibir respuesta del otro extremo (o que se cierre el socket pero en fin la diferencia entre esa llamada solitaria y el bucle es eso, al continuar llamando a recv se queda sin bytes por leer y espera a que le manden algo).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Kaxperday

Si es correcto.

Ya solo sería configurar el timeout  de descarga recv() y subida send() para cada red.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.