elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error con send de Winsock (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error con send de Winsock (Solucionado)  (Leído 1,428 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Error con send de Winsock (Solucionado)
« en: 1 Diciembre 2018, 23:21 pm »

Muy buen dia.

Estoy trabajando con un servidor http de lo mas básico posible.

Tengo un error al momento de enviar el contenido. El navegador a veces recibe los archivos incompletos y no logro ubicar el error.



El navegador indica que solo recibe 768KB para el penultimo archivo "/test.mp3"

La salida del programa indica lo siguiente para ese archivo.



Leido indica la cantidad de bytes que a leido desde el archivo:

Código
  1. fseek(contenido,offset,SEEK_SET);
  2. leido = fread(buffer,1,size,contenido);
  3. printf("Leido %i %s\n",leido,path);
  4. if(leido != size) {
  5. fprintf(stderr,"fread() read %i vs request %i\n",leido,size);
  6. exit(0);
  7. }
  8. fclose(contenido);
  9.  

leido toma la cantidad que devuelve fread, si leido y size son distintos el programa termina inmediatamente.


Posteriormente mando ese buffer leido al comando send.

Código
  1. int send_all(SOCKET descriptor, const void *buffer, size_t length, int flags) {
  2. printf("send_all\n");
  3.    ssize_t n;
  4.    const char *p = buffer;
  5.    while (length > 0)
  6.    {
  7.        n = send(descriptor, p, length, flags);
  8. printf("send: %i bytes\n",n);
  9.        if (n <= 0)
  10.            return -1;
  11.        p += n;
  12.        length -= n;
  13.    }
  14.    return 0;
  15. }
  16.  

send all indica mediante la variable "n" la cantidad de datos enviados por send.

Asi mismo en los headers recibe correctamente el mismo numero indicado por el programa:



Asi que dado que la cantidad de items leidos por fread es la misma que la cantidad de bytes enviados por send, no entiendo por que el navegador no recibe todo el archivo, ya que al momento de tratar de reproducirlo esta incompleto.

Saludos



Al final quedo solucionado modificando la funcion send all. Por alguna razon dice que a enviado todos lo 2 MB pero el navegador  solo recibio los 700 KB. Modique la funcion para que envie de 64 bytes por vez y ahora envio el documento completo

Código
  1. int send_all(SOCKET descriptor, const void *buffer, int length, int flags) {
  2. int n,s;
  3. const char *p = buffer;
  4. while (length > 0) {
  5. s = ( length > 64 ) ? 64: length;
  6. n = send(descriptor, p, s, flags);
  7. if (n <= 0)
  8. return -1;
  9. p += n;
  10. length -= n;
  11. }
  12. return 0;
  13. }



Y el programa marca exactamente la misma cantidad.


Saludos!


« Última modificación: 3 Diciembre 2018, 15:02 pm por AlbertoBSD » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
SOLUCIONADO ;Duda empezando con winsock « 1 2 »
Programación Visual Basic
Littl3 15 6,724 Último mensaje 6 Marzo 2008, 17:49 pm
por Littl3
Winsock operacion send seguida de connect.
Programación Visual Basic
Distorsion 4 2,021 Último mensaje 14 Marzo 2008, 22:09 pm
por Distorsion
iniciandome en winsock ayuda (solucionado)
Programación Visual Basic
pedraosone 4 2,430 Último mensaje 1 Abril 2008, 20:12 pm
por pedraosone
Error con el manejo de send y recv
Programación C/C++
Mr.Blue 2 3,482 Último mensaje 26 Noviembre 2010, 20:01 pm
por Mr.Blue
[Solucionado] Connectar a dos ip Winsock
Programación Visual Basic
Leinad5991 3 3,750 Último mensaje 1 Enero 2011, 15:58 pm
por Leinad5991
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines