elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
22 Agosto 2008, 06:18  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Necesito ayuda urgente sobre sockets!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Imprimir
Autor Tema: Necesito ayuda urgente sobre sockets!  (Leído 690 veces)
Flakito81

Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #15 en: 08 Mayo 2008, 01:00 »

El código es funcional, lo q no quiere decir que lo puedas mejorar, que sí puedes hacerlo.
- el bind ha de devolver 0, si devuelve -1 es un error y no puedes ejecutar el resto del codigo, pues el programa no escuchará por ese puerto.
-  tienes my_addr que es una variable del tipo struct sockaddr_in y en el sizeof le estas pasando struct sockaddr. como ves no es lo mismo, pasa la variable y te ahorras problemas

NOTA: los editores tienen una opcion que es remplazar usala para cambiar el nombre a las variables y te ahorras trabajo.

Suerte!
En línea
alan_tgn

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #16 en: 12 Mayo 2008, 18:07 »

Perdón por el ausentismo.

He provado lo que tu me dijiste y creo que lo he hecho bien, te dejo el código para que puedas comprovar, he substituido las estructuras que me dijiste y el bin devuelve 0. Por lo que he podido observar con todo eso se queda en espera (buena señal, o eso creo).

Ahora solo me falta el cliente para este servidor. No tengo ni pajolera idea, la verdad. Otra cosa que debo hacer para enviar i devolver cartas???? como incluio mi código en este cliente/servidor??

de mientras dejo el código del servidor:

Citar
Código
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
 
#define MYPORT 3490    /* the port users will be connecting to */
#define BACKLOG 100  
#define CONEXIONES 5
 
int numero_de_hijos = 0;
 
void proceso_hijo( int socket_servidor)
{
  fd_set grupo, grupo_todos;
  int maxfd = socket_servidor;
  int ceiling = 0;
  int i;
 
  FD_ZERO(&grupo);
  FD_ZERO(&grupo_todos);
 
  FD_SET(socket_servidor, &grupo_todos);
 
  while(1)
  {
     grupo = grupo_todos;
 
     if ( select(maxfd+1, &grupo, 0, 0, 0) > 0 )
     {
        for ( i = 0; i < maxfd + 1; ++i)
        {
           if ( FD_ISSET(i, &grupo) )
           {
              if ( i == socket_servidor )
              {
                 if ( ceiling < CONEXIONES )
                 {
            int client = accept(socket_servidor, 0, 0);
            if ( maxfd < client )
               maxfd = client;
                            FD_SET(client, &grupo_todos);//lo añadimos al grupo
            ceiling++;
            printf("select proceso #%d: %d conexiones\n", getpid(), ceiling);
         }//fin si
      }
      else
                      {
                         char buffer[1024];
         int bytes;
 
                         memset (buffer, '\x0', sizeof(buffer));
         bytes = recv(i, buffer, sizeof(buffer), 0);
 
         printf ("El cliente %d nos envia: %s\n", i - 3, buffer);
 
         if ( bytes == 0 )
                        {
                            close(i);
            FD_CLR(i, &grupo_todos);//lo quitamos del grupo
            ceiling--;
            printf("select process #%d: %d conexiones\n",
        getpid(), ceiling);
         }
                        else /* enviamos al cliente lo mismo que recibimos (servidor de eco)*/
                   send(i, buffer, bytes, 0);
              }//fin else
           }//fin si(FD_ISSET)                  
        } //fin for    
     }//fin si (select)        
 
  }//fin while(1)
  exit(0);    
}// fin 'proceso_hijo'
 
 
  main()
   {
       int sock, pid;
  struct sockaddr_in local;
  struct hostent *dir_server;
  socklen_t len;
 
 
int sockfd, new_fd;  /* listen on sock_fd, new connection on new_fd */
       struct sockaddr_in sockaddr_in;    /* my address information */
       struct sockaddr_in their_addr; /* connector's address information */
       int sin_size;
 
       if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
           perror("socket");
           exit(1);
       }
 
       sockaddr_in.sin_family = AF_INET;         /* host byte order */
       sockaddr_in.sin_port = htons(MYPORT);     /* short, network byte order */
       sockaddr_in.sin_addr.s_addr = inet_addr ("127.0.0.1"); /* auto-fill with my IP */
       memset(&(sockaddr_in.sin_zero),'\0', 8);        /* zero the rest of the struct */
 
if (bind(sockfd, (struct sockaddr *) &local, sizeof(local)) == 0)
 {
    listen(sock, CONEXIONES);  
    while (1)
    {
       if (numero_de_hijos < CONEXIONES)
       {
          if ((pid = fork()) == 0)
             proceso_hijo(sock);
          else if (pid > 0)
             numero_de_hijos++;
          else
             perror("fork");                  
       }//fin si    
       else
          sleep(1);    
    }//fin while(1)
  }//fin si (bind)
  else
     perror("bind");
  return 0;
}//fin main

Un saludo y muchas gracias Flakito81

En línea
Flakito81

Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #17 en: 12 Mayo 2008, 22:29 »

Ya te comenté como es el cliente. Puedes aprovechar el codigo del servidor. Función main hasta llegar al bind y luego solo es un bucle (infinito o hasta determinada respuesta del servidor) q lea del socket e interprete.
Tendrás que crearte un mini protocolo para que puedas establecer la comunicación entre ambos.
Por ejemplo:
   -El cliente se conecta al servidor y envía: CL <nombre>
   -El servidor responde con: SV <start game>
   (comienza la comunicacion [ciclo])
   -El cliente envía el comando que sea para la tirada (no se como es el blackjack)
   -El servidor ejecuta el código del blacjack y le envia la respuesta
   (se termina el juego)
   -El servidor envia SV <end>
   -El cliente se cierra.

Es un ejemplo de protocolo para que pilles lo que estoy diciendo, aunque este en concreto no creo que te sirva.

La cosa es que sepas adaptar el código que tienes hecho del blackjack a los nuevos requerimientos, una opcion posible (que ahora se me ocurre) es que le pases al descriptor del socket al blackjack y sustituyas el printf por escribir en el socket y el scanf por leer del socket.
La manera de hacer el blackjack como una funcion es muy simple. Si tienes uno o varios ficheros con el programa blackjack renombra el main de dicho programa y le pones BlackJack, original ehh, y le puedes pasar el descriptor del socket. Date cuenta que el descriptor que tienes q pasar es el propio i.

Otra opcion es que modifiques el programa del blackjack y lo adaptes para que hagas uso de tuberías, aunque esto me parece mas lioso.

Weno ... espero que alguien te pueda dar una respuesta más sencilla.

Un saludo!
En línea
alan_tgn

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #18 en: 13 Mayo 2008, 16:27 »

No quiero ser agua fiestas, pero no me he enterado muy bien, lo siento mucho.
Me lo he leído y releído, pero nada. Sigo sin entender muy bien el entramado del socket para que funcione el programa...

Gracias de nuevo Flakito81 por tu ayuda.

En línea
Flakito81

Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #19 en: 13 Mayo 2008, 22:31 »

1- El cliente abre el socket y se conecta al servidor
2- Se hace un bucle infinito o con alguna condicion de parada, por ejemplo, que pare cuando se reciba FIN
3- Envias un comando al servidor, ejemplo START
4- El servidor comenzará el juego y lees del socket
5- Envias por el socket tu jugada
6- se repite el paso 4 y 5 continuamente
7- Cuando el servidor envie FIN sales del bucle
8- Ha terminado el programa.

Manera de adaptar el programa que ya tienes hecho del blackjack:

1- Coges la funcion main de ese programa (el del blackjack) y renombras la funcion main para que deje de ser la funcion principal y como argumento le pasas un entero que sera el socket del cliente. En el servidor el socket del cliente está identificado por la variable i
2- Cambias los printf y scanf del programa blackjack por funciones para escribir en el socket. En realidad tan solo es cambiar el descriptor, como normal el printf escribe en stdout (pantalla) descriptor 1 y el scanf lee del stdin (teclado) descriptor 0. En definitiva. Donde tengas:
Código:
printf ("Has ganado\n");
lo cambias por:
Código:
send(socket_cliente, "Has ganado\n", sizeof("Has Ganado\n"), 0);
Esa sería la idea general.
Como tienes un proceso para cada cliente el programa del blackjack se ejecutará N veces, dnd N es el numero de clientes, siendo cada ejecucion unica para cada uno.

Saludos!
En línea
alan_tgn

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Necesito ayuda urgente sobre sockets!
« Respuesta #20 en: 14 Mayo 2008, 18:35 »

Hola, me ha resultado mucho más fácil enteder muchas cosas, depués de tu explicación ;).
He cojido y no sé, si estará bien, pero he cogido el código del BlackJack y lo he puesto en el cliente (tengo la duda que esta, de que si poniendo el código el trabajo estará como mal). La question que poniendolo en el cliente pueden entrar tantas personas quieran al servidor y puedo jugar perfectamente al juego.

Solo me falta poder cerrar el programa y preguntarme si quiero volver a jugar. Tendría que intentar poder hacer que los demás clientes puedan jugar juntos...pero para mañana no creo que pueda hacer que vayan tantas cosas. Mil cosas que me suspende iré a extraordinária.

Un saludo
« Última modificación: 14 Mayo 2008, 18:47 por alan_tgn » En línea
Páginas: 1 [2] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC