mostrar en cliente el resultado de execvp de servidor

Iniciado por tojo2ska8, 20 Marzo 2018, 18:34 PM

0 Miembros y 1 Visitante están viendo este tema.

tojo2ska8

tengo este codigo estandard de ejemplo no es el coidgo en si:
este codigo esta en el servidor y funciona bien con telnet
Código (cpp) [Seleccionar]
if(!fork())
{
    dup2(sockClie,0);//stdin
    dup2(sockclie,1);//stdout
    close(sockClie);
  fgets(arg,sizeof arg,stdin);
    execvp(arg,arg);
}

el problema q tengo es que no me funciona en mi programa cliente q hago una conecion normal con el connect(sd,....); por ejemplo cuando ejecuto telnet ip puerto me hace peticion del comando y luego muestra el resultado en la pantalla de telnet .. quiero q mi clilene haga lo mismo pero nada porfa  agradezco de antemano su ayuda gracias

MAFUS

Si muestras tu código podríamos ver donde falla. A lo mejor no es allí y es en otro sitio.

tojo2ska8

#2
Código (cpp) [Seleccionar]
while(1)
{
tam_cliente=sizeof cliente;
sock_cliente=accept(sock_servidor,(struct sockaddr *)&cliente,&tam_cliente);
if(sock_cliente<0)
{
perror("acceptando cliente");
return -1;
}

ip_cliente=inet_ntoa(cliente.sin_addr);
puerto_cliente=ntohs(cliente.sin_port);
printf("cliente conectado:%s:%d\n",ip_cliente,puerto_cliente);
memset(mensaje_cliente,0,sizeof mensaje_cliente);
//read(sock_cliente,&mensaje_cliente,sizeof mensaje_cliente);
//printf("mensaje cliente:%s\n",mensaje_cliente);
if(!fork())
{
printf("inicio fork\n");
close(sock_servidor);
dup2(sock_cliente,0);
dup2(sock_cliente,1);
close(sock_cliente);
printf("introduzca comando:\n");
fgets(mensaje_cliente,20,stdin);
printf("mensaje_cliente=\n%s",mensaje_cliente);
char *com[]={"ls","-l",NULL};
                       execvp(com[0],com);
exit(1);
}
close(sock_cliente);
}

me funciona con telnet pero no con mi programa cliente que tengo creado en c que tiene las funciones basicas de conectar con servidor





Código (cpp) [Seleccionar]
int main()
{
   struct sockaddr_in cli;
   struct sockaddr_in serv;
   int s_cliente,s_servidor;

   s_cliente=socket(PF_INET,SOCK_STREAM,0);
   if (s_cliente<0)
   {
      perror("socket");
      return -1;
   }

   cli.sin_family=AF_INET;
   cli.sin_port=htons(0);
   cli.sin_addr.s_addr=htonl(INADDR_ANY);
   if(bind(s_cliente,(struct sockaddr *)&cli,sizeof cli)<0)
   {
      perror("bind");
      return -1;
   }

   serv.sin_family=AF_INET;
   serv.sin_port=htons(PUERTO);
   serv.sin_addr.s_addr=inet_addr("127.0.0.1");

   if(connect(s_cliente,(struct sockaddr *)&serv,sizeof serv)<0)
   {
      perror("connectando");
      return -1;
   }
   char cadena[30];
   //printf("introduzca el comando:\n");
   //scanf("%[^\n]",cadena);
   //fflush(stdin);
   //send(s_cliente,cadena,sizeof cadena,0);
   recv(s_cliente,cadena,sizeof cadena,0);
   close(s_cliente);
   return 0;
}



este es el programa cliente





· Los códigos deben ir en etiquetas GeSHi
· No se debe publicar 2 veces seguidas, usar el boton modificar
>aquí las reglas del foro
-Engel Lex

MAFUS

#3
Supongo que no lo sabes, pero deberías encerrar el código entre etiquetas GeSHi. Edita tus mensajes, ve al desplegable 'Código GeSHi' que tienes en las herramientas de edición, arriba de la respuesta, elige el lenguaje que vas a usar en tus ejemplos y aparecerán unas etiquetas tal que así [etiqueta][/etiqueta]. Mete en medio de ellas tu código. Tal que así:
[etiqueta]TU_CODIGO[/etiqueta].

Por otra parte, pon el código completo, porqué tener que andar haciendo parches para hacerlo ejecutable como que da pereza. Y paso. Y creo que el resto de la gente piensa igual.

tojo2ska8


tojo2ska8

servidor:

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<netdb.h>
#include<string.h>
#include<arpa/inet.h>
#include<signal.h>
#define PUERTO 7777

int main()
{
struct sockaddr_in servidor;
struct sockaddr_in cliente;
int sock_servidor,sock_cliente;

if((sock_servidor=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return -1;
}
servidor.sin_family=AF_INET;
servidor.sin_port=htons(PUERTO);
servidor.sin_addr.s_addr=INADDR_ANY;

if((bind(sock_servidor,(struct sockaddr *)&servidor,sizeof servidor))<0)
{
perror("bind");
return -1;
}

if(listen(sock_servidor,20)<0)
{
perror("listen");
return -1;
}
int tam_cliente;
char* ip_cliente;
int puerto_cliente;
char mensaje_cliente[20];
signal(SIGCHLD,SIG_IGN);
while(1)
{
tam_cliente=sizeof cliente;
sock_cliente=accept(sock_servidor,(struct sockaddr *)&cliente,&tam_cliente);
if(sock_cliente<0)
{
perror("acceptando cliente");
return -1;
}

ip_cliente=inet_ntoa(cliente.sin_addr);
puerto_cliente=ntohs(cliente.sin_port);
printf("cliente conectado:%s:%d\n",ip_cliente,puerto_cliente);
memset(mensaje_cliente,0,sizeof mensaje_cliente);
//read(sock_cliente,&mensaje_cliente,sizeof mensaje_cliente);
//printf("mensaje cliente:%s\n",mensaje_cliente);
if(!fork())
{
printf("inicio fork\n");
close(sock_servidor);
dup2(sock_cliente,0);
dup2(sock_cliente,1);
close(sock_cliente);
printf("introduzca comando:\n");
fgets(mensaje_cliente,20,stdin);
printf("mensaje_cliente=\n%s",mensaje_cliente);
char *com[]={"ls","-l",NULL};
                        execvp(com[0],com);
exit(1);
}
close(sock_cliente);
}
return 0;
}


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

#define PUERTO 7777
int main()
{
struct sockaddr_in cli;
struct sockaddr_in serv;
int s_cliente,s_servidor;

s_cliente=socket(PF_INET,SOCK_STREAM,0);
if (s_cliente<0)
{
perror("socket");
return -1;
}

cli.sin_family=AF_INET;
cli.sin_port=htons(0);
cli.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(s_cliente,(struct sockaddr *)&cli,sizeof cli)<0)
{
perror("bind");
return -1;
}

serv.sin_family=AF_INET;
serv.sin_port=htons(PUERTO);
serv.sin_addr.s_addr=inet_addr("127.0.0.1");

if(connect(s_cliente,(struct sockaddr *)&serv,sizeof serv)<0)
{
perror("connectando");
return -1;
}
char cadena[30];
//printf("introduzca el comando:\n");
//scanf("%[^\n]",cadena);
//fflush(stdin);
//send(s_cliente,cadena,sizeof cadena,0);
recv(s_cliente,cadena,sizeof cadena,0);
close(s_cliente);
return 0;
}

MAFUS

Ahora falta que una alma caritativa bajo *nix corra tu programa. Desde hace tiempo estoy trabajando con Windows. Equipo nuevo con garantía  :silbar:

tojo2ska8

Jajjajajjajaj pero igual lo puedes migrar a windows es fácil , en windows trabajo con qt creator

MAFUS

#8
Intenta convertir los datos recibidos en una cadena y mostrarla en pantalla. Es lo que falta en cliente.

No lo he probado, es intuición.

tojo2ska8

probé con explorador de internet firefox http://direccionip:7777 y me funciona bien sin necesidad de convertir a srting execvp de igual manera me funciona con netcat nc direccionip 7777 y funciona bien me muestra el resultado en la pantalla de nc , con telnet igual funciona .. pero mi programa cliente no se como controlar o q lineas de codigo me faltan me siento bloqueado :(