代码工作在线,但在课堂上

时间:2013-06-09 22:31:54

标签: c++ networking boost-asio

我正在使用Boost::Asio编写程序,我想实现简单的聊天。目前我正在努力解决这个问题,当我把一些代码内联到类函数时,它正在工作,但是当另一个类对象提供相同的代码时却没有。我认为它可能与Boost::Asio相关联,但我不确定:

void Connection::session(socket_ptr sock)
{
 try{
  for(;;) {
  char mesg[1024];

  boost::system::error_code error;
  size_t length = sock->read_some(boost::asio::buffer(mesg), error);

  if (error == boost::asio::error::eof){
    disconnected(sock);
    break;
  }
  else if (error)
    throw boost::system::system_error(error);

  message msg(mesg,length);
  char *data;
  data = msg.getData();
  std::cout << "In session " << strlen(data) << " " << data;

/*This is working
  string s_msg,s_data;
  s_msg = mesg;
  s_data = s_msg.substr(2,length);
  std::vector<char> writable(s_data.size() + 1);
  std::copy(s_data.begin(), s_data.end(), writable.begin());
  std::cout << "In session " << strlen(&writable[0]) << " " << &writable[0];
  send_all(sock,&writable[0],strlen(&writable[0]));
*/

  send_all(sock,data,strlen(data));
  }
}
catch (std::exception& e){
   std::cerr << "Exception in thread: " << e.what() << "\n";
   }
 }

仅解析数据的类消息

  message::message(char *c_msg, size_t length)
   {
    msg = c_msg;
    id = msg.at(0);
    data = msg.substr(2,length);
    }

   char* message::getData()
   {
    std::vector<char> writable(data.size() + 1);
    std::copy(data.begin(), data.end(), writable.begin());

    std::cout << data;
    std::cout << &writable[0];
    return &writable[0];
   }

所以当使用类消息时这行:

std::cout << "In session " << strlen(data) << " " << data;

我明白了:

st String //this is cout from message getData
st String //this is cout from message getData
In session 0

使用内联版本:

In session 11 st String

因此,会话函数字符串为空,尽管消息cout显示相反的内容。 我不知道它是否重要,但是这个函数被调用为来自main的新线程。

此致 彼得

1 个答案:

答案 0 :(得分:1)

您将返回临时地址:

char* message::getData()
{
    std::vector<char> writable(data.size() + 1);
    //...
    return &writable[0];
}

这是未定义的行为。

我假设data只是std::string。你可以这样做:

const char* message::getData() const
{
    return data.c_str();
}