2010-08-31 44 views
2

我创建结构的使用结构的sendto():如何发送

struct buffer 
{ 
    string ProjectName ; 
    string ProjectID ; 
} 

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

现在使用sendto方法将这个结构,我类型转换的strucure并把它发回如下:

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

但是,当我投掷我的结构ti char*实际的数据是失去它的值,而在调试时,我看到sendbuf包含一些其他值。

有人可以让我知道如何使用sendto发送上述结构。

回答

2

您需要使用POD创建结构,该字符串不是您可以使用的方式。相反,你需要声明它像

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

做一些修改:澄清,该字符串包含一个指向堆分配的内存块,这样你就不会实际发送的字符,当您尝试发送结构。

2

std::string将其数据保存在动态分配的内存中。您可以分别发送每个字符串和一个字符串的长度,您可以使用std::string::c_strstd::string::size

1

当通过网络发送数据时,首选使用marshall/unmarshall。 C++风格是使用“< </>>”来流式传输到可发送缓冲区。这样,您就可以更好地控制您发送的内容以及发送方式(二进制,文本,xml,...)。 Boost也有一个serialization module