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.
#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);
}