【发布时间】:2014-08-07 15:19:54
【问题描述】:
我正在使用 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 行,定义缓冲区的行也会给出错误,指出数组不是std 的成员。我的项目负责人和我工作了一个小时左右,尝试了很多不同的方法来解决这个问题,包括完全重新安装 std 库,但无济于事;代码仍会将<array>#include 行识别为有效,但不允许我使用std::array。我试图通过将缓冲区定义为<array>char buffer[MAXSIZE] = "" 来解决这个问题,但是当它到达下一行的 read_some 命令时它会崩溃。诚然,我对使用 Boost 很陌生,我不确定是否有任何其他方法可以定义缓冲区以使其成为传递给 read_some 函数的有效参数。如果有人知道如何解决这个问题(如何将缓冲区传递给 read_some 而不会发生崩溃,或者如何让 std::array 工作),我将不胜感激。谢谢!
注意:我正在做的项目使用 VS2008。
UPDATE:到目前为止,除了上面示例代码中的代码,我还尝试了以下:
将缓冲区声明为
char buffer[MAXSIZE];这可以编译,但程序在调用socket.read_some()的行处冻结。我得到与char buffer[MAXSIZE] = "";相同的结果将缓冲区声明为
boost::array,无论是否添加包含<char, MAXSIZE> buffer;boost/array.hpp的指令行。这冻结在同一个地方。根据我发现的here,尝试将缓冲区声明为
std::tr1::array。同样按照相同的逻辑,我尝试添加<char, MAXSIZE> buffer;using namespace std::tr1;,然后将缓冲区定义为array。这些都没有编译;由于参数类型不匹配,两者都在调用<char, MAXSIZE> buffer;read_some()的行上出现错误。
我确实想到了,有可能,因为看起来应该工作的那些往往会冻结在read_some(),它需要很长时间才能阅读并且只是超时?如果是这种情况,我可以解决这个问题,我只是不知道如何判断这是正在发生的事情还是只是崩溃了。
【问题讨论】:
-
你必须使用c++11(类似-std=c++1)来
#include <array> -
@juanchopanza 感谢您的回复,我尝试使用 boost::array 而不是 std::array,但它仍然在同一个地方崩溃:/
-
怎么会崩溃?你声称它没有编译。
-
@juanchopanza 抱歉,如果这含糊不清,我的意思是 boost::array 代码与缓冲区 [MAXSIZE] = "" 的代码在同一点崩溃。它确实不像 std::array 那样编译
-
请不要编辑您的问题,一旦它被回答,使其成为(某种)新问题。