如何确定boost asyncaccept是否正在侦听端口
how to determine whether boost async_accept is listening on a port or not
我无法使此示例正常工作http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html
我已经将端口13更改为1163,这样我就不需要成为root用户就可以开始侦听了。
我正在单独的线程中运行io_service
。
int main()
{
try
{
boost::asio::io_service io_service;
tcp_server server(io_service);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
t.detach();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
string wait;
cin >> wait;
return 0;
}
使用测试上述服务器时http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/tutorial/tutdaytime1/src.html客户端,上面写着connection refused
。
netstat --listen
在1163 上没有显示任何打开的端口
我不知道如何使用boost::asio::async_result<typename Handler>
。我对Handler
感到困惑。
工作修改
int main()
{
try
{
boost::asio::io_service io_service;
tcp_server server(io_service);
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
t.detach();
string wait;
cin >> wait;
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
如果wait
在try
块内,则代码工作!
如果asio无法侦听端口,则acceptor
的创建或绑定将失败。在您的情况下,您使用acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
创建接收器,这是一个过载:http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload3.html
这将直接尝试绑定套接字,如果失败则抛出异常。另一种选择(如本页底部所述)是在没有指定端点的情况下创建套接字,并在其上调用open
和bind
,其中bind
将因错误而失败(例如,如果套接字已在使用中)。在任何情况下,您都不需要等待accept/async_accept
才能看到错误。
我想你的问题在于客户端程序,它仍然试图连接到端口13。你把它改成使用1163端口了吗?在示例代码中,端口不是直接写入的,但这里使用了一个众所周知的服务名称:tcp::resolver::query query(argv[1], "daytime");
。"日间"参考将告诉解析器使用端口13。
更新:现在我看到了线程的实际代码,这是一个完全不同的错误:
如果wait
不在try块内,那么asioio_service
和tcp_server
将几乎立即超出作用域,这意味着它们的析构函数将被调用。这将停止所有通信。更糟糕的是,分离的线程现在对一些悬空指针进行操作。一般来说,asio对象(io_service事件循环、套接字等)都应该存在于使用它们的线程中。io_service
的生存期应与线程的生存期绑定或短于线程的生存时间。套接字的生存期应该比运行它们的事件循环(io_service
)的生存期短。通过使用shared_ptr
或在设计中投入大量思想,其他使用场景可能是可行的,但我不建议这样做。
- 如何确定boost msm中的特定状态是否为活动状态
- boost::instrusive::list 带有自动取消链接钩子:我可以使用列表中的值来确定列表是否只有一个元素
- 如何确定boost asyncaccept是否正在侦听端口
- C++11: boost::make_tuple 与 std::make_tuple 有何不同?
- boost :: async-不确定实现
- 确定是否使用boost.asio计算UDP校验和
- Boost:如何确定是否还有任何生产者线程
- Boost/Property树确定值类型
- 正在确定boost变量中的最大sizeof()
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- C++ & boost::threads - 如何根据工作类型确定线程的优先级?
- boost::asio::io_service如何确定工作的优先级
- std::bind() 错误:无法确定重载函数"boost::asio::io_service::run"的哪个实例
- C++:在Boost MultiIndex的使用中确定指针类型的类
- boost::ptr_vector with arrays:我能确定它的析构函数调用delete[]而不是delete吗
- 如何使用boost is_class来确定对象是否为类
- 如何从boost::spirit::lex令牌确定行/列号
- c++ boost unordered_map -确定key是否存在于容器中
- 如何使用Boost Filesystem Library v3确定文件是否按路径包含
- 如何确定'std::map'创建的用于'boost::pool_allocator'的节点的大小(以跨平台方式)?