Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 23.59 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <netinet/in.h>
  3. #include <arpa/inet.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <sys/types.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <ctype.h>
  10. #include <string.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13.  
  14. //Respuestas del servidor
  15. #define MODO_PASIVO 227
  16. #define PUERTO_DEFAULT 21
  17. #define SALIR 221
  18. #define ESPERA_USUARIO 220
  19. #define ESPERA_PASSWORD 331
  20. #define NO_INGRESADO 530
  21. #define MAL_SECUENCIA 503
  22. #define INGRESO_CORRECTO 230
  23. #define ABRIENDO_DC 150
  24. #define DC_ABIERTO 150
  25. #define CERRANDO_DC 226
  26. #define OPERACION_COMPLETA 250
  27.  
  28. //Variables globales
  29. int socketControl;
  30. char server_reply[BUFSIZ], mensaje_cliente [BUFSIZ],auxiliar[BUFSIZ];
  31. int respuestaServidorEntero;
  32. struct sockaddr_in server;
  33.  
  34. //Metodos
  35. void cd (char * parametro);
  36. void list();
  37. void user();
  38. void pwd();
  39. void sendfile(char * file_name);
  40. void recv_file(char *file);
  41. int socketPasivo();
  42. int socketActivo();
  43.  
  44. //Convertir todos los caracteres de un string en MAYUS
  45. void convertirAMayusculas(char * string) {
  46.   // Convert to upper case
  47.   char *s = string;
  48.   while (*s) {
  49.     *s = toupper((unsigned char) *s);
  50.     s++;
  51.   }
  52.  
  53. }
  54.  
  55. //VALIDACION NUMERO DE PUERTO
  56. int esPuertoValido(char * string){
  57.     int devolver = string[0] == ':'; //Todo puerto valido tiene que empezar con ':' y luego ser un numero.
  58.     int i;
  59.     int longitud = strlen (string);
  60.     for (i=1;i<longitud && devolver!= 0; i++)
  61.         if (!isdigit(string[i])){
  62.             devolver = 0;
  63.         }
  64.     return devolver;
  65. }
  66. //Muestra los comandos que se permiten ingresar durante la coneccion
  67. void mostrarAyuda(){
  68.     printf("QUIT: Finaliza la ejecución del cliente.\n");
  69.     printf("OPEN: <Servidor> [Puerto]. Realiza una conexion con el servidor y el puerto, en caso de ser especificado el mismo.\n");
  70.     printf("USER: Especifica el usuario bajo la cual se desea acceder al servidor.\n");
  71.     printf("PASS: Contraseña para identificarse con el usuario.\n");
  72.     printf("PWD: Muestra el directorio actual.\n");
  73.     printf("CD: <direccion> Cambio de directorio.\n");
  74.     printf("LIST: Listado de archivos en directorio actual.\n");
  75.     printf("PUT: <nombre archivo> Envío de archivo al servidor.\n");
  76.     printf("GET: <nombre archivo> Recepción del archivo indicado como argumento\n");
  77.     printf("PASSIVE: Modo de transferencia pasivo\n");
  78.     printf("ACTIVE: Modo de transferencia activo \n");
  79. }
  80.  
  81. int main(int argc, char** argv)
  82. {
  83.     //Validacion parametros de consola
  84.     if(argc > 4){
  85.         printf("Parametros incorrectos, [Servidor [:Puerto]] [-h] \n");
  86.         exit(1);
  87.     }
  88.     int i;
  89.     char * nombreServidor;
  90.     int puertoServidor = PUERTO_DEFAULT;
  91.  
  92.     for(i=0; i < argc; i++){
  93.         if(strcmp(argv[i],"-h") == 0){
  94.             mostrarAyuda();
  95.             exit(1);
  96.         }
  97.         if(i == 1){
  98.             nombreServidor = argv[i];
  99.         }
  100.         if(i == 2){
  101.             if(esPuertoValido(argv[i]))
  102.                 puertoServidor = atoi(argv[i]+1);
  103.             else{
  104.                 printf("Puerto invalido \n");
  105.                 exit(1);
  106.             }
  107.         }
  108.         if(i == 3){ //no es -h
  109.             printf("Paremetros incorrectos \n");
  110.             exit(1);
  111.         }
  112.     }
  113.     //Declaracion de variables
  114.     printf("\n Bienvenidos al cliente FTP!"); //mensaje bienvenida...
  115.  
  116.     //Creacion del socket
  117.     if ((socketControl = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  118.         printf("\nError al crear socket..");
  119.         exit(1);
  120.     }
  121.     printf("\nSocket creado correctamente");
  122.  
  123.     bzero(&server,sizeof(server));
  124.     server.sin_family = AF_INET;                     //SETEA PROTOCOLO DE LA FAMILIA
  125.     server.sin_port = htons(puertoServidor);        //SETEA PUERTO DEL SERVIDOR
  126.  
  127.     while(1){ // WHILE ESPERANDO PARA HACER OPEN o QUIT o HELP
  128.         //Conexion al servidor
  129.  
  130.         //LIMPIA BUFFER
  131.         memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char));
  132.         memset(auxiliar, '\0', BUFSIZ*sizeof(char));
  133.  
  134.         printf("\nftp> ");
  135.         scanf("%s", mensaje_cliente);
  136.         convertirAMayusculas(mensaje_cliente);// LO CONVIERTE TODO EN MAYUSUCULAS -> EN NO CASE SENSITIVE
  137.  
  138.        //Chequea que parametro se ingresa
  139.         if(strcmp(mensaje_cliente, "QUIT") == 0){
  140.             printf("\n Cerrando cliente ftp.");
  141.             exit(0);
  142.         }
  143.         else{
  144.             if(strcmp(mensaje_cliente, "HELP") == 0){
  145.                 mostrarAyuda();
  146.             }
  147.             else{
  148.                 if(strcmp(mensaje_cliente, "OPEN") != 0){
  149.                     printf("\n Comando invalido, utilice OPEN, QUIT o HELP.");
  150.                 }
  151.                 else{
  152.                     if(strcmp(mensaje_cliente, "OPEN") == 0){
  153.  
  154.                         //Solicitud de datos para la conexion al servidor
  155.                         printf("\nIngrese la direccion del servidor: ");
  156.                         scanf("%s", auxiliar);
  157.                         nombreServidor = auxiliar;
  158.                         inet_aton(nombreServidor, &server.sin_addr);
  159.  
  160.                         //Intenta conectar al servidor
  161.                         if (connect(socketControl , (struct sockaddr *)&server , sizeof(server)) < 0){
  162.                             perror("\nError en la conexion, servidor no disponible. Intente nuevamente ");
  163.                         }
  164.                         else{
  165.                             //Coneccion al servidor exitosa
  166.                             printf("\nConectado correctamente");
  167.  
  168.                             while(1){ //WHILE UNA VEZ REALIZADA LA CONEXION TCP
  169.                                 printf("ENTROOOOOOOOOOOOOOOO AL WHILEEEEE");
  170.  
  171.                                 memset(server_reply, '\0', BUFSIZ*sizeof(char));
  172.                                 if( recv(socketControl , server_reply , sizeof(server_reply) , 0) < 0)
  173.                                     printf("\nError al recibir respuesta del servidor.");
  174.                                 printf("\n%s",server_reply); //Muestra respuesta de la ultima consulta
  175.                                 respuestaServidorEntero = atoi(strtok(server_reply," ")) ; //Tomo la primer palabra de la respuesta (Que es el codigo establecido
  176.                                                                                            //en el RFC) y la paso a entero para poder usar el switch y que el codigo este mas bonito :)
  177.  
  178.                                //SWITCH segun codigo respuesta del servidor
  179.                                 switch(respuestaServidorEntero){
  180.                                     case SALIR: // despues del QUIT (codigo 221)
  181.                                         printf("\nCerrando cliente ftp.");
  182.                                         exit(0);
  183.                                         break;
  184.                                     case ESPERA_PASSWORD://codigo 331
  185.                                         memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char)); //LIMPIO COSAS VIEJAS
  186.  
  187.                                         //Lee pasword
  188.                                         strcat(mensaje_cliente,"PASS ");
  189.                                         char * password;
  190.                                         password = getpass("Password requerido: "); //ESCONDE LO QUE ESCRIBIS EN PANTALLA
  191.                                         printf("%s", password);
  192.                                         strcat(mensaje_cliente,password);
  193.                                         //free(password);
  194.                                         strcat(mensaje_cliente, "\n");
  195.  
  196.                                         //Envia password
  197.                                         if( send(socketControl, mensaje_cliente, (strlen(mensaje_cliente)), 0) < 0 ){
  198.                                             perror("send");
  199.                                             exit(2);
  200.                                         }
  201.                                         break;
  202.                                     case ESPERA_USUARIO://codigo 220
  203.  
  204.                                         //printf("\n si no tenes usuario generalmente podes entrar como anonymous");
  205.                                         //printf("\ncon contraseña con formato algo@algo.algo ");
  206.  
  207.                                         //Arma el mensaje que sera enviado al servidor
  208.                                         printf("\n Usuario requerido: ");
  209.                                         memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char)); //LIMPIO COSAS VIEJAS
  210.                                         memset(auxiliar, '\0', BUFSIZ*sizeof(char));
  211.                                         strcat(mensaje_cliente,"USER ");
  212.                                         scanf("%s", auxiliar);  //AUXILIAR ME SIRVE PARA PODER ARMAR EL STRING DE LA SIGUIENTE MANERA -> USER usuario\n
  213.                                         strcat(mensaje_cliente, auxiliar);
  214.                                         strcat(mensaje_cliente,"\n");
  215.  
  216.                                         //Envia el mensaje
  217.                                         if( send(socketControl, mensaje_cliente, (strlen(mensaje_cliente)), 0) < 0 ){
  218.                                             perror("send");
  219.                                             exit(2);
  220.                                         }
  221.                                         break;
  222.                                     default://COMPORTAMIENTO POR DEFECTO
  223.  
  224.                                         memset(auxiliar, '\0', BUFSIZ*sizeof(char));
  225.                                         do{   //hago esto para mantenerme en este estado por si se pide Help.
  226.  
  227.                                             printf("\nftp> ");
  228.                                             //Lee y arma el mensaje del cliente
  229.                                             memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char));
  230.                                             scanf("%s", mensaje_cliente);
  231.                                             char parametros [BUFSIZ];
  232.                                             convertirAMayusculas(mensaje_cliente); //TODO A MAYUS -> NO CASE SENSITIVE
  233.  
  234.  
  235.                                             if(strcmp(mensaje_cliente, "HELP")==0){
  236.                                                 mostrarAyuda();
  237.                                             }
  238.                                             else{
  239.                                                 if(strcmp(mensaje_cliente, "USER")== 0){
  240.                                                     user();
  241.                                                 }
  242.                                                 else{
  243.                                                      if(strcmp(mensaje_cliente, "LIST")== 0){
  244.                                                          list();
  245.                                                      }
  246.                                                      else{
  247.                                                         if(strcmp(mensaje_cliente, "PWD") == 0){
  248.                                                             pwd();
  249.                                                         }
  250.                                                         else{
  251.                                                             if(strcmp(mensaje_cliente, "CD") == 0){
  252.                                                                scanf("%s", parametros);
  253.                                                                cd(parametros);
  254.                                                             }
  255.                                                             else{
  256.                                                                 if(strcmp(mensaje_cliente, "GET") == 0){
  257.                                                                     scanf("%s", parametros);
  258.                                                                     recv_file(parametros);
  259.                                                                 }
  260.                                                                 else{
  261.                                                                     if(strcmp(mensaje_cliente, "PUT") == 0){
  262.                                                                         scanf("%s", parametros);
  263.                                                                         sendfile(parametros);
  264.                                                                     }
  265.                                                                 }
  266.                                                             }
  267.                                                         }
  268.                                                      }
  269.                                                 }
  270.                                             }
  271.  
  272.                                         }while(strcmp(mensaje_cliente, "HELP") == 0); //hago esto para mantenerme en este estado por si se pide Help.
  273.                                         break;
  274.                                     }
  275.                             }
  276.                         }
  277.                     }
  278.                 }
  279.             }
  280.         }
  281.     }
  282.     return 0;
  283. }
  284.  
  285. //Solicita nombre del usuario con el que se desea entrar en la conexion y intenta loguearse
  286. void user(){
  287.     //Armado del mensaje para enviarse al servidor
  288.     printf("\n Nombre de usuario: ");
  289.     scanf("%s", auxiliar);
  290.     strcat(mensaje_cliente, " ");
  291.     strcat(mensaje_cliente, auxiliar);
  292.     strcat(mensaje_cliente,"\n");
  293.  
  294.     //Envia mensaje al servidor
  295.     if( send(socketControl, mensaje_cliente, (strlen(mensaje_cliente)), 0) < 0 ){
  296.         perror("send");
  297.         exit(2);
  298.     }
  299. }
  300.  
  301. //Muestra direccion del directorio actual del servidor
  302. void pwd(){
  303.  
  304.     //toma del buffer el mensaje ingresado por el cliente
  305.     strcat(mensaje_cliente,"\n");
  306.  
  307.     //Envia el mensaje al servidor
  308.     if( send(socketControl, mensaje_cliente, (strlen(mensaje_cliente)), 0) < 0 ){
  309.         perror("send");
  310.         exit(2);
  311.     }
  312. }
  313.  
  314. //Lista archivos que estan contenidos en el directorio actual del servidor
  315. void list (){
  316.     // Declaracion de variables
  317.     int socketDatos;
  318.     FILE *file;
  319.     char *line;
  320.     size_t len;
  321.     line = NULL;
  322.     len = 0;
  323.     //Fin declaracion variables
  324.  
  325.     /* Entro a modo pasivo */
  326.     socketDatos = socketActivo();
  327.  
  328.     memset(server_reply, '\0', BUFSIZ*sizeof(char));//Limpia buffer de respuesta del servidor
  329.     strcat(mensaje_cliente, "\n");                  //inserta salto de linea al final del buffer del mensaje cliente
  330.  
  331.     send(socketControl, mensaje_cliente, strlen(mensaje_cliente) , 0);//envia mensaje del cliente al servidor
  332.  
  333.     if( recv(socketControl , server_reply , sizeof(server_reply) , 0) < 0)//recibe datos del servidor
  334.         printf("\nError al recibir respuesta del servidor.");
  335.  
  336.         printf("\n%s", server_reply); //Recibe respuesta del servidor (codigo 150 si esta bien)
  337.         int respuestaServidorEntero = atoi(strtok(server_reply," ")) ;
  338.         if (respuestaServidorEntero == ABRIENDO_DC || respuestaServidorEntero == DC_ABIERTO){
  339.             //Se transfirió el archivo
  340.                 //Se recupera archivo
  341.                 if ((file = fdopen(socketDatos, "r")) == NULL){
  342.                     exit(EXIT_FAILURE);
  343.                     printf("Se produjo un error al abrir el archivo\n");
  344.                 }
  345.                 printf("LIST: \n");
  346.                 //SE IMPRIME ARCHIVO EN FORMA DE LISTA
  347.                 while (getline(&line, &len, file) != -1){
  348.                         printf("%s \n", line);
  349.                 }
  350.  
  351.                 fclose(file);//cierra archivo
  352.  
  353.         }
  354.     else{
  355.         printf("ERROR: %i \n", respuestaServidorEntero);
  356.     }
  357.     close(socketDatos);
  358.  
  359.  }
  360.  
  361.  
  362. int socketActivo(){
  363.     int socketServer, numeroPuerto, nuevoSocket;
  364.     struct sockaddr_in server_addr;
  365.     socklen_t server_len = sizeof(server_addr);
  366.     //Creo el socket
  367.     socketServer = socket(AF_INET,SOCK_STREAM,0);
  368.     if(socketServer < 0){
  369.         printf("Error creando socket activo");
  370.         exit(1);
  371.     }
  372.  
  373.     //Recupero el puerto abierto
  374.     if (getsockname(socketControl, (struct sockaddr *)&server_addr, &server_len) == -1) {
  375.       perror("Error recuperando puerto");
  376.       return -1;
  377.     }
  378.     numeroPuerto = ntohs(server_addr.sin_port) + 1;
  379.    // bzero((char *) & server_addr, sizeof(server_addr));
  380.     server_addr.sin_port = htons(numeroPuerto);
  381.  
  382.     //Bind el host address
  383.     if(bind(socketServer, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0){
  384.        printf("Error BIND");
  385.         exit(1);
  386.     }
  387.     printf("Bindeo correcto \n");
  388.    
  389.     //Empiezo a escuchar al cliente (que es el servidor ftp
  390.     printf("Listening... \n");
  391.     if (listen(socketServer,1) <0 ){
  392.         printf("ERROR LISTEN");
  393.         exit(1);
  394.     }
  395.    
  396.     //printf("IP: %d\n",inet_ntoa(server_addr.sin_addr));
  397.     unsigned char value[2] = {0};
  398.     //Formateo el puerto para el envio al server
  399.     div_t puerto = div(numeroPuerto, 256);
  400.     value[0] = (unsigned char) puerto.quot;
  401.     value[1] = (unsigned char) puerto.rem;
  402.  
  403.     printf("%d \n",value[0]);
  404.     printf("%d \n",value[1]);
  405.  
  406.     //Armo el comando para enviar
  407.      memset(server_reply, '\0', BUFSIZ*sizeof(char));
  408.      memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char));
  409.      snprintf(mensaje_cliente, sizeof mensaje_cliente, "PORT 192,168,83,128,%d,%d\n",value[0],value[1]);
  410.  
  411.  
  412.    //Envio un mensaje al servidor para que empiece la conexion
  413.  
  414.     printf("Enviando mensaje: %s\n",mensaje_cliente);
  415.     if(send(socketControl, mensaje_cliente, BUFSIZ * sizeof(char), 0) < 0){
  416.         printf("ERROR SEND");
  417.     }
  418.  
  419.     //Veo que contesto el servidor, 200 --> OK
  420.  
  421.     if( recv(socketControl , server_reply , BUFSIZ * sizeof(char) , 0) < 0)
  422.         printf("\nError al recibir respuesta del servidor.");
  423.  
  424.     printf("Recibi: %s\n",server_reply);
  425.  
  426.     if(strncmp(server_reply, "200", 3) != 0){
  427.         printf("Error PORT");
  428.         exit(1);
  429.     }
  430.  
  431.     //Acepto conexion del cliente
  432.     struct sockaddr_in cli_addr;
  433.     printf("Esperando accept \n");
  434.      bzero((char *) & cli_addr, sizeof(cli_addr));
  435.     socklen_t cli_len = sizeof(cli_addr);
  436.     nuevoSocket = accept(socketServer, (struct sockaddr *)&cli_addr, &cli_len);
  437.     if(nuevoSocket < 0){
  438.         printf("ERROR ACCEPT");
  439.         exit(1);
  440.     }
  441.  
  442.     printf("Aceptado\n");
  443.     return nuevoSocket;
  444. }
  445.  
  446. int socketPasivo(){
  447.     memset(server_reply, '\0', BUFSIZ*sizeof(char));
  448.     send(socketControl, "PASV\n", 5, 0);
  449.  
  450.     if( recv(socketControl , server_reply , sizeof(server_reply) , 0) < 0)
  451.         printf("\nError al recibir respuesta del servidor.");
  452.     printf("respuesta -> %s \n", server_reply);
  453.     if (strncmp(server_reply, "227", 3) == 0){
  454.         /* Obtengo el numero de puerto */
  455.         int contador = 0;
  456.         int p1, p2;
  457.         int puerto;
  458.         char * aux;
  459.         aux = strtok (server_reply,",");
  460.         /*
  461.             227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
  462.         */
  463.         while (aux != NULL)
  464.         {
  465.             contador ++;
  466.             if (contador == 5){
  467.                 p1 = atoi(aux);
  468.             }
  469.             if (contador == 6){
  470.                 p2 = atoi(aux);
  471.             }
  472.             aux = strtok (NULL, ",)");
  473.         }
  474.         puerto = p1 *256 + p2;
  475.         struct sockaddr_in addr;
  476.         char ip[100];
  477.         strcpy(ip, inet_ntoa(server.sin_addr));
  478.         printf("ip: %s\n",ip);
  479.         int devolverSocketControl;
  480.         //Creacion del socket
  481.         if ((devolverSocketControl = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  482.             printf("\nError al crear socket..");
  483.             exit(1);
  484.         }
  485.         printf("\nSocket creado correctamente");
  486.         bzero(&addr,sizeof(addr));
  487.         inet_aton(ip, &addr.sin_addr);      //Setea el IP del servidor
  488.         addr.sin_family = AF_INET;                     //PROTOCOLO DE LA FAMILIA
  489.         addr.sin_port = htons(puerto);        //PUERTO DEL SERVIDOR
  490.         if (connect(devolverSocketControl, (struct sockaddr *)&addr , sizeof(addr)) < 0){
  491.             perror("\nError en la conexion, servidor no disponible. Intente nuevamente ");
  492.             exit(1);
  493.         }
  494.         return devolverSocketControl;
  495.     }
  496.     else{
  497.         printf("Error 227");
  498.         exit(1);
  499.     }
  500. }
  501.  
  502. /*Recibe archivo pasado por parametro desde el servidor
  503.  * file_name : nombre del archivo a ser transmitido
  504.  * */
  505. void recv_file(char* file_name){
  506.      int sock = socketPasivo();
  507.      char send_str [256]; /* mensaje del servidor*/
  508.      int f; /* manejador de archivo para archivos recibidos*/
  509.      ssize_t sent_bytes, rcvd_bytes, rcvd_file_size;
  510.      int recv_count; /* contador de llamadas recv() */
  511.      char recv_str[256]; /* buffer de almacenamiento para datos recibidos */
  512.      size_t send_strlen; /* largo del mensaje transmitido */
  513.      memset(send_str, '\0', 256 * sizeof(char));
  514.      strcat(send_str,"RETR ");
  515.      strcat(send_str, file_name);
  516.      strcat(send_str, "\n");
  517.  
  518.      send_strlen = strlen(send_str); /* largo del mensajea ser transmitido*/
  519.      if( (sent_bytes = send(socketControl, send_str, send_strlen, 0)) < 0 ) {
  520.         perror("send error");
  521.      }
  522.      /* intenta crear un archivo para los datos recibis. 0644 = rw-r--r-- */
  523.      if ( (f = open(file_name, O_WRONLY|O_CREAT, 0644)) < 0 ){
  524.          perror("error creating file");
  525.      }
  526.  
  527.      recv_count = 0; /* numero de llamadas recv() requeridas para recibir el archivo */
  528.      rcvd_file_size = 0; /* largo del archivo recibido */
  529.  
  530.      /*recibe el archivo*/
  531.      while ( (rcvd_bytes = recv(sock, recv_str, 256, 0)) > 0 )
  532.      {
  533.          recv_count++;
  534.          rcvd_file_size += rcvd_bytes;
  535.  
  536.          if (write(f, recv_str, rcvd_bytes) < 0 )
  537.          {
  538.             perror("error writing to file");
  539.          }
  540.      }
  541.      close(f); /* cierra archivo */
  542.      printf("Client Received: %d bytes in %d recv(s)\n", rcvd_file_size,recv_count);
  543.  
  544. }
  545.  
  546.  
  547.  
  548. /*PUT<nombre archivo>
  549.  * Transfiere archivo pasado por parametro al servidor
  550.  * file_name : archivo que se desea tranmitir
  551.  */
  552. void  sendfile(char * file_name){
  553.     int socket = socketPasivo();
  554.     /* abre el archivo que se dea transferir */
  555.     FILE *fp = fopen(file_name,"rb");
  556.     if(fp==NULL)
  557.     {
  558.         printf("File opern error");
  559.  
  560.     }
  561.     memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char) );
  562.     strcat(mensaje_cliente, "STOR ");
  563.     strcat(mensaje_cliente, file_name);
  564.     strcat(mensaje_cliente, "\n");
  565.     send(socketControl, mensaje_cliente, BUFSIZ * sizeof(char), 0);
  566.  
  567.     /* Lee los datos del archivo y los transfiere */
  568.     while(1)
  569.     {
  570.         /* primero lee el archivo en trozos de 256 bytes */
  571.         unsigned char buff[256]={0};
  572.         int nread = fread(buff,1,256,fp);
  573.         printf("Bytes read %d \n", nread);
  574.  
  575.         /* Si se lee completo, envia datos */
  576.         if(nread > 0)
  577.         {
  578.             printf("Sending \n");
  579.             write(socket, buff, nread);
  580.         }
  581.  
  582.         /* hubo un error o llegamos a fin de archivo */
  583.         if (nread < 256)
  584.         {
  585.             if (feof(fp))
  586.                 printf("End of file\n");
  587.             if (ferror(fp))
  588.                 printf("Error reading\n");
  589.             break;
  590.         }
  591.  
  592.  
  593.     }
  594.     close(socket);
  595. }
  596. /*cd cambia el directorio actual remoto
  597.  * parametros : nombre del direcctorio al que se desea entrar
  598.  */
  599. void cd (char * parametros){
  600.              //Se arma mensaje para enviar al servidor
  601.             memset(server_reply, '\0', BUFSIZ*sizeof(char));
  602.             memset(mensaje_cliente, '\0', BUFSIZ*sizeof(char));
  603.             strcat(mensaje_cliente, "CWD ");
  604.             strcat(mensaje_cliente, parametros);
  605.             strcat(mensaje_cliente, "\n");
  606.  
  607.             //Se envia mensaje al servidor
  608.             if( send(socketControl, mensaje_cliente, strlen(mensaje_cliente), 0) < 0 ){
  609.  
  610.                 perror("send");
  611.                 exit(2);
  612.             }
  613. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement