C/Visual C - Servidor de FTP

 
Vista:

Servidor de FTP

Publicado por Javi (18 intervenciones) el 11/11/2001 09:20:10
Hola :)

Estoy intentando hacer un servidor de FTP cutre (vamos q solo acepter el comando de recibir fichero) y no se como meterle mano, si alguien sabe algo, se lo agradeciria. Uso el Visual C++

Gracias de antemano, Javi
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Implementación básica de un servidor FTP en C++

Publicado por Alejandro (913 intervenciones) el 22/10/2024 20:12:57
¡Hola Javi! Crear un servidor FTP básico que solo acepte el comando para recibir archivos es un buen proyecto para practicar. A continuación, te proporcionaré un ejemplo simple de cómo podrías implementar un servidor FTP en C++ utilizando sockets.

Ejemplo de servidor FTP básico



Este ejemplo implementa un servidor que escucha en un puerto específico y acepta conexiones. Cuando recibe el comando `RECEIVE`, guarda el archivo enviado por el cliente.

Código del servidor



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <winsock2.h>
#include <fstream>
 
#pragma comment(lib, "ws2_32.lib")
 
#define PORT 21
#define BUFFER_SIZE 1024
 
int main() {
    WSADATA wsaData;
    SOCKET serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    int addrLen = sizeof(clientAddr);
    char buffer[BUFFER_SIZE];
 
    // Inicializar Winsock
    WSAStartup(MAKEWORD(2, 2), &wsaData);
 
    // Crear socket
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);
 
    // Vincular el socket
    bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    listen(serverSocket, 3);
 
    std::cout << "Servidor FTP escuchando en el puerto " << PORT << "...\n";
 
    while (1) {
        // Aceptar conexión del cliente
        clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &addrLen);
        std::cout << "Cliente conectado.\n";
 
        // Enviar mensaje de bienvenida
        const char* welcomeMessage = "220 Bienvenido al servidor FTP\r\n";
        send(clientSocket, welcomeMessage, strlen(welcomeMessage), 0);
 
        // Recibir comandos
        while (true) {
            memset(buffer, 0, BUFFER_SIZE);
            int bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0);
            if (bytesReceived <= 0) {
                break; // Salir si hay un error o el cliente se desconecta
            }
 
            std::cout << "Comando recibido: " << buffer;
 
            // Procesar el comando
            if (strncmp(buffer, "RECEIVE", 8) == 0) {
                // Recibir el nombre del archivo
                char filename[256];
                sscanf(buffer + 9, "%s", filename);
                std::ofstream outFile(filename, std::ios::binary);
 
                // Recibir el archivo
                std::cout << "Recibiendo archivo: " << filename << "\n";
                while ((bytesReceived = recv(clientSocket, buffer, BUFFER_SIZE, 0)) > 0) {
                    outFile.write(buffer, bytesReceived);
                }
                outFile.close();
                std::cout << "Archivo recibido exitosamente.\n";
            } else {
                const char* unknownCommand = "500 Comando desconocido\r\n";
                send(clientSocket, unknownCommand, strlen(unknownCommand), 0);
            }
        }
 
        // Cerrar conexión con el cliente
        closesocket(clientSocket);
    }
 
    // Cerrar el socket del servidor
    closesocket(serverSocket);
    WSACleanup();
    return 0;
}

Explicación del código



1. Inicialización de Winsock: Se inicializa la biblioteca Winsock para permitir la comunicación de red.

2. Creación y vinculación del socket: Se crea un socket y se vincula a un puerto específico (en este caso, el puerto 21, que es el puerto estándar para FTP).

3. Escuchar conexiones: El servidor escucha conexiones entrantes.

4. Aceptar conexiones: Cuando un cliente se conecta, se envía un mensaje de bienvenida.

5. Recibir comandos: El servidor espera comandos del cliente. Si recibe el comando `RECEIVE`, espera el nombre del archivo y luego recibe el contenido del archivo.

6. Guardar el archivo: El contenido recibido se guarda en un archivo con el nombre proporcionado.

7. Manejo de comandos desconocidos: Si se recibe un comando desconocido, se envía un mensaje de error.

Consideraciones



- Seguridad: Este es un ejemplo muy básico y no incluye medidas de seguridad. En un entorno de producción, deberías considerar la autenticación y la encriptación.
- Manejo de errores: Este código no maneja todos los posibles errores. Deberías agregar manejo de errores para una implementación más robusta.
- Pruebas: Puedes probar este servidor con un cliente FTP simple que envíe el comando `RECEIVE` seguido del nombre del archivo.

¡Buena suerte con tu proyecto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar