2010-08-31 4 views
2

J'ai créé la structure:Comment envoyer une structure à l'aide sendto()

struct buffer 
{ 
    string ProjectName ; 
    string ProjectID ; 
} 

buffer buf; 
buf.ProjectID = "212"; 
buf.ProjectName = "MyProj"; 

maintenant pour envoyer cette structure en utilisant la méthode sendto, je suis typecasting la strucure et le renvoyer comme ci-dessous:

char *sendbuf = (char*)&buf; 
sentbytes = sendto(sock,sendbuf,strlen(sendbuf),0,(sockaddr*)&their_addr,sizeof(their_addr)); 

Mais pendant que je lance ma structure ti char* les données réelles perdent ses valeurs et pendant le débogage, je vois que sendbuf contient d'autres valeurs. Est-ce que quelqu'un peut me faire savoir comment envoyer la structure ci-dessus en utilisant sendto.

Répondre

2

Vous devez créer la structure en utilisant POD, la chaîne n'est pas quelque chose que vous pouvez utiliser de cette façon. Au lieu de cela, vous devez déclarer quelque chose comme

struct buffer 
{ 
    char ProjectName[MAX_LENGTH_PROJECT_NAME+1]; 
    char ProjectID[MAX_LENGTH_PROJECT_ID+1]; 
}; 

EDIT: clarification, la chaîne contient un pointeur vers un bloc de mémoire allouée en tas, de sorte que vous n'envoyez pas réellement les caractères lorsque vous essayez d'envoyer cette structure.

2

std::string détient ses données dans la mémoire allouée dynamiquement. Vous pouvez envoyer séparément chaque chaîne et la longueur d'une chaîne que vous pouvez obtenir en utilisant std::string::c_str et std::string::size.

1

Préférez utiliser marshall/unmarshall lors de l'envoi de données sur le réseau. Un style C++ est d'utiliser "< </>>" pour le streaming vers un tampon envoyable. De cette façon, vous avez plus de contrôle sur ce que vous envoyez et comment il est envoyé (binaire, texte, xml, ...). Boost a également un serialization module.

Questions connexes