En este capítulo del Tutorial de C++ utilizaremos la librería winsock2.h para ver un ejemplo de conexiones TCP a un servidor local o remoto, concretamente el ejemplo se realizará en un servidor local FTP (File Transfer Control), el servidor FTP Filezilla es ideal para realizar la prueba y lo puedes descargar aquí.
El objetivo es enviar las credenciales de usuario al servidor para conectar y poder enviar comandos FTP a través de la consola.
Los detalles para que el programa funciones correctamente se pueden ver en el vídeo, ya que en dev-C++ es necesario crear un link en el proyecto a la librería libws2_32.a que se encuentra en la carpeta lib de dev-C++ de lo contrario obtendréis un error.
cliente-ftp.cpp
#include <cstdlib> #include <iostream> #include <windows.h> #include <winsock2.h> using namespace std; void client_ftp() { char * host = "localhost"; int port = 21; /* Estructura de datos con información del winsock */ WSADATA wsa; /* Estructura de datos para especificar un servidor local o remoto para conectar un socket */ SOCKADDR_IN server; /* Objeto que permite establecer conexiones locales o remotas e intercambiar datos */ SOCKET sock; /* Inicializar winsock, comprobar versión 2.2 */ if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { cout << "Error: " << WSAGetLastError() << endl; } else { cout << "Inicializando ... " << endl; /* Crear un socket */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { cout << "No se pudo crear el socket: " << WSAGetLastError() << endl; } else /* Se ha creado el socket */ { cout << "Socket creado correctamente ... " << endl; /* Configurar la conexión al servidor */ server.sin_family = PF_INET; server.sin_port = htons(port); server.sin_addr = *((struct in_addr *)gethostbyname(host)->h_addr); memset(server.sin_zero, 0, 8); /* Conectar al servidor */ connect(sock, (LPSOCKADDR)&server, sizeof(struct sockaddr)); Sleep(1000); /* Respuesta del servidor */ char serverMsg[2048]; cout << "Esperando una respuesta del servidor ... " << endl; recv(sock, serverMsg, 2048, 0); serverMsg[0] = '\0'; cout << "Respuesta del servidor: " << serverMsg << endl; //Enviar credenciales USER y PASS char * user = "USER manu\r\n"; int user_send = send(sock, user, strlen(user), 0); cout << "Enviado: " << user << user_send << " bytes" << endl; Sleep(1000); //Esperar respuesta del servidor para enviar el password cout << "Esperando una respuesta del servidor ..." << endl; serverMsg[0] = '\0'; recv(sock, serverMsg, 2048, 0); cout << "Respuesta del servidor: " << serverMsg << endl; //Enviar el password char * pass = "PASS password\r\n"; int pass_send = send(sock, pass, strlen(pass), 0); cout << "Enviado: " << pass << pass_send << " bytes" << endl; Sleep(1000); //Esperar a la respuesta del servidor para enviar comandos cout << "Esperando una respuesta del servidor ..." << endl; serverMsg[0] = '\0'; recv(sock, serverMsg, 2048, 0); cout << "Respuesta del servidor: " << serverMsg << endl; //Enviar comandos cout << "Comando: "; string comando; getline(cin, comando); comando = comando + "\r\n"; int comando_send = send(sock, comando.c_str(), strlen(comando.c_str()), 0); cout << "Enviado: " << comando << comando_send << " bytes" << endl; Sleep(1000); //Esperar una respuesta del servidor cout << "Esperando una respuesta del servidor ... " << endl; serverMsg[0] = '\0'; recv(sock, serverMsg, 2048, 0); cout << "Respuesta del servidor: " << serverMsg << endl; system("PAUSE"); //Cerrar la conexión closesocket(sock); WSACleanup(); //Llamar nuevamente a la función client_ftp(); } } } int main(int argc, char *argv[]) { client_ftp(); system("PAUSE"); return EXIT_SUCCESS; }
No hay comentarios:
Publicar un comentario