Título: sockets en linux Publicado por: adri041289 en 1 Junio 2010, 13:05 pm Tenemos que ejecutar un laberinto y que muestre por pantalla en ambos ordenadores el resultado siendo ejecutado solo en uno de ellos .
En un ordenador estara el programa y en el otro solo el mapa del laberinto y tendremos que recibir las cordenadas del monigote que anda por el laberinto para pintarlo por pantalla . El sistema utilizado es ubuntu 9.04 codigo cliente : #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> /* netbd.h es necesitada por la estructura hostent ;-) */ #define PORT 3550 /* El Puerto Abierto del nodo remoto */ #define MAXDATASIZE 100 /* El n�mero m�ximo de datos en bytes */ int main(int argc, char *argv[]) { int fd, numbytes; /* ficheros descriptores */ char buf[MAXDATASIZE]; /* en donde es almacenar� el texto recibido */ struct hostent *he; /* estructura que recibir� informaci�n sobre el nodo remoto */ struct sockaddr_in server; /* informaci�n sobre la direcci�n del servidor */ if (argc !=2) { /* esto es porque nuestro programa s�lo necesitar� un argumento, (la IP) */ printf("Uso: %s <Direcci�n IP>\n",argv[0]); exit(-1); } if ((he=gethostbyname(argv[1]))==NULL){ /* llamada a gethostbyname() */ printf("gethostbyname() error\n"); exit(-1); } if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){ /* llamada a socket() */ printf("socket() error\n"); exit(-1); } { int a, b; int resultado; int x,y; x=1; y=7; dib(); } char laber[9][9]={{' ','1','2','3','4','5','6','7','8'}, {'1','#','#','#','#','#','#',' ','#'}, {'2','#',' ','#',' ',' ','#',' ','#'}, {'3','#',' ',' ',' ','#',' ',' ','#'}, {'4','#',' ','#',' ','#',' ','#','#'}, {'5','#',' ','#',' ',' ',' ',' ','#'}, {'6','#',' ','#','#',' ','#','#','#'}, {'7','#',' ','#',' ',' ',' ',' ','#'}, {'8','#','#','#','#','#','#','#','#'}}; void dib() { int a, b; for(a=0;a<9;a++) { for(b=0;b<9;b++) { printf(" %c",laber[a]); } printf("\n"); } sleep(1); system("clear"); } int buscar(int a, int b, int x, int y ) { int listo=0; dib(); laber[a]='@'; if((a==x)&&(b==y)) { listo=1; return listo; } else { if((!listo)&&(laber[a][b+1]==' '&& b>=0 && a>=0 && b<9 && a<9)) listo=buscar(a,b+1,x,y); if((!listo)&&(laber[a][b-1]==' '&& b>=0 && a>=0 && b<9 && a<9)) listo=buscar(a,b-1,x,y); if((!listo)&&(laber[a+1]==' '&& b>=0 && a>=0 && b<9 && a<9)) listo=buscar(a+1,b,x,y); if((!listo)&&(laber[a-1]==' '&& b>=0 && a>=0 && b<9 && a<9)) listo=buscar(a-1,b,x,y); } if(!listo) { laber[a]='.'; dib(); listo=0; return listo; } else { listo=1; return listo; } } { do { printf("\nAhora que ya sabes como es el laberinto introduce las coordenadas desde donde quieras que empiece:\n"); printf("Coordenada vertical: "); scanf("%d", &a); printf("Coordenada horizontal: "); scanf("%d", &b); if((laber[a]=='#')||(a==0)||(b==0)||(a>9)||(b>9)) { printf("\nERROR, comprueba que en esa coordenada no hay pared ni se encuentra fuera del laberinto\n"); } } while((laber[a]=='#')||(a==0)||(b==0)||(a>9)||(b>9)); printf("\n"); dib(); resultado=buscar(a,b,x,y); if(resultado==0) printf("\nEl laberinto no tiene solucion\n"); if(resultado==1) { dib(); printf("\nExito!! El muneco ha salido del laberinto!! La salida es %d %d\n",x,y); laber[a]='@'; } } server.sin_family = AF_INET; server.sin_port = htons(PORT); /* htons() es necesaria nuevamente ;-o */ server.sin_addr = *((struct in_addr *)he->h_addr); /*he->h_addr pasa la informaci�n de ``*he'' a "h_addr" */ /*bzero(&(server.sin_zero),8);*/ if(connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr))==-1){ /* llamada a connect() */ printf("connect() error\n"); exit(-1); } if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1){ /* llamada a recv() */ printf("Error en recv() \n"); exit(-1); } buf[numbytes]='\0'; printf("Mensaje del Servidor: %d, %d\n",a,b); /* muestra el mensaje de bienvenida del servidor =) */ close(fd); /* cerramos fd =) */ } servidor : /* Estos son los ficheros de cabecera usuales */ #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define PORT 3550 /* El puerto que sera abierto */ #define BACKLOG 2 /* El numero de conexiones permitidas */ char laber[9][9]={{' ','1','2','3','4','5','6','7','8'}, {'1','#','#','#','#','#','#',' ','#'}, {'2','#',' ','#',' ',' ','#',' ','#'}, {'3','#',' ',' ',' ','#',' ',' ','#'}, {'4','#',' ','#',' ','#',' ','#','#'}, {'5','#',' ','#',' ',' ',' ',' ','#'}, {'6','#',' ','#','#',' ','#','#','#'}, {'7','#',' ','#',' ',' ',' ',' ','#'}, {'8','#','#','#','#','#','#','#','#'}}; void dib() { int a, b; for(a=0;a<9;a++) { for(b=0;b<9;b++) { printf(" %c",laber[a]); } printf("\n"); } sleep(1); system("clear"); } main() { int a,b; char laber[9][9]; int fd, fd2; /* los ficheros descriptores */ struct sockaddr_in server; /* para la informacion de la direccion del servidor */ struct sockaddr_in client; /* para la informacion de la direccion del cliente */ int sin_size; /* A continuacion la llamada a socket() */ if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { printf("error en socket()\n"); exit(-1); } server.sin_family = AF_INET; server.sin_port = htons(PORT); /* �Recuerdas a htons() de la sección "Conversiones"? =) */ server.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY coloca nuestra direccion IP automaticamente */ /*bzero(&(server.sin_zero),8); */ /* escribimos ceros en el reto de la estructura */ /* A continuacion la llamada a bind() */ if(bind(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1) { printf("error en bind() \n"); exit(-1); } if(listen(fd,BACKLOG) == -1) { /* llamada a listen() */ printf("error en listen()\n"); exit(-1); } while(1) { sin_size=sizeof(struct sockaddr_in); /* A continuacion la llamada a accept() */ if ((fd2 = accept(fd,(struct sockaddr *)&client, &sin_size))==-1) { printf("error en accept()\n"); exit(-1); } printf("Se obtuvo una conexi�n desde %s\n", inet_ntoa(client.sin_addr) ); /* que mostrara la IP del cliente */ send(fd2,"Resultado: %d, %d\n",a,b); /* que enviara el mensaje de bienvenida al cliente */ } } gracias por la ayuda Título: Re: sockets en linux Publicado por: pizarron en 3 Junio 2010, 10:10 am Te tiro una de las mejores (sino la mejor) guía para empezar con sockets que esta principalmente orientada al manejo de sockets en linux:
http://www.arrakis.es/~dmrq/beej/home.htm |