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