问题
I have created structure :
struct buffer
{
string ProjectName ;
string ProjectID ;
}
buffer buf;
buf.ProjectID = "212";
buf.ProjectName = "MyProj";
Now to send this structure using sendto method , I am typecasting the strucure and sending it back as below:
char *sendbuf = (char*)&buf;
sentbytes = sendto(sock,sendbuf,strlen(sendbuf),0,(sockaddr*)&their_addr,sizeof(their_addr));
But while I am casting my Struct ti char*
the actual data is loosing it's values and while debugging I see sendbuf is containing some other values.
Can some one let me know how can I send the above structure using sendto.
回答1:
You need to create the structure using POD, the string is not something you can use in that way. Instead you need to declare it something like
struct buffer
{
char ProjectName[MAX_LENGTH_PROJECT_NAME+1];
char ProjectID[MAX_LENGTH_PROJECT_ID+1];
};
EDIT: clarification, the string contains a pointer to a heap allocated memory block, so you are not actually sending the characters when you try to send that structure.
回答2:
std::string
holds its data in dynamically allocated memory. You could send separately each string and length of a string which you can get by using std::string::c_str
and std::string::size
.
回答3:
Prefer using marshall/unmarshall when sending data over network. A C++-style is to use "<< / >>" for streaming to a sendable buffer. This way, you have more control over what you are sending and how it is sent (binary,text,xml,...). Boost also has a serialization module.
来源:https://stackoverflow.com/questions/3606933/how-to-send-a-structure-using-sendto