标签: boost-asio

std :: bind应该与boost :: asio兼容吗?

我正在尝试调整其中一个boost :: asio示例,尽可能使用c ++ 11/TR1库.原始代码如下所示:

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      boost::bind(&tcp_server::handle_accept, this, new_connection,
         boost::asio::placeholders::error));
}
Run Code Online (Sandbox Code Playgroud)

如果我更换boost::bindstd::bind如下:

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      std::bind(&tcp_server::handle_accept, this, new_connection,
                 boost::asio::placeholders::error ) );
      // std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) );
}
Run Code Online (Sandbox Code Playgroud)

我收到一条大错误消息,结尾为:

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
Run Code Online (Sandbox Code Playgroud)

我使用的是增强版1.47的gcc 4.4版

我希望boost :: bind和std :: bind可以互换.

c++ boost boost-asio c++11

43
推荐指数
1
解决办法
6125
查看次数

使用boost :: asio时,为什么每个连接需要strand?

我正在审查Boost网站上的HTTP Server 3示例.

你能解释我为什么需要strand每个连接吗?正如我所看到的,我们read_some只在read-event的处理程序中调用.所以基本上read_some调用是顺序的,因此不需要strand(第3段的第2项说同样的事情).多线程环境中的风险在哪里?

c++ boost boost-asio

43
推荐指数
2
解决办法
2万
查看次数

io_service,为什么以及如何使用它?

试着学习asio,我正在关注网站上的例子.

为什么需要io_service,它究竟做了什么?为什么我需要在执行异步操作时将其发送到几乎所有其他函数,为什么它不能在第一次"绑定"后"创建"自身.

c++ boost boost-asio

38
推荐指数
1
解决办法
2万
查看次数

回调的优缺点(std :: function/std :: bind)与接口(抽象类)

我正在使用Boost.Asio在C++ 11中创建服务器应用程序.我创建了一个类,Server它负责接受新的连接.它基本上只是:

void Server::Accept() {
  socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
  acceptor_.async_accept(*socket_,
                         boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}

void Server::HandleAccept(const boost::system::error_code& error) {
  if (!error) {
    // TODO
  } else {
    TRACE_ERROR("Server::HandleAccept: Error!");
  }
  Accept();
}
Run Code Online (Sandbox Code Playgroud)

我找到了两种方法(我确定还有更多)来"修复" TODO注释,即将套接字移动到应该去的地方.在我的情况下,我只想将它返回到拥有该Server实例的类实例(然后将其包装在一个Connection类中并将其插入到列表中).

  1. Server在其构造函数中有一个参数:std::function<void(socket)> OnAccept调用它HandleAccept.
  2. 我创建了一个抽象类,IServerHandler或者其他什么,它有一个虚方法OnAccept.Server需要IServerHandler在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler,构建Server*this作为参数.

选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection班级(OnConnectionClosed)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceivedOnPacketSent回调.

c++ interface callback boost-asio c++11

34
推荐指数
1
解决办法
6061
查看次数

将streambuf的内容复制到字符串

显然boost::asio::async_read不喜欢字符串,因为唯一的重载boost::asio::buffer允许我创建const_buffers,所以我坚持将所有内容都读成streambuf.
现在我想将streambuf的内容复制到一个字符串中,但它显然只支持写入char*(sgetn()),使用streambuf创建一个istream并使用getline().

有没有其他方法可以创建一个带有streambufs内容的字符串,而无需过多的复制?

c++ string boost streambuf boost-asio

33
推荐指数
5
解决办法
5万
查看次数

Boost :: Asio:io_service.run()vs poll()或者如何在mainloop中集成boost :: asio

我目前正在尝试首次使用boost :: asio进行一些简单的tcp网络,而且我已经发现了一些我不确定如何处理的东西.据我所知,io_service.run()方法基本上是一个循环,它运行直到没有其他事情要做,这意味着它将一直运行,直到我释放我的小服务器对象.由于我已经设置了某种主循环,我宁愿从那里手动更新网络循环只是为了简单起见,我认为io_service.poll()会做我想要的,有点像这样:

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我仍然想知道这种方法是否有缺点,因为这似乎不是处理boost :: asios io服务的常用方法.这是一种有效的方法还是我应该在非阻塞的额外线程中使用io_service.run()?

c++ networking tcp boost-asio

32
推荐指数
1
解决办法
3万
查看次数

提升asio io_service dispatch vs post

谁能告诉我io_service dispatchpost之间的区别?我不清楚什么更适合我的问题.

我需要在另一个处理程序中调用一个处理程序,我不知道使用什么调用程序.

c++ boost boost-asio

31
推荐指数
2
解决办法
2万
查看次数

如何在boost asio中阻止套接字设置超时?

有没有办法取消挂起操作(没有断开连接)或设置升压库函数的超时?

即我想在boost asio中阻止套接字设置超时?

socket.read_some(boost :: asio :: buffer(pData,maxSize),error_);

示例:我想从套接字中读取一些内容,但是如果已经过了10秒,我想抛出一个错误.

c++ sockets boost boost-asio

30
推荐指数
5
解决办法
4万
查看次数

使用Boost.Asio获取本地IP地址

我目前正在寻找一种获取本地IP地址的便携方式.因为我正在使用Boost,我认为使用Boost.Asio来完成这项任务是个好主意.

网上有几个例子可以解决问题.例子:

官方Boost.Asio文档

一些亚洲页面

我只是略微修改了两个代码.Boost.Doc上的代码更改为不解析"www.boost.org",而是"localhost"或我的主机名.为了获取主机名,我使用boost :: asio :: ip :: host_name()或直接键入它作为字符串.

另外,我编写了自己的代码,它是上述示例和我从Boost文档和其他示例中收集的(小)知识的合并.

所有的资源都有效,但他们只返回了以下IP:
127.0.1.1(这不是拼写错误,最后是.1.1)
我运行并使用GCC 4.4.1在Ubuntu 9.10上编译代码

一位同事在他的机器上尝试了相同的代码,得到了
127.0.0.2(也不是一个错字......)
他用GCC 4.4.1编译并运行在Suse 11.0上(我不是100%肯定)

我不知道是否可以更改localhost(127.0.0.1),但我知道我或我的同事都没有这样做.ifconfig表示loopback使用127.0.0.1.ifconfig还找到我要搜索的公共IP(在我的情况下是141.200.182.30,子网是255.255.0.0)

这是一个Linux问题,代码不像我想象的那么便携吗?我是否需要更改其他内容或Boost.Asio根本不能解决我的问题?

我知道在Stackoverflow和其他页面上有很多关于类似主题的问题,但我找不到在我的情况下有用的信息.如果你有了有用的链接,那么如果你能指出我就很好.

PS:这是我在Boost.Doc中使用的修改代码:

#include <boost/asio.hpp>
using boost::asio::ip::tcp;    

boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::host_name(), "");
tcp::resolver::iterator iter = resolver.resolve(query);
tcp::resolver::iterator end; // End marker.
while (iter != end)
{
    tcp::endpoint ep = *iter++;
    std::cout << ep << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ ip-address boost-asio

30
推荐指数
3
解决办法
3万
查看次数

在Linux中链接Boost库

我正在尝试使用Boost的Asio构建一个项目,我遇到了一些麻烦.最初,我试图在没有任何额外库的情况下构建项目,因为所有内容都应该在头文件中.

我正在尝试构建的程序如下所示:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));

    t.wait();

    std::cout << "Hello, world!" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以发现这里在加速的网站.

所以,最初我只是:

-I /usr/include/boost_1_40_0
Run Code Online (Sandbox Code Playgroud)

这导致以下错误:

make -k all
Building target: HelloWorld
Invoking: GCC C++ Linker
g++  -o"HelloWorld"  ./main.o  
./main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost_1_40_0/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_system_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:206: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:211: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:212: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:213: undefined reference to `boost::system::get_system_category()'
./main.o: In function `boost::asio::error::get_system_category()':
/usr/include/boost_1_40_0/boost/asio/error.hpp:218: …
Run Code Online (Sandbox Code Playgroud)

linux boost linker-errors boost-asio deadline-timer

29
推荐指数
3
解决办法
4万
查看次数