/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problemas para manejar socket en estructura personalizada !!

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 07/10/2008 4:27 pm
Título: Problemas para manejar socket en estructura personalizada !!

Tengo una estructura en donde quiero almacenar la informacion de cada uno de mis clientes conectados, de modo que cada vez que un cliente se conecte, se creara una nueva estructura (nodo) e ir armando un arbol con cada cliente (cada nodo es un cliente).

He aqui el codigo simplificado:

Código:
//estructura para manejar el socket
struct socket_host_struct
   {
   struct sockaddr_in servidor; //estructura del servidor
   struct sockaddr_in cliente; //estructura del cliente
   int sockfd; //descriptor para el cliente
   }*host;

int crear_socket( int puerto, int modo )
   {
   int socket_fd=0;
   inicializar();
   
   if( modo==0 ) //creando socket como servidor
      {
      //creando socket
      if( (socket_fd=socket( AF_INET, SOCK_STREAM, 0 ))==-1 ) //error al cerar socket
         fprintf( stderr, "\nERROR: No es posible crear el socket :: %s.", strerror(errno) );
      else //exito al crear socket
         {
         //armando socket
         host= (struct socket_host_struct *)malloc( sizeof(struct socket_host_struct) ); //asignacion de memoria
         host->sockfd= socket_fd; //ingresando el socket a la estructura
         host->servidor.sin_family= AF_INET; //familia de direcciones
         host->servidor.sin_port= htons(puerto); //puerto
47         inet_aton( "127.0.0.1", htons->&servidor.sin_addr ); //direccion ip
48         memset( host->&servidor.sin_zero, '\0', 8 ); //rellenando estructura
         
         //Asociando socket al puerto
51         if( bind( socket_fd, (struct sockaddr )host->&servidor, sizeof(struct sockaddr) )==-1 ) //asociacion fallida
            fprintf( stderr, "\nERROR: No es posible asociar el socket al puerto especificado :: %s.", strerror(errno) );
         else //exito de asociacion
            {
            //Escuchando en el puerto
            if( listen( socket_fd, LIMITE )==-1 ) //error al escuchar
               fprintf( stderr, "\nERROR: No es posible escuchar en el puerto especificado :: %s.", strerror(errno) );
            else //exito al escuchar
               return socket_fd; //listo, ya pueden empezar a aceptar cliente y otras consultas
            }
         }
      return 0;
      }
   }


El problema es que no puedo utilizar la inromacion guardada en la estuctura :S para utilizar las funciones de bind() :S (observar codigo).

El error al compilar es:

Código:
main.c: In function 'crear_socket':
main.c:47: error: expected identifier before '&' token
main.c:48: error: expected identifier before '&' token
main.c:48: error: too few arguments to function 'memset'
main.c:51: error: expected identifier before '&' token
main.c:51: error: too few arguments to function 'bind'

_________________

Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7517
Ubicación: Mexico

MensajePublicado: 08/10/2008 5:12 am
Título:

Tienes dos errores de sintaxis en este bloque:
Código:
memset(host->&servidor.sin_zero, '\0', 8 );

...

if (bind(socket_fd, (struct sockaddr ) host->&servidor ...

El operador '&' debes colocarlo a la izquierda de la expresion, por ejemplo la primera expresion deberia ser "&host->servidor.sin_zero" para obtener la direccion en memoria del campo "sin_zero".

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 08/10/2008 12:25 pm
Título:

Listo muchas gracias, eso soluciono todo Very Happy
_________________

Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 11/10/2008 11:17 am
Título:

Aprovechando el posting, quisiera plantear una segunda pregunta muy simple pero que me tiene en duda Very Happy...

Digamos que tengo dos estructuras de socket:

struct sockaddr_in cliente;
struct sockaddr_in auxiliar;

En la funacion MAIN digamos que recepciono los datos del cliente (accept()), asi que invoco una funcion en donde copio la estructura del cliente ( struct sockaddr_in cliente) en la estructura auxiliar (struct sockaddr_in auxiliar). El proceso siguiente es correcto ??:

Código:

void insertar_cliente( struct sockaddr_in cliente )
      {
      struct sockaddr_in auxiliar;

      //copiamos
      auxiliar= cliente;
      }

int main()
      {
      struct sockaddr_in cliente;
      int sockfd, size_c=0;

      //realizamos el socket, etc, etc...

      //aceptamos cliente
      size_c= sizeof(struct sockaddr);
      accept( sockfd, (struct sockaddr *)&cliente, &size_c );

      insertar_cliente( cliente );
      }

_________________

Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2558
Ubicación: Valladolid (España)

MensajePublicado: 11/10/2008 8:39 pm
Título:

A la postre es correcto, pero cualquier molificación de cliente no tendrá efecto en main, para que esto ocurra debes utilizar un puntero a sockaddr_in en el parámetro de la función. Tambien debes tener encuenta si necesitas un struct sockaddr_in auxiliar ya que la propia copia (el argumento a función) es funcional.


S2.
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 12/10/2008 9:54 am
Título:

cheroky escribió:
A la postre es correcto, pero cualquier molificación de cliente no tendrá efecto en main, para que esto ocurra debes utilizar un puntero a sockaddr_in en el parámetro de la función. Tambien debes tener encuenta si necesitas un struct sockaddr_in auxiliar ya que la propia copia (el argumento a función) es funcional.


S2.


Esto lo plantie asi porque estoy codificando un sistema servidor que pueda crear una red de los dispositivos: inalambricos, de la LAN y bluetooth. Asi que estoy utilzando 2 arboles binarios, el primer arbol binario (primaer estructura) corresponde a todos los servidores que poseen los archivos, descargas, etc, etc... Y el segundo arbol binario (segunda estructura) contiene todos los clientes conectados por algun medio de comunicacion (lan, inalambrica y bluetooth), es por eso que es necesario copiar directo la estructura Very Happy, oviamente en la estructura misma existe int sockfd que corresponde a dicho cliente aceptado Very Happy !!!...

Código:
//estructura para generar arbol de los servidores en la red
struct servers_arbol
      {
      int sockfd;
      char buffer[N];
      struct sockaddr_in server;
      struct servers_arbol *izq;
      struct servers_arbol *der;
      }

//estructura para generar arbol de los clientes en la red
struct clientes_arbol
      {
      int sockfd;
      char buffer[N];
      struct sockaddr_in cliente;
      struct clientes_arbol *izq;
      struct clientes_arbol *der;
      }


bye bye
_________________

Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 399
Ubicación: Buenos Aires, Argentina

MensajePublicado: 15/10/2008 8:08 am
Título:

Más allá de todo me resulta extraño que guardes los clientes en un árbol. ¿Existe una jerarquía de los cliente que lo justifique?
¿Por qué no usaste una lista?
_________________
_Leo_
Daphne - administrador de tareas
Cine, tecnología, sociedad
Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 346
Ubicación: En la Luna

MensajePublicado: 17/10/2008 5:44 am
Título:

_Leo_ escribió:
Más allá de todo me resulta extraño que guardes los clientes en un árbol. ¿Existe una jerarquía de los cliente que lo justifique?
¿Por qué no usaste una lista?


Porque con un arbol puedo realizar busquedas mas rapidas que en una lista Very Happy, tomando en cuenta que cada cliente estara a cierto numero hops de un servidor y habra mas servidores posiblemente a menos numero de hops del cliente, el arbol me permitira buscar de una forma mas rapida los posibles servidores que se encuentren mas cercas del cliente e iniciar la transferencia de archivo que el cliente demande Very Happy.
_________________

Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com