Post by aioritosOye Óscar, no es por ser un pesado ni nada, porque seguro que tendrás
trabajo y essas cosas, pero podrás darme una respuesta para el Lunes?
porque de 4 o 5 foros en los que he pedido ayuda tu eres la unica
esperanza....
Marchando una de prueba de FTP (vaya mañanita :):
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <stropts.h>
//typedef unsigned short ushort;
//typedef unsigned int uint;
int conectar (char *servidor, ushort puerto) {
int sock, errorlevel;
struct hostent *host;
struct sockaddr_in nombre;
fprintf(stderr, "Conectando a %s (puerto %u)\n", servidor,
(uint)puerto);
host = gethostbyname(servidor);
if (host == NULL) {
fprintf(stderr, "Error: No se puede resolver %s.\n",
servidor);
return -1;
} else {
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1) {
fprintf(stderr, "Error: No pude crear el
socket.\n");
return -1;
} else {
nombre.sin_family = host->h_addrtype;
nombre.sin_port = htons(puerto);
memcpy((char *) &nombre.sin_addr.s_addr,
host->h_addr_list[0], host->h_length);
errorlevel = connect(sock, (struct sockaddr *)
&nombre, sizeof(nombre));
if (errorlevel == -1) {
fprintf(stderr, "Error al conectar al
servidor.\n");
close(sock);
return -1;
} else {
fprintf(stderr, "Conexion a %s
abierta.\n", host->h_name);
}
}
}
return sock;
}
int obtener_respuesta (int sock, char *buffer, int lon) {
char codigo[4] = "\0\0\0";
int errorlevel;
// ¡¡Cuidadito que no compruebo si devuelve un error!!
errorlevel = recv(sock, buffer, lon, 0);
strncpy(codigo, buffer, 3);
// ¡¡Cuidadin que no se comprueba el límite del buffer!!
while (ioctl(sock, I_PEEK) == 1) {
errorlevel += recv(sock, buffer + errorlevel, lon, 0);
}
*(buffer + errorlevel) = 0;
return atoi(codigo);
}
int enviar(char *mensaje, int sock) {
send(sock, mensaje, strlen(mensaje), 0);
}
void obtener_enteros (char *cadena, int *enteros) {
char temporal, *inicio = cadena, *fin, estado = 0, pos = 0;
while (*inicio) {
switch (estado) {
case 0:
if ((*inicio) >= '0' && (*inicio) <= '9') {
estado = 1;
fin = inicio;
} else {
inicio++;
}
break;
case 1:
if ((*fin) < '0' || (*fin) > '9') {
estado = 0;
temporal = *fin;
*fin = 0;
*(enteros++) = atoi(inicio);
*fin = temporal;
inicio = fin;
} else {
fin++;
}
break;
}
}
}
int main (void) {
int sock, pasivo, respuesta;
char buffer[32000];
char host[128];
int datos[7];
sock = conectar("servidor", 21);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
enviar("USER usuario\r\n", sock);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
enviar("PASS clave\r\n", sock);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
enviar("PASV\r\n", sock);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
obtener_enteros(buffer, (int*)&datos);
printf("Datos (%d - %d,%d,%d,%d,%d,%d)\n",
datos[0], datos[1], datos[2], datos[3],
datos[4], datos[5], datos[6]);
sprintf(host, "%d.%d.%d.%d", datos[1], datos[2], datos[3],
datos[4]);
pasivo = conectar(host, (datos[5]<<8) + datos[6]);
enviar("LIST\r\n", sock);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
while ((respuesta = recv(pasivo, buffer, 32000, 0)) > 0) {
*(buffer + respuesta) = 0;
printf("%s", buffer);
}
close(pasivo);
puts("Conexion pasiva cerrada");
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
enviar("QUIT\r\n", sock);
respuesta = obtener_respuesta(sock, buffer, sizeof(buffer));
printf("Respuesta %d - %s", respuesta, buffer);
close(sock);
return 0;
}
Ale, ¡que sea de provecho!.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/