Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 29 Septiembre 2015, 11:18 am



Título: ¿Recv() porque tarda infinito? ...
Publicado por: Kaxperday en 29 Septiembre 2015, 11:18 am
Código
  1. string respuesta;
  2. char *bloque = new char[3000]();
  3. while (int res = recv(victima, bloque, 3000, 0) > 0)
  4. 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.


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: Orubatosu en 29 Septiembre 2015, 11:37 am
Si eso es una función... ¿donde está el return?


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: Kaxperday en 29 Septiembre 2015, 12:27 pm
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
  1. string respuesta;
  2. char *bloque = new char[3000]();
  3. timeval tiempo_espera;
  4. tiempo_espera.tv_sec = 1;
  5. setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  6. while (recv(victima, bloque, 3000, 0) > 0)
  7. respuesta += string(bloque);

Saludos ft kxd


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: 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.


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: Kaxperday en 29 Septiembre 2015, 13:14 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.


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: Eternal Idol en 29 Septiembre 2015, 13:29 pm
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).


Título: Re: ¿Recv() porque tarda infinito? ...
Publicado por: Kaxperday en 29 Septiembre 2015, 14:46 pm
Si es correcto.

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