metalsew_135 Posted December 11, 2010 Report Share Posted December 11, 2010 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 More sharing options...
Curso_C Posted December 12, 2010 Report Share Posted December 12, 2010 (edited) 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 December 12, 2010 by Curso_C Link to comment Share on other sites More sharing options...
gemu Posted December 12, 2010 Report Share Posted December 12, 2010 (edited) 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 December 12, 2010 by gemu Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now