SoloCodigo

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: fabet en Martes 23 de Diciembre de 2003, 10:12

Título: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: fabet en Martes 23 de Diciembre de 2003, 10:12
HOLA A TODOS.

LE PIDO DE SU AYUDA PORQUE SINCERAMENTE NO TENGO MUCHA EXPERIENCIA CON LINUX, Y NECESITO DESARROLLAR UNA APLICACIÓN TIPO CLIENTE-SERVIDOR A EJECUTARSE EN DOS MÁQUINAS LINUX, DICHA APLICACIÓN DEBE DE PERMITIR AL PROGRAMA CLIENTE CONECTARSE AL PROGRAMA SERVIDOR Y PEDIRLE EL TIPO DE S.O. Y VERSIÓN QUE ESTA CORRIENDO, ASI COMO LOS PROCESOSO QUE SE ESTAN EJECUTANDO.

HE BUSCADO INFORMACIÓN Y LO QUE HE ENCONTRADO HASTA EL MOMENTO ES MEDIANTE LA PROGRAMACIÓN CON SOCKETS, SIN EMBARGO NO SE COMO IMPLEMENTARLO PARA LOGRAR QUE MANDE LA INFORMACIÓN NECESARIA AL CLIENTE, (COMO SI ESTUVIERA EJECUTANDO EL CLIENTE EL COMANDO PS EN LA MÁQUINA DEL SERVIDOR Y A LA VEZ VISUALIZANDOLO.)

LES AGRADECERÍA DE ANTEMANO SU AYUDA O ALGUNA SUGERENCIA QUE ME PUDIERA SERVIR PARA LA RESOLUCIÓN A ESTE PROBLEMA.

DE VERDAD, GRACIAS POR SU ATENCIÓN Y RECIBAN UN AFECTUOSO SALUDO.
Título: Re: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: Martin Candurra en Martes 23 de Diciembre de 2003, 19:05
Leyendo la Guia Beej (http://www.ecst.csuchico.edu/~beej/guide/net/) no vas a tener problemas en implementar una aplicacion cliente servidor.
Respecto a los procesos, podes levantarlos con el comando ps con el modificador que gustes, y redireccionar la salida standar del servidor hacia el socket.
Es bastante simple, es cuestion de que te sientes a hacerlo.

Saludos.
Título: Re: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: sicorix en Miércoles 24 de Diciembre de 2003, 02:35
¡La famosa Guia Beej!
Creo que es uno de los mejores manuales que corren por Internet, sin duda.
Título: Re: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: xanatos en Jueves 1 de Enero de 2004, 19:28
orale  esa no la conocia dejen leer :D
Título: Re: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: fabet en Sábado 3 de Enero de 2004, 01:11
Hola:

Gracias por su ayuda, he leído la Guía Beej y ya logré hacer el programa cliente y el servidor, sin embargo no he podido redireccionar la salida standar del servidor hacia el socket, como lo planteaba Martin.

Les agradecería nuevamente su ayuda, les mando el código de los dos programas, para ver si pueden ayudarme viendo como puedo lograr el redireccionamiento, por  favor.

Este es el código del servidor:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int puerto=8000;

void main()
{
   struct sockaddr_in sin;
   struct sockaddr_in pin;
   int my_socket;
   int temp_my_socket;
   int tam_direccion;
   char buf[16384];
   int i,len;

   my_socket=socket(AF_INET,SOCK_STREAM,0);
   if (my_socket==-1)
   {
      perror("Lamada a socket");
      exit(1);
   }
   
   bzero(&sin,sizeof(sin));
   sin.sin_family=AF_INET;
   sin.sin_addr.s_addr=INADDR_ANY;
   sin.sin_port=htons(puerto); // ordenacion de la red

   if (bind(my_socket,(struct sockaddr *)&sin,sizeof(sin))==-1)
   {
      perror("Llamada para unir\n");
      exit(1);
   }
   
   if (listen(my_socket,20)==-1)
   {
      perror("Llamada para escuhar\n\n");
      exit(1);
   }
   
   printf("Aceptando conexiones ...\n\n");
   
   while(1)
   {
      temp_my_socket=accept(my_socket,(struct sockaddr *)&pin,&tam_direccion);
      if(temp_my_socket==-1)
      {
         perror("Llamada para aceptar");
         exit(1);
      }
      
      if(recv(temp_my_socket,buf,16384,0)==-1)
      {
         perror("Llamada para recibir\n");
         exit(1);
      }


      printf("Recibido del cliente numero de peticion:%s\n\n",buf);
         if (buf[0]=='1')
         {

            if (send(temp_my_socket,system("uname -a"),sizeof(system("uname -a")),0)==-1)
            {
               perror("Llamada para enviar");
               exit(1);
            }
            //close(my_socket);
         }

         else if (buf[0]=='2')
         {
            if(send(temp_my_socket,system("ps aux"),sizeof(system("ps aux")),0)==-1)
            {
               perror("Llamada para enviar \n\n");
               exit(1);
            }
            //close(my_socket);
         }

         else
         {
         close(my_socket);
         }



   }
}



Otra vez, les agradezco de antemano su atención.

Feliz año 2004.
Título: Re: Ayuda Con Un Programa Cliente-servidor!!
Publicado por: Martin Candurra en Lunes 5 de Enero de 2004, 14:09
Citar
if (send(temp_my_socket,system("uname -a"),sizeof(system("uname -a")),0)==-1)

No es exactamente a esto a lo que me refería  ;)
Lo que tenés que hacer es cerrar el descriptor SDTOUT_FILENO (con una llamada a close) y después mediante la llamada al sistema dup, duplicar el descriptor del socket.