使用boost :: asio read_some()函数替换std :: array时,boost :: array在read_some()函数调用时崩溃

时间:2014-08-07 15:19:54

标签: c++ arrays boost std

我正在使用boost的套接字和char数组读取套接字读取的结果。根据我在网上看过的例子(包括Boost文档),到目前为止我已经有了这个例子:

#include <boost/asio.hpp>
#include <array>
#include <string>
#define MAXSIZE 1000000
//...
void MyClass::processCommand(std::string command)
{
  boost::asio::io_service io;
  boost::asio::ip::tcp::socket socket(io);
  boost::asio::ip::tcp::endpoint e(boost::asio::ip::address::from_string("127.0.0.1"), 60151);  //Info for the connection I need to make...
  this->socket.open(boost::asio::ip::tcp::v4());
  this->socket.connect(e);
  this->socket.write_some(boost::asio::buffer(command, command.size());
  this->socket.send(boost::asio::buffer(command, command.size());

  std::array<char, MAXSIZE> buffer;
  this->socket.read_some(boost::asio::buffer(buffer));
}

根据我见过的例子,似乎这应该有效。我有一个问题;无论出于何种原因,我的编译器(我在Qt 5.2中工作)似乎拒绝将std :: array识别为有效。即使使用#include <array>行,行定义缓冲区也会出错,表示数组不是std的成员。我的项目负责人和我工作了一个小时左右尝试了一些不同的方法来解决这个问题,包括完全重新安装std库,但无济于事;代码仍会将<array行识别为有效,但不要让我使用std :: array。我尝试通过将缓冲区定义为#include <array>来解决此问题,但是当它编译时,它会在下一行到达read_some命令时崩溃。我无疑是使用Boost的新手,我不确定是否还有其他方法可以定义缓冲区以使其成为传递给read_some函数的有效参数。如果有人知道如何解决这个问题(如何将缓冲区传递给read_some而不崩溃,或者如何让std :: array工作)我真的很感激。谢谢!

注意:我正在处理的项目使用VS2008。

UPDATE :到目前为止,除了上面示例代码中的代码之外,我还尝试了以下内容:

  • 将缓冲区声明为<array这会编译,但程序会在调用char buffer[MAXSIZE] = ""的行中冻结。我使用char buffer[MAXSIZE];

  • 获得了相同的结果
  • 将缓冲区声明为socket.read_some(),无论是否添加指令行都包含char buffer[MAXSIZE] = "";。这冻结在同一个地方。

  • 根据我找到的here,尝试将缓冲区声明为boost::array<char, MAXSIZE> buffer;。同样沿着相同的逻辑,我尝试添加<char, MAXSIZE,然后将缓冲区定义为boost/array.hpp。这些都没有汇编;对于参数类型不匹配,调用std::tr1::array<char, MAXSIZE> buffer;的行都给出了错误。

它确实发生在我身上,这是可能的,因为那些似乎应该工作的人往往会在<char, MAXSIZE冻结,这需要很长时间才能阅读并且它只是超时了?如果是这种情况我可以解决这个问题,我只是不知道如何判断这是发生了什么,或者它是否正在崩溃。

2 个答案:

答案 0 :(得分:0)

应该没问题:看到 Live On Coliru

#include <boost/asio.hpp>
#include <array>
#include <string>
#define MAXSIZE 1000000
//...
void processCommand(std::string command)
{
    boost::asio::io_service io;
    boost::asio::ip::tcp::socket socket(io);
    boost::asio::ip::tcp::endpoint e(boost::asio::ip::address::from_string("127.0.0.1"), 60151);  //Info for the connection I need to make...

    socket.open(boost::asio::ip::tcp::v4());
    socket.connect(e);
    socket.write_some(boost::asio::buffer(command));
    socket.send(boost::asio::buffer(command));

    std::array<char, MAXSIZE> buf;
    socket.read_some(boost::asio::buffer(buf));
}

int main()
{
    processCommand("EHLO");
}

如果您没有C ++ 11,请使用boost::arrayboost/array.hpp)。

在所有其他情况下,请查看您的编译器以及Boost问题跟踪器中不兼容的潜在报告

答案 1 :(得分:-1)

您可以按照此处的建议使用std::array boost::array std::vectorstd::string

http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/buffer.html