如何使用sendto()发送结构

时间:2010-08-31 07:34:39

标签: c++ sockets winsock multicast sendto

我创建了结构:

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发送上述结构。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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