Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[SOLUCIONADO] Ayuda con código para transferencia de archivos en C

  • 2 Respuestas
  • 1619 Vistas

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

Desconectado proxy_lainux

  • *
  • Underc0der
  • Mensajes: 122
  • Actividad:
    3.33%
  • Reputación 0
  • belial grimoire
    • Ver Perfil
« en: Agosto 01, 2016, 11:45:42 pm »
Hola

No sé si mi pregunta va en esta zona, pero bueno, espero no poner desorden.

Estaba intentando hacer un programa que me realice una transferencia de archivos basado en C en linux, después de analizar el código, no logro hacerlo funcionar, ya que lo único que logro mandar es un archivo txt e incompleto, y los demás archivos no los logro mandar correctamente.

Espero haya alguien aquí que me pueda ayudar revisando lo que hice y espero me pueda ayudar diciendome que estoy haciendo mal. Hace unos años lo intenté y logré hacerlo funcionar, pero perdí el código y ahora no recuerdo que hice, pero la idea de como lo inicié aún la recuerdo, sin embargo, no logro entender que estoy haciendo mal esta vez.

Dejaré el código, solo espero sea entendible ya que moví varias cosas para hacerlo funcionar.

Servidor

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <netdb.h>
  4. #include <unistd.h>
  5. #include <netinet/in.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8.  
  9.  
  10. int main(){
  11.  
  12. int sockfd, bytenumero;
  13. struct sockaddr_in re;
  14. int sin_size, confd;
  15. long bff, bfin, erecv;
  16. char buf[1024];
  17.  
  18. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  19.  
  20. re.sin_family = AF_INET;
  21. re.sin_port = htons(33371);
  22. re.sin_addr.s_addr = INADDR_ANY;
  23. memset(re.sin_zero, 0, 8);
  24.  
  25. bind(sockfd, (struct sockaddr*)&re, sizeof(struct sockaddr));
  26.  
  27. sin_size = sizeof(struct sockaddr_in);
  28.  
  29. listen(sockfd, 10);
  30.  
  31. sockfd = accept(sockfd, (struct sockaddr *)&re, &sin_size);
  32.  
  33. recv(sockfd, (char*)bff, sizeof(long), 0);
  34. bfin = ntohl(*((long*)bff));
  35.  
  36. send(sockfd, "listo", 5, 0);
  37.  
  38. printf("%d", bfin);
  39.  
  40. FILE *flito = fopen("/home/grimoire/ko.txt", "wb");
  41.  
  42. erecv = 0;
  43. bytenumero = 0;
  44.  
  45. while(erecv < bfin){
  46.    
  47.     bytenumero = recv(sockfd, buf, sizeof(buf), 0);
  48.     fwrite(buf, 1, bytenumero, flito);
  49.    
  50.     erecv = erecv + bytenumero;
  51.     printf("%d", erecv);
  52.    
  53. }
  54.  
  55.  
  56. fclose(flito);
  57. close(sockfd);
  58.  
  59. return 0;
  60.  
  61. }

Cliente

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <netdb.h>
  5. #include <unistd.h>
  6. #include <netinet/in.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9.  
  10.  
  11. int main(){
  12.  
  13.  
  14. int leido;
  15. int sockfd, ienv;
  16. long siz, zout;
  17. struct hostent *he;
  18. struct sockaddr_in t_add;
  19. FILE *pfile, *flista;
  20. char bff[5];
  21. char bufer[1024];
  22.  
  23. he = gethostbyname("127.0.0.1");
  24.  
  25. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  26.  
  27. t_add.sin_family = AF_INET;
  28. t_add.sin_port = htons(33371);
  29. t_add.sin_addr = *((struct in_addr*)he->h_addr);
  30. memset(t_add.sin_zero,0, 8);
  31.  
  32.  
  33.   connect(sockfd, (struct sockaddr*)&t_add, sizeof(struct sockaddr));
  34.  
  35.   pfile = fopen("/home/grimoire/korn.txt", "rb");
  36.   fseek(pfile, 0, SEEK_END);
  37.   siz = ftell(pfile);
  38.   rewind(pfile);
  39.  
  40.   zout = htonl(siz);
  41.  
  42.   printf("%ld", siz);
  43.  
  44.   send(sockfd, (char*)&zout, sizeof(zout), 0);
  45.  
  46.   recv(sockfd, bff, sizeof(bff), 0);
  47.  
  48.   printf("\n%s\n", bff);
  49.  
  50.   ienv = 0;
  51.   leido = 0;
  52.  
  53.   if(flista != NULL)
  54.  
  55.   while(!feof(pfile)){
  56.    
  57.     leido = fread(bufer, 1, sizeof(bufer), pfile);
  58.     send(sockfd, bufer, leido, 0);
  59.     ienv = ienv + leido;
  60.    
  61.     printf("%d", ienv);
  62.    
  63.   }
  64.  
  65.  
  66.   fclose(pfile);
  67.   close(sockfd);
  68.  
  69.   return 0;
  70.  
  71. }
  72.  
  73.  

« Última modificación: Agosto 02, 2016, 04:42:31 pm por Gabriela »

Desconectado grep

  • *
  • Underc0der
  • Mensajes: 187
  • Actividad:
    40%
  • Reputación 4
    • Ver Perfil
    • Grep's personal site
« Respuesta #1 en: Agosto 02, 2016, 04:20:41 am »
Hola,

voy a remarcar secciones puntuales sólo para que el código funcione.

Comenzando con el cliente,

veo que tienes la siguiente línea:

Código: C
  1. zout = htonl(siz);

No veo necesario ningún byte ordering más que el de tu máquina. Esto me lleva a borrar esta línea y cambiar el código de send:

Código: C
  1. // send(sockfd, (char*)&zout, sizeof(zout), 0);
  2. send(sockfd, &siz, sizeof siz, 0);

Finalmente veo que tienes esta línea que no le veo utilidad alguna:

Código: C
  1. if(flista != NULL) // debes comentar o borrar esta línea
  2.  


Ahora con el server,

debes corregir tu primer llamada a recv():

Código: C
  1. // recv(sockfd, (char*)bff, sizeof(long), 0);
  2. recv(sockfd, &bff, sizeof(long), 0);
  3.  

Además no veo necesario realizar el byte ordering, el cual se encuentra en la asignación a la variable bfin:

Código: C
  1. bfin = ntohl(*((long*)bff)); // debes comentar o borrar esta línea

En consecuencia debes cambiar las líneas en donde utilizas bfin:

Código: C
  1. // printf("%d", bfin);
  2. printf("%d", bff);
  3.  
  4. .
  5. .
  6. .
  7.  
  8. // while(erecv < bfin){
  9. while(erecv < bff) {
  10.  


Saludos
« Última modificación: Agosto 02, 2016, 04:44:12 am por grep »

Desconectado proxy_lainux

  • *
  • Underc0der
  • Mensajes: 122
  • Actividad:
    3.33%
  • Reputación 0
  • belial grimoire
    • Ver Perfil
« Respuesta #2 en: Agosto 02, 2016, 04:41:10 pm »
Gracias, ah funcionado.

No tenía idea de que htonl se usara para ordenar bytes en el network, yo creía que era para pasar variables long, en este caso pasar el long de la variable donde guarde el tamaño del archivo. pero efectivamente lo quite como mencionas e igual recibí el tamaño del archivo.

Pero ya funciona, gracias por la ayuda :)

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] ¿Kali Linux o Kali Linux Ligth ?

Iniciado por worq

Respuestas: 2
Vistas: 22585
Último mensaje Noviembre 21, 2017, 12:28:54 pm
por Codig0Bit
Crear un archivo .vbs para ejecutar un archivo .bat en invisible

Iniciado por NMS

Respuestas: 2
Vistas: 9618
Último mensaje Marzo 13, 2017, 10:37:57 pm
por sadfud
Cómo uso la "/" para hacer un select en una tabla

Iniciado por tetano32

Respuestas: 3
Vistas: 3638
Último mensaje Diciembre 20, 2017, 04:41:12 pm
por tetano32
allegro 5,opngl,sdk para fan game modo storyboard game

Iniciado por Mr.Tru

Respuestas: 2
Vistas: 2819
Último mensaje Mayo 23, 2018, 01:19:20 pm
por Mr.Tru
Como hago para que gmail no detecte enlace como sospechoso?

Iniciado por Clean444

Respuestas: 3
Vistas: 2070
Último mensaje Febrero 21, 2019, 08:47:46 pm
por lordpucheta