Pregunta

Estoy usando lenguaje C que es una plataforma común tanto para el servidor como para el cliente.

Tengo una estructura de un tipo particular que quiero enviar al cliente desde el servidor.

Por ejemplo,

CÓDIGO DE SERVIDOR

 //necessary declarations

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

CÓDIGO DE CLIENTE

struct hostent *hp;

msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);

Entonces, básicamente quiero enviar una estructura desde el servidor al cliente. Pero de las piezas de código anteriores obtengo fallas de segmentación, y no estoy seguro de si dicha transferencia de estructura es factible. ¿Hay alguna salida?

¿Fue útil?

Solución

Primero, debe malloc () para asignar memoria para la estructura hostent. Puede transferir una estructura a través de sendto () / recvfrom () pero dado que la estructura de alojamiento contiene punteros, los miembros de esta estructura que son punteros no tienen sentido tan pronto como se transfieren al otro extremo.

Otros consejos

Quitaría el & amp; delante de HP

En general, desea evitar transferir estructuras en bruto a través de redes a menos que hayan sido diseñadas específicamente para su uso como transporte de red, o a menos que esté absolutamente seguro de que ambos extremos siempre serán exactamente la misma arquitectura. Las diferencias en el relleno y el orden de los bytes pueden hacer que los datos aparezcan confusos en el otro extremo. El tipo particular de estructura que está intentando transferir simplemente no funcionará si se envía sin formato (consulte la respuesta de Petros)

El problema en su código de envío es que hp es un puntero y lo está tratando como si fuera la información a la que apunta. sizeof (hp) devuelve el tamaño de un puntero, no el tamaño de la estructura de host apuntada. Además, está creando un puntero a puntero en el segundo argumento de sendto cuando no lo desea. El código de envío debería leer:

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

También tiene un problema en el código de recepción. Se supone que debe asignar espacio para que recvfrom almacene los datos que recibió. No lo asigna por ti. Cambie su código de recepción a uno de estos dos:

// Store on the stack
struct hostent h;

msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);

o

// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));

msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);

Si hp es un puntero, ¿por qué toma su dirección?

Debe corregir el código como se muestra a continuación:

struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));


struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);

Siempre sería útil leer la documentación sobre las funciones del socket.

Por cierto, si considero la pregunta muy genérica en su publicación, es decir, "Quiero enviar una estructura desde el servidor al cliente", recomendaría mirar la siguiente publicación en SO:

Pasando una estructura a través de Sockets en C

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top