2

我创建了结构:

struct buffer
{
    string ProjectName ;
    string ProjectID ;
}

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

现在要使用 sendto 方法发送此结构,我正在对结构进行类型转换并将其发送回,如下所示:

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

但是,当我铸造我的 Struct ti 时char*,实际数据正在丢失它的值,而在调试时,我看到 sendbuf 包含一些其他值。

有人可以告诉我如何使用 sendto 发送上述结构吗?

4

3 回答 3

2

您需要使用 POD 创建结构,字符串不是您可以以这种方式使用的东西。相反,您需要将其声明为

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

编辑:澄清,字符串包含一个指向堆分配内存块的指针,因此当您尝试发送该结构时,您实际上并没有发送字符。

于 2010-08-31T07:38:07.720 回答
2

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

于 2010-08-31T07:38:43.740 回答
1

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

于 2010-08-31T08:15:25.263 回答