sockets en linux

Iniciado por adri041289, 1 Junio 2010, 13:05 PM

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

adri041289

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

pizarron

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