Ayuda al programar un servidor FTP

Iniciado por Frijolito, Octubre 19, 2018, 12:13:34 PM

Tema anterior - Siguiente tema

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

Octubre 19, 2018, 12:13:34 PM Ultima modificación: Octubre 19, 2018, 12:55:37 PM por Gabriela
Hola, la cosa es que quería hacer en C un  servidor en el que pudiera descargar o subir archivos desde la terminal de linux o desde un cliente que yo programara  o desde Internet y que apareciera asi "127.0.0.1:8080/archivo". Tambien creo que es importante decir que todo esto esta hecho en Linux . Por Internet encontré programas que hacen ftp servers como FileZilla y que solo necesitas programar el cliente para el servidor, pero lo que quiero hacer es programar el servidor desde 0 para poder entender mas sobre el tema y después programar el cliente y hacer mas cosas con el. Voy a dejar el código del servidor que e programado. De todas formas gracias de antemano.

Código: c

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/sendfile.h>               //Sirve para poder enviar archivos
#include <sys/types.h>                  //Sirve para poder recivir archivos
#include <linux/if_packet.h>
#include <net/if.h>                     // Cliente en cuention
     
#define BUFFSIZE 1
#define ERROR -1
#define BUFFERSIZE 512

// Funciones //
     
int login(int socket_cliente);
void direccip(int socket_cliente, struct sockaddr_in addr);
void salir(int socket_servidor, int socket_cliente);
void enviar(int socket_cliente, FILE* archivo);
int intentos = 0;
     
int main(){

    int socket_servidor;            //Socket del servidor para escuchar mensajes
    int socket_cliente;             //Socket del cliente para enviar mesajes
    int puerto = 8080;                //Numero de puerto en /etc/service
    char BUFFER[BUFFERSIZE];        //Mensaje para usar los comandos

    socket_servidor = socket(AF_INET, SOCK_STREAM, 0);
    socklen_t longc;

   // Declaracion de las escructuras;
    struct sockaddr_in servidor, cliente;                   //Creamos las estructuras del cliente y servidor al mismo tiempo
    bzero((char *)&servidor, sizeof(servidor));             //Primero llenamos de 0's la struct
    servidor.sin_family = AF_INET;                          //Asiganamos la estructura
    servidor.sin_port = htons(puerto);                      //Indicamos el puerto
    servidor.sin_addr.s_addr = INADDR_ANY;                  //Esta macro especifica nuestra direccion
     
    if(bind(socket_servidor, (struct sockaddr *)&servidor, sizeof(servidor)) < 0){ //asignamos un puerto al socket
        printf("Error al asociar el puerto a la conexion\n");
        return 1;
    }
           
    listen(socket_servidor,3);                              //Escuchamos por este puero maximo 2 clientes distintos
    while(free){
        intentos = 0;
        printf("Escuchando en el puerto %d\n", ntohs(servidor.sin_port));
        longc = sizeof(cliente);                                //Asignamos el tamano de la estructura a esta variable
        socket_cliente = accept(socket_servidor, (struct sockaddr *)&cliente, &longc); // Esperamos una conexion
        if(socket_cliente == -1){
            printf("Error en al conexion\n");
         return 1;
        }
        printf("Conectando con %s:%d\n",inet_ntoa(cliente.sin_addr),htons(cliente.sin_port));
     
    //Login con el servidor
        int conexion = login(socket_cliente);
        printf("\n");
        if(conexion == 1){
            while(free){
                bzero(BUFFER, BUFFERSIZE);
                recv(socket_cliente,BUFFER,50,0);
                if(strncmp(BUFFER,"IP",2) == 0){
                    direccip(socket_cliente, cliente);
                }
                if(strncmp(BUFFER,"EXIT", 4) == 0){
                    salir(socket_servidor, socket_cliente);
                }
            }
        }
    }
}

int login(int socket_cliente){
           
    char user[8];
    char pass[8];

    if(intentos == 3){
        close(socket_cliente);
        return 0;
    }

    memset(user,0 , 8);
    memset(pass,0 , 8);
    printf("%i",intentos );
    printf("\n");

     
    send(socket_cliente,"Usuario: ",10,0);
    read(socket_cliente,user,9);
    send(socket_cliente, "Contrasena: ", 12, 0);
    read(socket_cliente, pass, 8);
     
    if(strncmp(user, "root",4) == 0){
        if(strncmp(pass, "root",4) == 0){
            send(socket_cliente,"Bienvenido\n",12,0);
        }else{
            send(socket_cliente,"ERROR\n",7,0);
            intentos = intentos + 1;
            login(socket_cliente);
        }
    }else{
        send(socket_cliente,"ERROR\n",7,0);
        intentos = intentos + 1;
        login(socket_cliente);
    }
}
     
void direccip(int socket_cliente, struct sockaddr_in addr){
    write(socket_cliente, "Tu eres: ",9);
    write(socket_cliente, inet_ntoa(addr.sin_addr), 16);
    write(socket_cliente,"\n",2);
}

void salir(int socket_servidor, int socket_cliente){
    write(socket_cliente, "ADIOS ;)\n", 10);
    close(socket_cliente);
}