【问题标题】:How to Send a structure using sendto()如何使用 sendto() 发送结构
【发布时间】:2011-04-06 03:16:06
【问题描述】:

我已经创建了结构:

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

【问题讨论】:

    标签: c++ sockets winsock multicast sendto


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-04
          • 1970-01-01
          • 2019-08-05
          • 2023-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多