我正在尝试调整其中一个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::bind
与std::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可以互换.
我正在审查Boost网站上的HTTP Server 3示例.
你能解释我为什么需要strand
每个连接吗?正如我所看到的,我们read_some
只在read-event的处理程序中调用.所以基本上read_some
调用是顺序的,因此不需要strand(第3段的第2项说同样的事情).多线程环境中的风险在哪里?
试着学习asio,我正在关注网站上的例子.
为什么需要io_service,它究竟做了什么?为什么我需要在执行异步操作时将其发送到几乎所有其他函数,为什么它不能在第一次"绑定"后"创建"自身.
我正在使用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
类中并将其插入到列表中).
Server
在其构造函数中有一个参数:std::function<void(socket)> OnAccept
调用它HandleAccept
.IServerHandler
或者其他什么,它有一个虚方法OnAccept
.Server
需要IServerHandler
在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler
,构建Server
以*this
作为参数.选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection
班级(OnConnectionClosed
)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceived
和OnPacketSent
回调.
显然boost::asio::async_read
不喜欢字符串,因为唯一的重载boost::asio::buffer
允许我创建const_buffer
s,所以我坚持将所有内容都读成streambuf.
现在我想将streambuf的内容复制到一个字符串中,但它显然只支持写入char*(sgetn()
),使用streambuf创建一个istream并使用getline()
.
有没有其他方法可以创建一个带有streambufs内容的字符串,而无需过多的复制?
我目前正在尝试首次使用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()?
有没有办法取消挂起操作(没有断开连接)或设置升压库函数的超时?
即我想在boost asio中阻止套接字设置超时?
socket.read_some(boost :: asio :: buffer(pData,maxSize),error_);
示例:我想从套接字中读取一些内容,但是如果已经过了10秒,我想抛出一个错误.
我目前正在寻找一种获取本地IP地址的便携方式.因为我正在使用Boost,我认为使用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) 我正在尝试使用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) boost-asio ×10
c++ ×9
boost ×7
c++11 ×2
callback ×1
interface ×1
ip-address ×1
linux ×1
networking ×1
sockets ×1
streambuf ×1
string ×1
tcp ×1