Question

J'utilise le langage C , qui est une plate-forme commune pour le serveur et le client.

J'ai une structure d'un type particulier que je veux envoyer au client depuis le serveur.

Par exemple

CODE DU SERVEUR

 //necessary declarations

struct hostent *hp;

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

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

CODE CLIENT

struct hostent *hp;

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

Donc, en gros, je veux envoyer une structure du serveur au client. Mais, à partir des éléments de code ci-dessus, des erreurs de segmentation se produisent et je ne suis pas sûr que ce transfert de structure soit réalisable. Y a-t-il un moyen de sortir?

Était-ce utile?

La solution

Tout d’abord, vous devez malloc () pour pouvoir allouer de la mémoire à la struct hostent. Vous pouvez transférer une structure via sendto () / recvfrom (), mais comme struct hostent contient des pointeurs, les membres de cette structure qui sont des pointeurs n'ont aucune signification dès qu'ils sont transférés à l'autre extrémité.

Autres conseils

Je supprimerais le & amp; devant le hp

En général, vous souhaitez éviter de transférer des structures brutes sur des réseaux à moins qu'elles aient été spécifiquement conçues pour le transport de réseau ou à moins que vous ne soyez absolument certain que les deux extrémités auront toujours la même architecture. Les différences de remplissage et d'ordonnancement des octets peuvent entraîner une déformation des données à l'autre extrémité. Le type particulier de structure que vous essayez de transférer ne fonctionnera tout simplement pas, car il est envoyé brut (voir la réponse de Petros)

Le problème dans votre code d'envoi est que hp est un pointeur et que vous le traitez comme s'il s'agissait des données pointées. sizeof (hp) renvoie la taille d'un pointeur, pas la taille de la structure hostent pointée. En outre, vous créez un pointeur à pointeur dans le deuxième argument de sendto lorsque vous ne voulez pas dire. Le code d’envoi doit indiquer:

struct hostent *hp;

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

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

Vous avez également un problème avec le code de réception. Vous êtes censé allouer de la place à recvfrom pour stocker les données qu'il a reçues. Il ne l'alloue pas pour vous. Changez votre code de réception en l’un des deux suivants:

// Store on the stack
struct hostent h;

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

ou

// 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 est un pointeur, pourquoi prenez-vous son adresse?

Vous devez corriger le code comme indiqué ci-dessous:

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

Il serait toujours utile de lire la documentation sur les fonctions de socket.

À propos, si je considère la question très générique de votre message, c'est-à-dire "je souhaite envoyer une structure du serveur au client", je vous recommanderais de consulter le message suivant sur SO:

Passage d'une structure par Sockets en C

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top