Struct转换为原始char问题

时间:2013-12-21 21:10:50

标签: c++ struct

我有以下问题: 有我的结构:

struct NET_CONNECTION_DISPATCH
{
    int len;
    int data_str_len;
    const char * data_str;
};

这里使用了结构:

const std::string dstr = "127.0.0.1 11001";
    ncd.len = 8 + dstr.length();
    ncd.data_str_len = dstr.length();
    ncd.data_str = dstr.c_str();

之后我想通过boost asio发送它:

boost::asio::async_write(socket_, boost::asio::buffer((char*)&ncd, ncd.len),
      boost::bind(&Connection::handle_write, shared_from_this(),
        boost::asio::placeholders::error));

在客户端收到的消息中,一切都很好,只有8字节(标题)。 消息的字符串部分由随机字节填充。 我做错了什么? 我尝试了很多选项,结果总是相同。 感谢。

2 个答案:

答案 0 :(得分:1)

字符不在您的结构中。该结构包含一个指针,并且您将在结构之后发送指针和一些额外的随机字节。

看起来你只是想尝试发送一个字符串(你的结构中没有其他任何东西),所以你应该做两次写:字符串长度的4字节写入,然后是字节的N字节写入实际的字符串数据。

答案 1 :(得分:1)

NET_CONNECTION_DISPATCH中的

data_str是一个指针,data_str的值只是一个4字节的内存地址。当你使用(char *)& ncd时,& ncd的内容只有三个整数。 如果你真的想以这种方式使用那个结构,你应该单独输出data_str。

boost::asio::async_write(socket_, boost::asio::buffer(ncd.data_str, ncd.len-8),
  boost::bind(&Connection::handle_write, shared_from_this(),
    boost::asio::placeholders::error));