Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Oscar34

#1
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 :)
#2
Programación C/C++ / problemas con argc
17 Octubre 2012, 17:15 PM
Buenas tardes, estoy creando un programa cliente de flujos y tengo un problema..
he conseguido crear el servidor que permanece escuchando clientes, pero a la hora de la conexion de estos... me da problemas en:

int main (int argc, char *argv[]){

   int fd;
   struct sockaddr_in server;

   if(argc!=2){
       printf("Uso: %s <Direccion IP>\n", argv[0]);
       exit(-1);
    }
  printf("entra\n");

....   al compilarlo no me da errores, pero al ejecutarlo me pone directamente  <Direccion IP> y despues no imprime "entra"

supongo que si el servidor queda a la espera, el error es en el paso de esos dos argumentos (argc!=2) .. pero no entiendo porque escribe solo eso y no el "Uso..."
¿tiene algo que ver que este en una maquina virtual?
gracias
       
#3
Programación C/C++ / problemas con inet_ntoa()
17 Octubre 2012, 13:23 PM
Hola y perdonar si las dudas que planteo son un poco absurdas, pero estoy empezando con esto... asi que pido paciencia  :-[

He realizado un servidor simple para aceptar clientes.. y me da un error en la linea de: ip=inet_ntoa(...)

"la asignacion crea un puntero desde un entero sin una conversion[activado por defecto]"..

¿ como obtengo entonces la direccion de los clientes que se conectan?.. Os dejo el codigo
...

struct sockaddr_in client;
char *ip;
...
for( ;; ){
clilen=sizeof(struct sockaddr_in);
if((fd2=accept(fd,/struct sockadd*)&client,&clilen))<0){
perror("error en accept\n");
exit(-1);
}
ip=inet_ntoa(client.sin_addr); /*... ¿aqui no me tendria que dar un string de numeros y puntos?*/
printf("El cliente es %s\n",ip);

He leido ya los post referentes a esta funcion... pero sigo igual, gracias de antemano.  ;D