elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA] Error en sockets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA] Error en sockets  (Leído 3,815 veces)
goro_333

Desconectado Desconectado

Mensajes: 3


Ver Perfil
[AYUDA] Error en sockets
« en: 19 Mayo 2012, 19:47 pm »

Hola a toda la gente del foro, estoy realizando un trabajo práctico de la materia Sistemas Operativos de la carrera Ingeniería en Sistemas de información en la UTN (Buenos Aires) y tengo un inconveniente con sockets. Estoy programando en Eclipse bajo el sistema operativo Ubuntu. Les cuento mi problema: en un header Sockets.h tengo la definición de la estructura t_socket_client y t_socket
Código:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int desc;
struct sockaddr_in* my_addr;
e_socket_mode mode;
} t_socket;

typedef struct {
t_socket* socket;
t_socket* serv_socket;
e_socket_state state;
} t_socket_client;


y en el source file Sockets.c tengo la definición de una función sockets_createClient
Código:

#include "headers/Sockets.h"

t_socket_client *sockets_createClient(char *ip, int port)
{ struct t_socket_client client = malloc(sizeof(struct t_socket_client));

client->socket->my_addr->sin_family = AF_INET;
client->socket->my_addr->sin_addr->s_addr = inet_addr(ip);
client->socket->my_addr->sin_port = htons(port);
client->state = SOCKETSTATE_DISCONNECTED;
client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);

bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));

return client;
}

y el Eclipse me pone errores en cada linea de esta función diciendo
Citar
"Multiple markers at this line
   - aplicación inválida de ‘sizeof’ a un tipo de dato incompleto ‘struct
    t_socket_client’
   - la variable ‘client’ tiene inicializador pero de tipo de dato incompleto
   - aviso: variable ‘client’ sin usar [-Wunused-variable]"

Si alguien podría contestar, sería de mucha ayuda. Gracias por el espacio!


« Última modificación: 19 Mayo 2012, 20:14 pm por goro_333 » En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [AYUDA] Error en sockets
« Respuesta #1 en: 19 Mayo 2012, 19:57 pm »

No se mucho (nada) de Sockets BSD en C pero pregunto:

Código
  1. #include "headers/Sockets.h"
  2.  
  3. t_socket_client *sockets_createClient(char *ip, int port)
  4. struct t_socket_client client = malloc(sizeof(struct t_socket_client));
  5.  
  6. client->socket->my_addr->sin_family = AF_INET;
  7. client->socket->my_addr->sin_addr->s_addr = inet_addr(ip);
  8. client->socket->my_addr->sin_port = htons(port);
  9. client->state = SOCKETSTATE_DISCONNECTED;
  10. client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);
  11.  
  12. bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));
  13.  
  14. return client;
  15. }

Que cierras en la última linea si no has abierto nada, no sería así:

Código
  1. #include "headers/Sockets.h"
  2.  
  3. t_socket_client *sockets_createClient(char *ip, int port) {
  4. struct t_socket_client client = malloc(sizeof(struct t_socket_client));
  5.  
  6. client->socket->my_addr->sin_family = AF_INET;
  7. client->socket->my_addr->sin_addr->s_addr = inet_addr(ip);
  8. client->socket->my_addr->sin_port = htons(port);
  9. client->state = SOCKETSTATE_DISCONNECTED;
  10. client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);
  11.  
  12. bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));
  13.  
  14. return client;
  15. }

Saludos


En línea

goro_333

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [AYUDA] Error en sockets
« Respuesta #2 en: 19 Mayo 2012, 20:16 pm »

No se mucho (nada) de Sockets BSD en C pero pregunto:

Código
  1. #include "headers/Sockets.h"
  2.  
  3. t_socket_client *sockets_createClient(char *ip, int port)
  4. struct t_socket_client client = malloc(sizeof(struct t_socket_client));
  5.  
  6. client->socket->my_addr->sin_family = AF_INET;
  7. client->socket->my_addr->sin_addr->s_addr = inet_addr(ip);
  8. client->socket->my_addr->sin_port = htons(port);
  9. client->state = SOCKETSTATE_DISCONNECTED;
  10. client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);
  11.  
  12. bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));
  13.  
  14. return client;
  15. }

Que cierras en la última linea si no has abierto nada, no sería así:

Código
  1. #include "headers/Sockets.h"
  2.  
  3. t_socket_client *sockets_createClient(char *ip, int port) {
  4. struct t_socket_client client = malloc(sizeof(struct t_socket_client));
  5.  
  6. client->socket->my_addr->sin_family = AF_INET;
  7. client->socket->my_addr->sin_addr->s_addr = inet_addr(ip);
  8. client->socket->my_addr->sin_port = htons(port);
  9. client->state = SOCKETSTATE_DISCONNECTED;
  10. client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);
  11.  
  12. bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));
  13.  
  14. return client;
  15. }

Saludos


Perdón, cuando lo pegue acá borre un { sin querer, pero el error sucede con el { puesto. Gracias por avisarme!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [AYUDA] Error en sockets
« Respuesta #3 en: 19 Mayo 2012, 20:32 pm »

mmm

Código
  1. struct t_socket_client client = malloc(sizeof(struct t_socket_client));

que tal si...

Código
  1. t_socket_client* client = (t_socket_client*)malloc(sizeof(t_socket_client));

por otro lado estas ocupando puros punteros asi que vas a tener que de igual manera reservar memoria para estos dos miembros de la estructura t_socket_client...

Código
  1. t_socket* socket;
  2. t_socket* serv_socket;
  3.  

en lo particular yo me facilitaria la vida asi;

Código
  1. t_socket_client client;
  2. client.socket = (t_socket*)malloc(sizeof(t_socket));
  3. client.serv_socket = (t_socket*)malloc(sizeof(t_socket));
  4. /** mas codigo X **/
  5. return client; // retorno una copia.
  6.  

o en tu forma:

Código
  1. t_socket_client* client = (t_socket_client*)malloc(sizeof(t_socket_client));
  2. client->socket = (t_socket*)malloc(sizeof(t_socket));
  3. client->serv_socket = (t_socket*)malloc(sizeof(t_socket));
  4. /** mas codigo X **/
  5. return client; // retorno una copia.
  6.  


Dulces Lunas.
« Última modificación: 19 Mayo 2012, 20:37 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
exel

Desconectado Desconectado

Mensajes: 50



Ver Perfil
Re: [AYUDA] Error en sockets
« Respuesta #4 en: 19 Mayo 2012, 20:47 pm »

Ademas de lo que ya dijeron arriba, creo que tambien falta reservar memoria para apuntar con my_addr y sin_addr.

Saludos
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [AYUDA] Error en sockets
« Respuesta #5 en: 19 Mayo 2012, 21:21 pm »

.
sockaddr_in si lo manejas como puntero vas a tener que reservar memoria... yo optaría mejor por instanciar...
sin_addr se le asigna lo que se retorna al llamar a gethostbyname()... aun que la funcion retorna un puntero a una estructura hostent se puede obtener...

Código
  1.    lpHosten = gethostbyname("www.google.com.mx");
  2.  
  3.    if (lpHosten == NULL)
  4.        return false;
  5.  
  6.    udtSockAddrIn.sin_addr.s_addr = *((unsigned long*)lpHosten->h_addr_list[0]);
  7.  

Usa punteros solo cuando lo requieras de lo contrario solo harás mas procesos de los necesarios... en varios casos de esas estructuras así como están y sin saber mas de otro código usaría las instancias de cada tipo.

Dulces Lunas!¡.
« Última modificación: 19 Mayo 2012, 21:31 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
goro_333

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [AYUDA] Error en sockets
« Respuesta #6 en: 20 Mayo 2012, 22:56 pm »

Bueno gracias a todos por colaborar con mi pedido de ayuda!
Pude arreglar el problema usando sus soluciones y agregando un par de cosas mas

sockets_createClient me quedo asi:

Código:
t_socket_client *sockets_createClient(char *ip, int port)
{
t_socket_client *client = (t_socket_client*)malloc( (2*sizeof(t_socket)) + sizeof(e_socket_state));
client->socket = (t_socket*)malloc(sizeof(t_socket));
client->serv_socket = (t_socket*)malloc(sizeof(t_socket));
client->socket->my_addr = malloc(sizeof(struct sockaddr_in));

client->socket->my_addr->sin_family = AF_INET;
client->socket->my_addr->sin_addr.s_addr = inet_addr(ip);
client->socket->my_addr->sin_port = htons(port);
client->state = SOCKETSTATE_DISCONNECTED;
client->socket->desc = socket(AF_INET, SOCK_STREAM, 0);

bind(client->socket->desc, (struct sockaddr *)(client->socket->my_addr), sizeof(struct sockaddr_in));

return client;
}

Si ven alguna locación demás o algo absurdo en mi código escucho sus críticas. Saludos!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con sockets
PHP
[KMT] 2 1,792 Último mensaje 30 Abril 2007, 02:10 am
por дٳŦ٭
Ayuda con sockets
.NET (C#, VB.NET, ASP)
nik00 3 2,804 Último mensaje 11 Marzo 2009, 12:08 pm
por Krackwar ™
Error tonto con threads y sockets « 1 2 3 »
Java
Debci 22 11,631 Último mensaje 28 Diciembre 2009, 10:20 am
por Debci
error al compilar sockets en c
Programación C/C++
Drewermerc 1 2,483 Último mensaje 27 Abril 2014, 22:54 pm
por Drewermerc
Sockets en c++ y Ws2_32.lib y error
Programación C/C++
patilanz 7 4,127 Último mensaje 4 Mayo 2014, 19:37 pm
por patilanz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines