Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: tojo2ska8 en 20 Marzo 2018, 18:34 pm



Título: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 20 Marzo 2018, 18:34 pm
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
  1. if(!fork())
  2. {
  3.     dup2(sockClie,0);//stdin
  4.     dup2(sockclie,1);//stdout
  5.     close(sockClie);
  6.   fgets(arg,sizeof arg,stdin);
  7.     execvp(arg,arg);
  8. }
  9.  
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


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: MAFUS en 20 Marzo 2018, 19:04 pm
Si muestras tu código podríamos ver donde falla. A lo mejor no es allí y es en otro sitio.


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 20 Marzo 2018, 19:07 pm
Código
  1. while(1)
  2. {
  3. tam_cliente=sizeof cliente;
  4. sock_cliente=accept(sock_servidor,(struct sockaddr *)&cliente,&tam_cliente);
  5. if(sock_cliente<0)
  6. {
  7. perror("acceptando cliente");
  8. return -1;
  9. }
  10.  
  11. ip_cliente=inet_ntoa(cliente.sin_addr);
  12. puerto_cliente=ntohs(cliente.sin_port);
  13. printf("cliente conectado:%s:%d\n",ip_cliente,puerto_cliente);
  14. memset(mensaje_cliente,0,sizeof mensaje_cliente);
  15. //read(sock_cliente,&mensaje_cliente,sizeof mensaje_cliente);
  16. //printf("mensaje cliente:%s\n",mensaje_cliente);
  17. if(!fork())
  18. {
  19. printf("inicio fork\n");
  20. close(sock_servidor);
  21. dup2(sock_cliente,0);
  22. dup2(sock_cliente,1);
  23. close(sock_cliente);
  24. printf("introduzca comando:\n");
  25. fgets(mensaje_cliente,20,stdin);
  26. printf("mensaje_cliente=\n%s",mensaje_cliente);
  27. char *com[]={"ls","-l",NULL};
  28.                        execvp(com[0],com);
  29. exit(1);
  30. }
  31. close(sock_cliente);
  32. }
  33.  
  34. 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
  1. int main()
  2. {
  3.   struct sockaddr_in cli;
  4.   struct sockaddr_in serv;
  5.   int s_cliente,s_servidor;
  6.  
  7.   s_cliente=socket(PF_INET,SOCK_STREAM,0);
  8.   if (s_cliente<0)
  9.   {
  10.      perror("socket");
  11.      return -1;
  12.   }
  13.  
  14.   cli.sin_family=AF_INET;
  15.   cli.sin_port=htons(0);
  16.   cli.sin_addr.s_addr=htonl(INADDR_ANY);
  17.   if(bind(s_cliente,(struct sockaddr *)&cli,sizeof cli)<0)
  18.   {
  19.      perror("bind");
  20.      return -1;
  21.   }
  22.  
  23.   serv.sin_family=AF_INET;
  24.   serv.sin_port=htons(PUERTO);
  25.   serv.sin_addr.s_addr=inet_addr("127.0.0.1");
  26.  
  27.   if(connect(s_cliente,(struct sockaddr *)&serv,sizeof serv)<0)
  28.   {
  29.      perror("connectando");
  30.      return -1;
  31.   }
  32.   char cadena[30];
  33.   //printf("introduzca el comando:\n");
  34.   //scanf("%[^\n]",cadena);
  35.   //fflush(stdin);
  36.   //send(s_cliente,cadena,sizeof cadena,0);
  37.   recv(s_cliente,cadena,sizeof cadena,0);
  38.   close(s_cliente);
  39.   return 0;
  40. }


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 (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: MAFUS en 20 Marzo 2018, 19:13 pm
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.


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 20 Marzo 2018, 19:22 pm
ok soy nuevo en esto gracias por responder


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 20 Marzo 2018, 19:25 pm
servidor:

Código
  1. #include <stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/socket.h>
  4. #include<unistd.h>
  5. #include<netinet/in.h>
  6. #include<stdlib.h>
  7. #include<netdb.h>
  8. #include<string.h>
  9. #include<arpa/inet.h>
  10. #include<signal.h>
  11. #define PUERTO 7777
  12.  
  13. int main()
  14. {
  15. struct sockaddr_in servidor;
  16. struct sockaddr_in cliente;
  17. int sock_servidor,sock_cliente;
  18.  
  19. if((sock_servidor=socket(AF_INET,SOCK_STREAM,0))<0)
  20. {
  21. perror("socket");
  22. return -1;
  23. }
  24. servidor.sin_family=AF_INET;
  25. servidor.sin_port=htons(PUERTO);
  26. servidor.sin_addr.s_addr=INADDR_ANY;
  27.  
  28. if((bind(sock_servidor,(struct sockaddr *)&servidor,sizeof servidor))<0)
  29. {
  30. perror("bind");
  31. return -1;
  32. }
  33.  
  34. if(listen(sock_servidor,20)<0)
  35. {
  36. perror("listen");
  37. return -1;
  38. }
  39. int tam_cliente;
  40. char* ip_cliente;
  41. int puerto_cliente;
  42. char mensaje_cliente[20];
  43. signal(SIGCHLD,SIG_IGN);
  44. while(1)
  45. {
  46. tam_cliente=sizeof cliente;
  47. sock_cliente=accept(sock_servidor,(struct sockaddr *)&cliente,&tam_cliente);
  48. if(sock_cliente<0)
  49. {
  50. perror("acceptando cliente");
  51. return -1;
  52. }
  53.  
  54. ip_cliente=inet_ntoa(cliente.sin_addr);
  55. puerto_cliente=ntohs(cliente.sin_port);
  56. printf("cliente conectado:%s:%d\n",ip_cliente,puerto_cliente);
  57. memset(mensaje_cliente,0,sizeof mensaje_cliente);
  58. //read(sock_cliente,&mensaje_cliente,sizeof mensaje_cliente);
  59. //printf("mensaje cliente:%s\n",mensaje_cliente);
  60. if(!fork())
  61. {
  62. printf("inicio fork\n");
  63. close(sock_servidor);
  64. dup2(sock_cliente,0);
  65. dup2(sock_cliente,1);
  66. close(sock_cliente);
  67. printf("introduzca comando:\n");
  68. fgets(mensaje_cliente,20,stdin);
  69. printf("mensaje_cliente=\n%s",mensaje_cliente);
  70. char *com[]={"ls","-l",NULL};
  71.                        execvp(com[0],com);
  72. exit(1);
  73. }
  74. close(sock_cliente);
  75. }
  76. return 0;
  77. }
  78.  

cliente:
Código
  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/socket.h>
  4. #include<netinet/in.h>
  5. #include<arpa/inet.h>
  6. #include<netdb.h>
  7. #include<unistd.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10.  
  11. #define PUERTO 7777
  12. int main()
  13. {
  14. struct sockaddr_in cli;
  15. struct sockaddr_in serv;
  16. int s_cliente,s_servidor;
  17.  
  18. s_cliente=socket(PF_INET,SOCK_STREAM,0);
  19. if (s_cliente<0)
  20. {
  21. perror("socket");
  22. return -1;
  23. }
  24.  
  25. cli.sin_family=AF_INET;
  26. cli.sin_port=htons(0);
  27. cli.sin_addr.s_addr=htonl(INADDR_ANY);
  28. if(bind(s_cliente,(struct sockaddr *)&cli,sizeof cli)<0)
  29. {
  30. perror("bind");
  31. return -1;
  32. }
  33.  
  34. serv.sin_family=AF_INET;
  35. serv.sin_port=htons(PUERTO);
  36. serv.sin_addr.s_addr=inet_addr("127.0.0.1");
  37.  
  38. if(connect(s_cliente,(struct sockaddr *)&serv,sizeof serv)<0)
  39. {
  40. perror("connectando");
  41. return -1;
  42. }
  43. char cadena[30];
  44. //printf("introduzca el comando:\n");
  45. //scanf("%[^\n]",cadena);
  46. //fflush(stdin);
  47. //send(s_cliente,cadena,sizeof cadena,0);
  48. recv(s_cliente,cadena,sizeof cadena,0);
  49. close(s_cliente);
  50. return 0;
  51. }
  52.  


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: MAFUS en 20 Marzo 2018, 20:01 pm
Ahora falta que una alma caritativa bajo *nix corra tu programa. Desde hace tiempo estoy trabajando con Windows. Equipo nuevo con garantía  :silbar:


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 20 Marzo 2018, 22:15 pm
Jajjajajjajaj pero igual lo puedes migrar a windows es fácil , en windows trabajo con qt creator


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: MAFUS en 20 Marzo 2018, 22:45 pm
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.


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 21 Marzo 2018, 03:30 am
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 :(


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: MAFUS en 21 Marzo 2018, 09:04 am
recv devuelve un entero con el número de datos que se han recibido.

Con recv recibirás los bytes que te mandará el servidor, eso es la cadena pero sin el carácter nulo.

Debes capturar el valor devuelto por recv y poner el caracter nulo en esa posición, después le das ese buffer a printf, o a puts para que lo imprima por pantalla.

Algo así:
Código
  1. int n = recv(s_cliente,cadena,sizeof cadena,0);
  2. cadena[n] = '\0';
  3. puts(cadena);


Título: Re: mostrar en cliente el resultado de execvp de servidor
Publicado por: tojo2ska8 en 23 Marzo 2018, 00:36 am
intente con esa solucion pero aun nada ... pero voy a solucionarlo denlo por echo y luego subo la solucion :D