Boost套接字读取功能不起作用

Posted

技术标签:

【中文标题】Boost套接字读取功能不起作用【英文标题】:Boost socket read functions not working 【发布时间】:2014-08-08 16:29:25 【问题描述】:

我正在尝试编写一个 C++ 代码 (VS2008),它将通过 Boost 打开一个套接字并通过它运行用户指定的命令。到目前为止,我有这个:

#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#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());

  boost::array<char, MAXSIZE> buffer;
  this->socket.async_read_some(boost::asio::buffer(b, MAXSIZE),
                             boost::bind(MyClass::handle_read, this,
                             boost::asio::placeholders::error,
                             boost::asio::placeholders::bytes_transferred));


void MyClass::handle_read(const boost::system::error_code& error, size_t bytes_transferred)

    //Haven't worked this part out yet...

我尝试按照 Boost 网站 here 上的示例对我的代码进行建模。但是,当我尝试编译它时,会收到大量错误消息,主要是关于 bind 期望不同数量的参数。我对使用 Boost 真的很陌生,老实说有点迷失了如何做到这一点,所以我不确定该怎么做才能纠正这个问题,因为它似乎与他们网站上的示例相匹配。我还尝试使用 Boost 的 read_some() 函数来执行此代码,该代码可以在我发布的关于该方法的问题here 中找到。

基本上,我只是想问我可以做些什么来让这段代码按预期运行。我不太担心我最终需要使用两个函数中的哪一个(read_some() 或 async_read_some()),只要它有效。如果另一种方式更好,我将不胜感激任何帮助解决该问题的问题。如果这种方式更好并且有人知道如何解决它,那也很棒。提前非常感谢。

编辑:我之前不小心忘记了包含我收到的错误消息。其中有很多(约 70 个),都与 boost::bind 有关,并遵循以下语法:

error: C2780: 'boost::_bi::bind_t<Rt2,boost::_mfi::cmf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(boost::type<T>,R (__cdecl T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 11 arguments - 4 provided
error: C2780: 'boost::_bi::bind_t<Rt2,boost::_mfi::cmf7<R,T,B1,B2,B3,B4,B5,B6,B7>,_bi::list_av_8<A1,A2,A3,A4,A5,A6,A7,A8>::type> boost::bind(boost::type<T>,R (__cdecl T::* )(B1,B2,B3,B4,B5,B6,B7) const,A1,A2,A3,A4,A5,A6,A7,A8)' : expects 10 arguments - 4 provided
//etc.

其中有一些具有相同消息,但表示它预期的参数数量不同,从 11 到 3。它似乎还针对不同格式给出了 3 次相同的通用错误消息集。我将分别举一个例子,因为这组错误消息中的所有其他错误消息都是相同的语法,只是参数数量不同:

//first is same as above
error: C2780: 'boost::_bi::bind_t<Rt2,boost::_mfi::cmf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(boost::type<T>,R (__cdecl T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 11 arguments - 4 provided


error: C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf8<R,T,A1,A2,A3,A4,A5,A6,A7,A8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__cdecl T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 4 provided


error: C2780: 'boost::_bi::bind_t<R,R(__cdecl *)(B1,B2,B3,B4,B5,B6,B7,B8,B9),_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__cdecl *)(B1,B2,B3,B4,B5,B6,B7,B8,B9),A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 4 provided


error: C2780: 'boost::_bi::bind_t<boost::_bi::unspecified,F,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(F,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 4 provided


error: C2780: 'boost::_bi::bind_t<R,F,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(boost::type<T>,F,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 11 arguments - 4 provided

error: C2780: 'boost::_bi::bind_t<R,F,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(F,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 10 arguments - 4 provided

我还截取了完整错误日志的屏幕截图(或者至少我可以一次在屏幕上显示的尽可能多的屏幕截图),如下所示:

【问题讨论】:

您收到“大量错误消息”如何解决? 哦,请不要在最后一段中问另一个不同的问题——问一个新问题(但先做一些功课。异步与同步问题已多次解决(谷歌是你的朋友)) 错误信息如下: error: C2780: 'boost::_bi::bind_t,_bi ::list_av_4::type> boost::bind(boost::type,R (__cdecl T::* )(B1,B2,B3),A1,A2,A3 ,A4)' : 需要 6 个参数 - 提供 4 个。它们都是相同的格式,只是预期的参数数量不同。为了记录@DaleWilson,我很抱歉我之前没有包含它,我打算但忘记添加它。你可以问我是否有例子而不是粗鲁行事。 @DaleWilson 的挫败感是可以理解的,我将编辑问题以添加到错误消息中。不过,最好还是问一下,而不是假设它是故意的 【参考方案1】:

在传递给bind时取handle_read的地址

this->socket.async_read_some(boost::asio::buffer(b, MAXSIZE),
                             boost::bind(&MyClass::handle_read, this,
                                     //  ^ 
                             boost::asio::placeholders::error,
                             boost::asio::placeholders::bytes_transferred));

【讨论】:

看起来是这样 :) 非常感谢您(并且实际上愿意提供帮助而不是粗鲁,与 cmets 中的人不同)我一直在为此苦苦挣扎几个小时,非常感谢您的帮助

以上是关于Boost套接字读取功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Boost union 在 1.67 中不起作用,但在 1.61 中起作用。为啥?

boost_python hello 示例不起作用

boost Date_Time 日期解析不起作用

Boost 库无法在 C++ 中工作,包含目录不起作用

*.pyd 库中的 C++ Boost Python 方法不起作用

boost :: asio :: steady_timer在boost :: dll中不起作用