Boost套接字读取功能无效

时间:2014-08-08 16:29:25

标签: c++ sockets visual-studio-2008 boost boost-asio

我正在尝试编写一个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上的示例后对我的代码进行建模。然而,当我尝试编译它时,我得到了大量的错误消息,主要是关于绑定期望不同数量的参数。我真的很擅长使用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 Log Cont'd

1 个答案:

答案 0 :(得分:2)

handle_read传递给bind

时,请取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)); 的地址
{{1}}