tengo este codigo estandard de ejemplo no es el coidgo en si:
este codigo esta en el servidor y funciona bien con telnet
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
Si muestras tu código podríamos ver donde falla. A lo mejor no es allí y es en otro sitio.
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
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 (http://foro.elhacker.net/reglas.htm)
-Engel Lex
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.
ok soy nuevo en esto gracias por responder
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;
}
Ahora falta que una alma caritativa bajo *nix corra tu programa. Desde hace tiempo estoy trabajando con Windows. Equipo nuevo con garantía :silbar:
Jajjajajjajaj pero igual lo puedes migrar a windows es fácil , en windows trabajo con qt creator
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.
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 :(
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í:
int n = recv(s_cliente,cadena,sizeof cadena,0);
cadena[n] = '\0';
puts(cadena);
intente con esa solucion pero aun nada ... pero voy a solucionarlo denlo por echo y luego subo la solucion :D