socket servidor programa example cliente c sockets struct network-programming sendto

servidor - Enviar estructura utilizando recvfrom() y sendto()



udp client c (6)

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 ayudaría leer la documentación sobre las funciones del socket.

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

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

Por ej.

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));

CODIGO DEL CLIENTE

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

Entonces, básicamente quiero enviar una estructura del servidor al cliente. Pero a partir de los fragmentos de código anteriores, estoy obteniendo fallas de segmentación, y no estoy seguro si tal transferencia de estructura es factible. ¿Hay alguna manera de salir?


En general, desea evitar la transferencia de estructuras sin formato a través de redes a menos que hayan sido específicamente diseñadas para su uso como transporte de red, o a menos que esté absolutamente seguro de que ambos extremos siempre serán exactamente de la misma arquitectura. Las diferencias en el relleno y el orden de bytes pueden hacer que los datos aparezcan distorsionados en el otro extremo. El tipo particular de estructura que está tratando de transferir no se enviará al trabajo en bruto (vea 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 que apunta. sizeof (hp) devuelve el tamaño de un puntero, no el tamaño de la estructura del hostent apuntado. Además, está creando un puntero a puntero en el segundo argumento de sendto cuando no es su intención. El código de envío debería decir:

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

También tienes un problema en el código de recepción. Se supone que debes asignar espacio para recvfrom para almacenar los datos que recibió. No lo asigna para 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);


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

Pasar una estructura a través de Sockets en C


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


Quitaría el & delante de HP


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