Hola a todos,
Estoy intentando realizar un servidor SFTP de archivos mediante sockets y tunneling SSH... el tema es que al conectar el cliente con el servidor me da un problema en la conexion... a la hora de hacer el connect, y no se si es debido a algún problema con la forma de establecer el túnel, hacíendolo por labit301.. (una pagina de la universidad...)
Os dejo parte del código cliente y los pantallazos que me da...
El servidor únicamente queda a la escucha, pero nunca llega el cliente...
Si me podéis echar un cable, al menos para que tenga una idea de que puede fallar... muchas gracias.
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include<netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
//#include<strings.h>
#include <fcntl.h>
#include<getopt.h>
#define PUERTO 4000
#define MAX 1024
int main(int argc, char*argv[]){
// Declaracion de variables
int sockC,conexionSFTP;
struct sockaddr_in serveraddr;
char buffer[MAX];
int opcion,get,put,i;
char *modo=NULL;
char *fichero_remoto=NULL;
char *direccionIPsv=NULL;
char *fichero_local=NULL;
char cierre[22];
FILE *archivo;
pid_t hijo;
//Creamos el socket del cliente
bzero(&serveraddr,sizeof(serveraddr));
sockC=socket(AF_INET,SOCK_STREAM,0);
if(sockC<0){
printf("Error en la creacion del socket cliente.\n");
exit(-1);
}
else{
printf("Socket cliente creado.\n");
}
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(PUERTO);
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(buffer,sizeof(buffer));
printf("ENTRA_1\n");
//Una vez crado el socket, recogemos los parametros de entrada de la linea de caracteres
while(1){
if((opcion=getopt(argc,argv,"m:r:h:l:"))==-1)
break;
printf("ENTRA_2\n");
switch(opcion){
case 'm':
modo=optarg;
break;
case 'r':
fichero_remoto=optarg;
break;
case 'h':
direccionIPsv=optarg;
break;
case 'l':
fichero_local=optarg;
break;
case '?':
printf("Uno de los valores introducidos no es correcto.\n");
printf("Recuerde: \n"
"\n"
"-m modo get o put\n"
"-r fichero remoto\n"
"-h direccion IP del servidor\n"
"-l fichero local\n"
"\n");
break;
}//swtich
} //while
if(optind<argc){
printf("elementos de qrgv que no son opciones.\n");
while(optind<argc)
printf("%s",argv[optind++]);
printf("\n");
}
//Creamos el proceso hijo para ejecutar el SSH
if((hijo=fork())==0){
printf("ENTRA_3\n");
execl("/usr/bin/ssh","ssh","-L","4000:labit301.upct.es:3000",direccionIPsv,"-f","sleep","15",NULL);
exit(-1);
}
printf("ENTRA_4\n");
//esperamos para introduciir el password ssh
sleep(10);
printf("1\n");
//Conectamos con el servidor SFTP
conexionSFTP=connect(sockC,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if(conexionSFTP<0){
printf("Error al establecer la conexion con el servidor.\n");
exit(-1);
}
write(sockC,modo,MAX);
printf("3\n");
//Comprobamos si la accion introducida por el usuario es un GET o un PUT
if((get=strcmp(modo,"get"))==0){
write(sockC,fichero_remoto,MAX);
while((read(sockC,buffer,MAX))!=0){ //para ver si el servidor nos envia el cierre...
for(i=0;1<22;i++){
cierre=buffer;
}
if((strcmp(cierre,"fin_de_la_transmision"))==0)
break;
else{
archivo=fopen(fichero_local,"a+");
fprintf(archivo, "%s\n",buffer);
fclose(archivo);
}
}
}
//Si por el contrario es un PUT
if((put=strcmp(modo,"put"))==0){
write(sockC,fichero_remoto,MAX);
archivo=fopen(fichero_local,"r");
if(archivo==NULL){
printf("No se ha podido encontrar el fichero local de nombre: %s\n",fichero_local);
write(sockC,"No existe ese fichero que ha solicitado.\n",MAX);
}
else{
while((fscanf(archivo,"%s",buffer))!=EOF){
write(sockC,buffer,MAX);
}
}
fclose(archivo);
}
close(sockC);
}
y al ejecutar el cliente:
oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS$ ./client -m put -r prueba.txt -h lsc30@labit301.upct.es -l prueba1.txt
Socket cliente creado.
ENTRA_1
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_4
ENTRA_3
1
Error al establecer la conexion con el servidor.
oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS$ ssh: connect to host labit301.upct.es port 22: Connection timed out
..
Disculpar si no es la forma mas adecuada de preguntar... pero estoy empezando..
MUCHAS GRACIAS de antemano