L'envoi de structure à l'aide de recvfrom() et sendto()
Je suis en utilisant langage C qui est un plate-forme commune pour le serveur et le client.
J'ai une structure d'un type particulier qui je veux envoyer au client à partir du serveur.
Pour, par exemple,
CODE 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 , fondamentalement, je veux envoyer une structure à partir du serveur vers le client. Mais à partir de ci-dessus les morceaux de code que j'obtiens la segmentation des défauts , et je ne suis pas sûr de savoir si une telle structure de transfert est possible. Est-il de toute façon?
Il est plus ou moins. Je n'appellerais pas cela de portable en toute manière.
OriginalL'auteur Biswajyoti Das | 2009-08-04
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous avez à malloc() pour allouer de la mémoire pour la struct hostent.
Vous pouvez transférer une structure à travers sendto () et recvfrom (), mais depuis struct hostent contient des pointeurs, les membres de cette structure sont des pointeurs n'ont pas de sens dès qu'ils sont transférés à l'autre extrémité.
Ok..alors c'est insignifiant pour envoyer la structure hostent.Il serait mieux si j'ai envoyer le contenu de la structure de la chaîne par chaîne pour le serveur.
C'est exact, et c'est généralement le cas. Vous ne voulez vraiment pas à transmettre autre chose que des caractères ou des nombres entiers sur un réseau, sauf si vous êtes très prudent à ce sujet. Et lorsque vous transmettez des entiers, assurez-vous de les convertir vers ou depuis le réseau de l'octet de commande à l'aide de la htonl/htons/ntohl/ah la famille de fonctions.
OriginalL'auteur PetrosB
J'avais enlever le & devant hp
OriginalL'auteur Eric
En général, vous voulez éviter de transférer des premières structures sur les réseaux, sauf s'ils ont été expressément conçus pour une utilisation en tant que réseau de transport, ou, sauf si vous êtes absolument sûr que les deux extrémités sera toujours exactement la même architecture. Les différences dans le rembourrage et l'octet de commande peut provoquer l'affichage des données tronquées à l'autre extrémité. Le type de structure que vous essayez de transférer simplement ne fonctionnera pas être envoyé raw (Voir la réponse de Petros)
Le problème dans votre envoyer le code, c'est que hp est un pointeur et vous traiter comme c'est les données des points. sizeof(hp) renvoie la taille d'un pointeur, pas de la taille de la pointe-de struct hostent. Aussi, vous êtes à la création d'un pointeur de pointeur dans le deuxième argument de sendto quand tu ne veux pas. Le code d'envoi doit se lire:
Vous avez également un problème dans la réception du code. Vous êtes censé pour allouer de l'espace pour recvfrom pour stocker les données reçues. Il n'a pas allouer pour vous. Changement de recevoir votre code à l'un de ces deux:
ou
OriginalL'auteur Tyler McHenry
Si hp est un pointeur, pourquoi prenez-vous son adresse?
OriginalL'auteur Amber
Vous devriez corriger le code comme indiqué ci-dessous:
Il serait toujours aider à la lecture de la documentation sur la prise de fonctions.
OriginalL'auteur Indy9000
Par la façon dont, si je considère que la question très générique dans votre post, c'est à dire "je veux envoyer une structure à partir du serveur vers le client", je vous recommande de regarder le post suivant sur DONC:
Passage d'une structure à travers des Sockets en C
OriginalL'auteur AamodG