Jump to content

sockets en C


Recommended Posts

hola amigos de chilecomparte, toy tudiando sockets en C y he encontrado super buenos ejemplos pero solo para el paso de mensajes desde el cliente al servidor, asi que empece a programar un juego de batalla naval y termine el cliente y ahora iba a hacer el server pero nose como hacer que un cliente le envie info al server y que este la redirija a un cliente distinto (con otra IP)

 

el codigo de ejemplo que tengo de un servidor es este. en resumidas cuentas lo que quiero saber es como pasar info de un cliente a un servidor y que este servidor redirija esa info a otro cliente. muchas gracias a todos :D

 

 

//      servidor.c

//      

//      Copyright 2010 Alejandro Hernández Catrip    <[email protected]>

//                     Oscar Eduardo Romero Meléndez <[email protected]>   

//      

//      This program is free software; you can redistribute it and/or modify

//      it under the terms of the GNU General Public License as published by

//      the Free Software Foundation; either version 2 of the License, or

//      (at your option) any later version.

//      

//      This program is distributed in the hope that it will be useful,

//      but WITHOUT ANY WARRANTY; without even the implied warranty of

//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

//      GNU General Public License for more details.

//      

//      You should have received a copy of the GNU General Public License

//      along with this program; if not, write to the Free Software

//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,

//      MA 02110-1301, USA.



/*

    SERVIDOR ITERATIVO

*/



#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>



//#include <netdb.h>

int main(int argc, char *argv[]) {

   

   int s, ns, tamano;

   int bufsize = 1024;

   char *buffer = malloc(bufsize);

   struct sockaddr_in direc;

   int puerto;

   pid_t pid;

   

   if(argc !=2) {

       

       system("clear");

       

       printf(" Modo de empleo: ./servidor <puerto> \n\n"); 

       

       exit(1);

    }

   

   if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0)

   {

          perror("socket");

          exit(1);

   }



   printf("Socket servidor creado\n");

    

   puerto = atoi(argv[1]);

   direc.sin_family = AF_INET;

   

   // Usar IP local

   direc.sin_addr.s_addr = htons(INADDR_ANY);  //Usar IP local

   

   /* Puerto seleccionado por el usuario

    * vincula el socket a la direccion especificada

    */

   direc.sin_port = htons(puerto);  

   

   if (bind(s,(struct sockaddr *)&direc,sizeof(direc)) < 0)

    {

      perror("bind");

      close(s);

      return(-1);

    }

   

   //printf("Socket atado a la direccion %s\n",inet_ntoa(direc.sin_addr.s_addr)); //convierte los 32 bits de direccion a una cadena

   listen(s,4);  //solo hasta 4 clientes a la espera

   tamano = sizeof(direc);

   printf("Esperando conexion de clientes...\n");

   while((ns = accept(s,(struct sockaddr *)&direc,&tamano))>0)

   {

          if((pid=fork())==0){

      // printf("El cliente %s esta conectado\n",inet_ntoa(direc.sin_addr));

       strcpy(buffer, "Conexion con el servidor establecida\n");

       send(ns,buffer,bufsize,0);

     do

      {

           printf("Esperando mensaje ...\n");

          recv(ns,buffer,bufsize,0);

          printf("Mensaje recibido: %s\n",buffer);

       }while(strcmp(buffer,"/q")); //El usuario debe teclear '/q' para salir

       //printf("El cliente %s termina conexion\n",inet_ntoa(direc.sin_addr));

       close(ns);

       printf("Esperando nuevos clientes...\n");

    }

}

   close(s);

return 0;

}

 

 

 

Link to comment
Share on other sites

para hacer un servidor, tienes que saber usar Thread y la memoria dinamica( Pilas, Colas , etc.. ).

 

primero crearia una estructura de esta forma.

 

struct batalla

{

int id_1;

int id_2;

 

SOCKET sock_contrincante1;

SOCKET sock_contrincante2;

 

struct batalla* siguiente;

};

 

donde sock_contrincante1; y sock_contrincante2; , son los identificadores de los sockets de los contrincantees( son necesarios para enviarse informasion entre ellos ) , el id es para identificar y facilitar la busqueda de los contrincantes, y la estructura es para generar una lista enlazada, entonces cuando quiero enviar datos desde un cliente a otra pasando por el servidor( el servdor deberia tener los datos de los clientes en la estructura ), el servidor recorre la lista buscando el id del y luego el id del contrincante y envia los datos.

 

esa es mi idea, si tienes alguna otra duda, no dudes en preguntar ;)

suerte!!.

 

 

pd: revisa este link ( http://msdn.microsoft.com/en-us/library/ms...v=vs.85%29.aspx ) , ahi tambien tienes un ejemplo.

 

edit :

 

otra cosa, no es necesario la IP de los clientes, ya que tu te conectas al servidor y al servidor le basta con asociar los socket y luego atraves del ID del socket se envian los datos NO CON LA IP.

Edited by Curso_C
Link to comment
Share on other sites

mmm, amigo, parece que estas usando Linux, si es asi los thread no te serviran ya que linux trabaja con fork(), pero puedes usar tecnicas de IPC como la memoria dinamica segun POSIX

 

IPC: http://es.wikipedia.org/wiki/Comunicaci%C3..._entre_procesos

google: http://www.google.cl/#hl=es&biw=1366&a...aa62f6f249ffcc5

 

suerte ;)

 

PD: Posix tambien funciona en windows usando una libreria

Edited by gemu
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...