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

标签 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 .然而,当我尝试编译它时,我收到大量错误消息,主要是关于绑定(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 Log Cont'd

最佳答案

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));

关于c++ - Boost套接字读取功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25208027/

相关文章:

sockets - delphi中netcat之类的监听程序不回传命令

c# - 是否在可扩展的客户端-服务器应用程序上使用多线程

visual-studio - Visual Studio 2010 中的重启图标在哪里?

c++ - 按字母顺序排序

c++ - 使用 AMD 显卡的 Eclipse-CDT (Windows) 中的 OpenCL

c++ - 如何在连接所有客户端套接字的情况下关闭boost asio服务器套接字

c++ - 将指针数组传递给另一个类

c - c 中的原始套接字 - 虚假 header 长度

visual-studio - 在Visual Studio中,“停止调试”和“全部终止”有什么区别?

c# - VS2008 - 用推断类型替换 var