| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 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: 7520 Ubicación: Mexico
| Publicado: 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
| Publicado: 08/10/2008 12:25 pm | | | Título: |
| Listo muchas gracias, eso soluciono todo  _________________
|
| | Volver arriba | |  | | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 11/10/2008 11:17 am | | | Título: |
| Aprovechando el posting, quisiera plantear una segunda pregunta muy simple pero que me tiene en duda ...
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)
| Publicado: 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
| Publicado: 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 , oviamente en la estructura misma existe int sockfd que corresponde a dicho cliente aceptado !!!...
| 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
| Publicado: 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
| Publicado: 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 , 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 . _________________
|
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |