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
#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
#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!
No se mucho (nada) de Sockets BSD en C pero pregunto:
#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;
}
Que cierras en la última linea si no has abierto nada, no sería así:
#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;
}
Saludos
Cita de: RyogiShiki en 19 Mayo 2012, 19:57 PM
No se mucho (nada) de Sockets BSD en C pero pregunto:
#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;
}
Que cierras en la última linea si no has abierto nada, no sería así:
#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;
}
Saludos
Perdón, cuando lo pegue acá borre un { sin querer, pero el error sucede con el { puesto. Gracias por avisarme!
mmm
struct t_socket_client client = malloc(sizeof(struct t_socket_client));
que tal si...
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...
t_socket* socket;
t_socket* serv_socket;
en lo particular yo me facilitaria la vida asi;
t_socket_client client;
client.socket = (t_socket*)malloc(sizeof(t_socket));
client.serv_socket = (t_socket*)malloc(sizeof(t_socket));
/** mas codigo X **/
return client; // retorno una copia.
o en tu forma:
t_socket_client* client = (t_socket_client*)malloc(sizeof(t_socket_client));
client->socket = (t_socket*)malloc(sizeof(t_socket));
client->serv_socket = (t_socket*)malloc(sizeof(t_socket));
/** mas codigo X **/
return client; // retorno una copia.
Dulces Lunas.
Ademas de lo que ya dijeron arriba, creo que tambien falta reservar memoria para apuntar con my_addr y sin_addr.
Saludos
.
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...
lpHosten = gethostbyname("www.google.com.mx");
if (lpHosten == NULL)
return false;
udtSockAddrIn.sin_addr.s_addr = *((unsigned long*)lpHosten->h_addr_list[0]);
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!¡.
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:
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!