How to Send a structure using sendto()

旧巷老猫 提交于 2019-12-12 19:03:28

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!