Gente, les cuanto el problema. Estoy construyendo un server ftp para la facu y me quede trabado en el pasv. Que es el PASV para quien no sabe y quiere ayudar. El pasv es un comando que manda el cliente cuando va a hacer un get o put. Lo que hace el comando es:
El cliente manda el PASV
El servidor lo interpreta y le manda la IP y el puerto a donde el cliente se debe conectar
El cliente hace un connect con esa Ip y Puerto que le mando
El servidor hace un accept
Eso es basicamente lo que hace el pasv
Que es lo que me pasa, yo tengo harcodeado la ip y el puerto para que por ahora no me traiga problemas. El problema se da cuando hago el accept, no se si manda algo el cliente y tampoco se si yo hago bien el accept.
Abajo esta el codigo, debugueando un poco llega hasta printf ("paso el size y es: %d\n", sin_size); y el cliente me tira un mensaje ftp: connect: Connection refused (esto creo que lo hace de mi lado)
Código:
int conectarServidorPasv(int *puerto,char tipo, int sockfd){
struct sockaddr_in my_addr,client_addr;
int clientfd;
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Error creando el socket");
return 1;
}
printf("estoy escuchando por el puerto: %d\n",*puerto);
logg(tipo,1,"Estableciendo parametros de Servidor\n");
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(*puerto);
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(my_addr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {
perror("Error en el bind\n");
return 1;
}
printf ("Paso el Bind\n");
if (listen(sockfd, BACKLOG) == -1) {
perror("Error en el listen\n");
return 1;
}
printf ("Paso el listen\n");
printf ("Imprimo socktfd %d", sockfd);
sin_size = sizeof(client_addr);
printf ("paso el size y es: %d\n", sin_size);
if ((clientfd = accept(sockfd, (struct sockaddr *) &client_addr,&sin_size)) == -1) {printf("NO ACEPTO UNA BOSTA");}
printf ("PASO EL ACCEPT\n");
logg(tipo,1,"Coneccion establecida");
return clientfd;
}